php - 获取 Query_String 被截断 - Apache access.log 具有完整字符串,error.log 显示截断符号 QUERY_STRING 值
问题描述
用户将 100 多个单独的数字字符串粘贴到文本框中以提交查询。前端 Web 服务器是 Ubuntu 18.04 LTS 服务器,带有 Apache 2.4.29 和 Php 7.2.19。提交后,数据通过 Post 查询字符串(一点也不理想)传送到运行 Apache 2.0.63 的后端 Web 服务器。后端 Apache 服务器具有 C 代码 CGI,它使用数据进行查询。
前端 Apache 服务器曾经是运行 Ubuntu 7.1、PHP 5.2 和 Apache 2.2 的物理机。它现在是在 VMware ESXi 6.7 上完全重建的系统。后端服务器保持不变。
问题是这个非常长的查询字符串过去完全没有截断。在新的前端系统上,它被截断为 790 个字符。
什么可能导致这种截断?
发送 Apache 服务器上的 Wireshark 显示完整的未截断字符串。接收 Apache 服务器上的访问日志显示完整的未截断字符串。但是,接收 Apache 服务器上的错误日志显示:
截断符号 QUERY_STRING 值:后跟完整的字符串,除了有一个 PIPE SYMBOL | 就在 790 个字符之后。为什么是这样?
后端服务器的 CGI 代码输入了打印语句来显示字符串,输出的是截断的 790 个字符的字符串。我在发送和接收 Apache 服务器的 apache2.conf 中将 LimitRequestLine 和 LimitRequestFieldSize 设置为 8190。在 php.ini 中将 Php Max_Post_size 设置为 1024M。
这是PHP代码:
<?php
header("content-type: application/xml");
if ($_POST) {
$params = "";
$parameter = 0;
foreach ($_POST as $key => $value) {
$parameter++;
switch ($parameter) {
case 1:
$params = $value;
break;
case 2:
$params = $params."?".$key."=".urlencode($value);
break;
default:
$params = $params."&".$key."=".urlencode($value);
break;
}
}
} else {
$params = $_SERVER["QUERY_STRING"];
}
$request = "http://192.168.xxxxxxx/cgi-bin/".$params;
$result = @join (@file($request), "");
$result = str_replace(array("\n", "\r"), "", $result);
echo $result;
?>
这是后端服务器上的 C 代码。我引用处理该代码的人的话:
它只是从查询字符串所在的位置获取指针并将其传递给 C 代码字符指针。然后得到它的长度。不需要在 C 中设置缓冲区。
因此字符串长度为 970。
char *buf;
long buflen;
buf = getenv("QUERY_STRING");
buflen = (long)strlen(buf);
正如 CGI 程序在每次发布后看到的那样,编码的字符串被截断为 790 个字符。这是由于 Apache 版本、PHP 版本的变化、Apache 从前端到后端的不匹配还是其他原因?
解决方案
推荐阅读
- swift - 从隐藏的选项卡视图控制器单击后退按钮时如何显示选项卡
- delphi - 是否可以将 Form.Width 设置为 10000 像素?
- dynamics-crm - Dynamics 365:如何在操作/工作流中连接/组合字符串
- javascript - 使用 ajax 使用 php mysqli 更新模态表单上的数据
- javascript - 如何将数据附加到按钮?
- c# - C# 控件不进入方法
- php - 为什么当用户点击“发送”时没有出现任何错误但页面也没有刷新?
- java - 如何使用 Redis Spring Data 将两个值附加到一个键
- c# - 抛出异常:System.Xml.dll 中的“System.Xml.XPath.XPathException”
- python - 机器学习中的过度拟合术语