我正在尝试测试访问 POST 参数的 php 脚本是否正常工作,但遇到了麻烦。访问 $_POST 数组返回零值(见下文)。
首先我在 bash 中运行curl:
curl -v -X POST http://example.com/test.php -H 'Content-Type: application/x-www-form-urlencoded' -d 'name=bob&id=5'
test.php 脚本是:
#!/usr/bin/php-cgi
<?php
errort_reporting(E_ALL);
ini_set('display_errors', 1);
echo $_SERVER['REQUEST_METHOD'] . "\n';
echo $_POST['name'] . "\n";
echo var_dump($_POST);
那么curl的输出是:
* Trying 12.34.567.89:80
* TCP_NODELAY set
* Connected to 12.34.567.89 (12.34.567.89) port 80 (#0)
> POST /test.php HTTP/1.1
> Host: 12.34.567.89
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Length: 16
> Content-Type: application/x-www-form-urlencoded
>
* upload completely sent off: 16 out of 16 bytes
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Date: Sun, 23 Jul 2023 12:34:56 GMT
< Server: Apache/2.4.54 (Unix)
< Transfer-Encoding: chunked
<
POST
Notice: Undefined index: name in /test.php on line 11
array(0) {
}
* transfer closed with outstanding read data remaining
* closing connection 0
curl: (18) transfer closed with outstanding read data remaining
我在本地复制了这个问题。修剪我的 apache .config 文件后,问题仍然存在。配置文件是
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgid_module modules/mod_cgid.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
ServerAdmin [email protected]
ServerName www.example.com:80
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/srv/apache/htdocs"
<Directory "/srv/apache/htdocs">
AllowOverride None
Require all granted
</Directory>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/srv/apache/cgi-bin/"
</IfModule>
<Directory "/srv/apache/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
访问日志显示
12.34.567.89 - - [23/Jul/2023:17:35:47 +0000] "POST /cgi-bin/test.php HTTP/1.1" 200 846
错误日志显示
[Sun Jul 23 17:35:47.188923 2023] [core:error] [pid 3608972:tid 140226028996352] (104)Connection reset by peer: [client 12.34.567.89:34618] AH00574: ap_content_length_filter: apr_bucket_read() failed
我在 Apache 中将 PHP 作为 CGI 编译器运行。二进制信息是
/usr/bin/php --version
PHP 7.4.3-4ubuntu2.18 (cli) (built: Feb 23 2023 12:43:23) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0 copyright (c) Zend Technologies
with Zend OPache v7.4.3-4ubuntu2.18, Copyright (c), by Zend Technologies
在我看来,请求已到达正确的终点,但主体尚未到达那里。基于此,我认为我的 apache 配置中的某些内容可能没有传递信息(也许mod_rewrite
?).
我尝试过改变'Content-Type'
to 'form-data'
并改变'-d'
选项值到 .json'{"name":"bob","id":5}'
但这给出了与上面相同的结果。
我在 Linux 上运行 Apache。我在网上读到,可能是 Apache 的 mod_rewrite 导致了问题,所以我尝试直接访问 .php 脚本,但这给出了与上面相同的输出。
这是我第一次处理 POST 请求,我不确定问题出在哪里。任何指出解决方案的帮助将不胜感激。解释原因也会有所帮助。
EDIT
我注意到error_log
以上特点[client 12.34.567.89:52546]
我不确定端口52546
应该参与。我已多次尝试在端口 80 上显式请求 - 每次端口号[client ip:port]
变化。有谁知道这可能是什么,或者是否可能是问题所在?