PHP $_POST 数组为空,Apache 和 PHP 7.4 (CLI/CGI)

2023-12-14

我正在尝试测试访问 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]变化。有谁知道这可能是什么,或者是否可能是问题所在?


一些好消息和一些坏消息。首先,在命令行上使用curl 测试POST 请求是一个很好的方法,但是要充分了解它,这样您就不会在那里而不是在服务器端寻找问题。

curl(1) 发送 POST 请求-d 'name=bob&id=5'和单独的 URL。你不必尝试-X ... or -H ...。这也是你注意到的,这没有任何区别。保持更简单,这样你就不需要猜测:

curl -d 'name=bob&id=5' http://example.com/test.php

(也可以把网址放在前面,这只是我的习惯,我把它放在后面-...选项及其参数,因为 URL 是一个位置参数 [您可以添加多个])

坏消息可能是您正在针对错误的服务器进行测试。

echo $_SERVER['REQUEST_METHOD'];
echo $_POST['name'];

永远无法生成

POST
array(0) {}

即使它实际上很相似,但使用 var_dump(),您所讨论的curl 命令行确实可以工作。

现在,这是在命令行上使用curl(1)来测试这些东西的好处:您可以轻松地inspect发生了什么,至少从客户端来看。开关是-v如果您将其添加到组合中,您将看到有关连接的详细信息(*), 数据发送到服务器>以及正在接收的数据<- 在响应本身旁边。

Example:

$ curl -v http://localhost:8080/ -d 'name=bob&id=5'
*   Trying 127.0.0.1:8080...
* Connected to localhost (127.0.0.1) port 8080 (#0)
> POST / HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.81.0
> Accept: */*
> Content-Length: 13
> Content-Type: application/x-www-form-urlencoded
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Host: localhost:8080
< Date: Sat, 22 Jul 2023 11:35:53 GMT
< Connection: close
< X-Powered-By: PHP/8.2.8
< Content-type: text/html; charset=UTF-8
< 
POST
bob
array(0) {
}
* Closing connection 0

The index.php本例中使用的文件:

<?php

echo $_SERVER['REQUEST_METHOD'], "\n";
echo $_POST['name'], "\n";
var_dump($_POST);

以及如何在与index.php相同的目录中启动PHP开发服务器:

$ php8.2 -n -S localhost:8080
[Sat Jul 22 13:35:29 2023] PHP 8.2.8 Development Server (http://localhost:8080) started
[Sat Jul 22 13:35:53 2023] 127.0.0.1:35642 Accepted
[Sat Jul 22 13:35:53 2023] 127.0.0.1:35642 [200]: POST /
[Sat Jul 22 13:35:53 2023] 127.0.0.1:35642 Closing

(在不同的终端中打开它,然后你就可以跟踪curl和PHP)

开发网络服务器可以帮助您检查测试程序是否有效,因此您也可以排除某些部分。

但这不是必需的,我只是这样做来重现您的问题(并且失败了;))。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP $_POST 数组为空,Apache 和 PHP 7.4 (CLI/CGI) 的相关文章

  • Smarty输出空白页

    已解决 模板文件错误 我有这样的 Smarty 设置 require once smarty Smarty class php smarty new Smarty smarty gt compile dir compile dir smar
  • 如何在 Laravel 查询中使用多个 OR,AND 条件

    我需要 Laravel 查询帮助 我的自定义查询 返回正确结果 Select FROM events WHERE status 0 AND type public or type private 如何写这个查询Laravel Event w
  • 重写规则,以便正确加载具有绝对路径的 css 和 js 文件

    我花了两个小时 但我无法弄清楚 我不知道如何谷歌解决方案 这是我在 htaccess 文件中的重写规则 RewriteCond REQUEST URI blog RewriteRule blog http localhost 2368 1
  • 在值中包含换行符

    我有一个 Word 模板 其中 php 代码中定义了值 在PHP代码中 document gt setValue Value1 value1 在word模板中 Value1 如何将包含两个值之间的断线的值包含在单词的值中 Replace n
  • PHP - 获取base64图像字符串解码并保存为jpg(生成空图像)

    嗨 我实际上是通过 ajax 发送一个 base64 图像字符串到一个 php 脚本 该脚本只是解码字符串并将内容保存为 jpg 文件 但结果是一张空图像 这怎么可能 PHP脚本 uploadedPhotos array photo 1 p
  • 如何使用 Facebook SDK API 为页面/网址“点赞”?

    我正在使用这段代码 facebook gt api me likes post array url gt http www google com 我收到以下错误 Fatal error Uncaught OAuthException 200
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 在 Laravel 5 中截断表

    描述 我有一个充满测试数据的表 有时 我想清除它以获取新数据 我可以在 DBMS 应用程序中执行截断 例如MySQL 工作台 但我试图在我的应用程序中实现它 Goal 创建一个按钮 单击时截断数据库中的表 这是我的步骤 1 声明一条路线 R
  • 为什么验证不起作用并跳转到另一个页面?

    我写了一个customer display php来验证数据 到目前为止只有名字 但无论名字字段是否为空 网页都会跳转到customer search php并且没有更改数据库中的信息 为什么
  • 强制 Apache HTTPD 以 32 位运行

    我通过从二进制文件 以及 ppc 部分 中剥离 32 位架构 以 64 位模式运行 Apache HTTPD 我这样做是为了使其与 python 和 mysql 更加兼容 然而 我有另一台机器需要它以 32 位模式运行 它仍然保留所有四种原
  • 如何使用 Twig 的属性函数访问嵌套对象属性

    我试图使用一个树枝变量来访问另一个树枝变量的属性 直到我找到 属性 函数为止 该变量才起作用 除了需要访问嵌套属性的情况外 效果很好 当包含属性的变量实际上是对象 属性时 它不起作用 例如 attribute object1 variabl
  • Magento - 检查 cms 页面

    我想通过 php 检查页面是否是 Magento 中的 cms page 我需要不同的 cms 页面面包屑 所以我尝试在一个条件下做到这一点 但我不知道如何或在哪里查看 到目前为止 这是我的 breadcrumbs phtml p some
  • 语法错误,第 288 行出现意外的“endif”(T_ENDIF)[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我一直在离线处理我的 WordPress 网站的此代码错误 解析错误 语法错误 homez 541 photoher marie
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Joomla 页面中的自定义 php 代码

    我正在尝试将 Joomla 1 5 9 页面中的表源从页面中的硬编码 html 更改为从 SQL 数据库获取信息 执行此操作的正确方法是什么 创建一个新的模型或组件并以某种方式在页面中使用它 我找到了这些 http docs joomla
  • URL 中的 %2F 中断并且未引用所需的 .php 文件 [重复]

    这个问题在这里已经有答案了 我需要将 作为变量作为 URL 的一部分传递 我的结构如下所示 www domain com listings page 1 city Burnaby South type Townhome bedroom 2
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • php curl 使用 GET 发送变量 奇怪的结果

    我正在尝试调用远程站点上页面中的网址 决定使用curl 在远程站点上 url 变量显示为 REQUEST Array var1 gt val1 amp var2 gt val2 amp var3 gt val3 被调用的url是 http
  • 如何在laravel中注册后自动登录

    我在 laravel 中注册用户时遇到问题 user假设是包含所有数组元素的数组 同时自动登录以下代码结果false 数据库中保存的密码是hash make password user id this gt user model gt ad
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio

随机推荐