【问题标题】:Why would $_GET['a'] not be populated when $_SERVER['QUERY_STRING'] contains 'a=foo'? [duplicate]当 $_SERVER['QUERY_STRING'] 包含 'a=foo' 时,为什么不会填充 $_GET['a']? [复制]
【发布时间】:2019-09-12 13:16:59
【问题描述】:

使用这个 php 脚本,通过 nginx 下的 fastcgi 调用。不使用特定于 php 的 fastcgi 模块,只是像任何其他 unix 可执行文件一样调用它:

#!/usr/bin/php
<?php
echo "HTTP/1.1 200 OK\r\n\r\n";
echo 'Hello world'; echo "\n";
echo $_GET['a']; echo "\n";
echo $_SERVER['QUERY_STRING']; echo "\n";
echo $_SERVER['REQUEST_URI'];
echo "\n_GET\n";
while (list($var,$value) = each ($_GET)) {
    echo "$var => $value <br />\n";
}
?>

该脚本在文档根目录下名为api/example。我发送此请求:

GET /api/example?a=foo HTTP/1.1

并得到这个响应:

Hello world

a=foo
/api/example?a=foo
_GET

即。 php 已按预期初始化 $_SERVER['QUERY_STRING']$_SERVER['REQUEST_URI'] - 这表明参数正在通过 nginx/fastcgi 层传递 - 但 $_GET['a'] 仍未初始化,实际上 $_GET 关联数组完全为空?为什么?

我正在运行 PHP 5.3.29。我将 php.ini 中的 request_order 调整为 ESGP(从默认的 GP)尝试解决此问题,但我认为这无关紧要——除此之外,它是一个标准配置。

【问题讨论】:

  • 你的 location / 配置在你的 nginx 配置中是什么样子的?
  • 好的,将#!/usr/bin/php 更改为#!/usr/bin/php-cgi 确实解决了我的问题,但副本并没有真正解决[非常具体的] 问题或帮助理解php 在做什么。尽我所能告诉php-cgi 使用不同的“SAPI”模块运行,该模块具有不同的副作用。但令人困惑的是,在命令行上模拟 cgi 环境不起作用,例如:命令行上的 QUERY_STRING='a=foo' REQUEST_URI='/api/example?a=foo' php-cgi ./example 会导致与上述相同的症状。

标签: php nginx fastcgi


【解决方案1】:

Get 用于 http 样式的请求,这看起来是作为 cli 运行的。 如果要使用 cli 传递参数,请查看 $argv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-02-13
    • 2012-02-20
    相关资源
    最近更新 更多