如何将自定义参数从 Nginx 传递给 PHP?

Max*_*Max 11 php nginx fastcgi php-fpm

我正在与passNginx 1.2.4结合使用并尝试将自定义参数传递给. 以下是我目前找到的选项:PHP-FPM 5.4.8fastcgiPHP

  • 使用env指令设置环境变量 innginx并使用getenv()$_ENVfrom获取它PHP。问题是env只在main上下文中操作,而我需要在上下文中设置参数server

  • 使用fastcgi_param专为此设计的指令。

我曾尝试使用更改某些参数的值fastcgi_param但未成功:

nginx:

fastcgi_param PATH_INFO "/var/tmp";
Run Code Online (Sandbox Code Playgroud)

PHP:

我检查了我能找到的所有预定义数组:

echo '<pre>';
echo "\n".'$GLOBALS'."\n"; var_dump($GLOBALS);
echo "\n".'$_SERVER'."\n"; var_dump($_SERVER);
echo "\n".'$_GET'."\n"; var_dump($_GET);
echo "\n".'$_POST'."\n"; var_dump($_POST);
echo "\n".'$_FILES'."\n"; var_dump($_FILES);
echo "\n".'$_REQUEST'."\n"; var_dump($_REQUEST);
echo "\n".'$_SESSION'."\n"; var_dump($_SESSION);
echo "\n".'$_ENV'."\n"; var_dump($_ENV);
echo "\n".'$_COOKIE'."\n"; var_dump($_COOKIE);
echo "\n".'$php_errormsg'."\n"; var_dump($php_errormsg);
echo "\n".'$HTTP_RAW_POST_DATA'."\n"; var_dump($HTTP_RAW_POST_DATA);
echo "\n".'$http_response_header'."\n"; var_dump($http_response_header);
echo "\n".'$argc'."\n"; var_dump($argc);
echo "\n".'$argv'."\n"; var_dump($argv);
echo '</pre>';
Run Code Online (Sandbox Code Playgroud)

唯一显示的PATH_INFO$_SERVER

var_dump($_SERVER); // ["PATH_INFO"]=> string(0) ""
Run Code Online (Sandbox Code Playgroud)

但是nginx没有考虑我设置的值。

Q1:我需要在nginx/php级别配置任何东西才能使fastcgi_param指令生效吗?

Q2:fastcgi_param指令是否仅限于预定义的参数列表(例如,我可以设置PATH_INFO但不能设置我自己的自定义变量,例如FOO)?

Q3:如果是 Q2:有没有办法从 Nginx 将自定义参数传递给 PHP?

Krz*_*żyk 15

您可以通过 fastcgi_param 指令传递其他参数。我确定是因为我使用了这个功能。

我的典型 nginx 配置

server {
    server_name localhost;
    include     conf/defaults.conf;
    root        /var/www;

    location    ~* "\.php$" {
        fastcgi_param CRS "crs";
        include conf/fastcgi-php.conf;
    }                                           
}
Run Code Online (Sandbox Code Playgroud)

以及 phpinfo() 输出的一部分:

...
_SERVER["USER"] fcgi
_SERVER["HOME"] /dev/null
_SERVER["FCGI_ROLE"]    RESPONDER
_SERVER["REMOTE_USER"]  no value
_SERVER["CRS"]  crs
_SERVER["QUERY_STRING"] no value
Run Code Online (Sandbox Code Playgroud)