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


10

我与通行证Nginx 1.2.4结合使用PHP-FPM 5.4.8fastcgi并尝试将自定义参数传递给PHP。这是我到目前为止找到的选项:

  • 使用env指令在中设置环境变量nginx并通过getenv()$_ENV从中获取环境变量PHP。问题是env仅在main上下文中运行,而我需要在上下文中设置参数server

  • fastcgi_param为此使用指令。

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

nginx:

fastcgi_param PATH_INFO "/var/tmp";

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>';

唯一显示的PATH_INFO$_SERVER

var_dump($_SERVER); // ["PATH_INFO"]=> string(0) ""

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

Q1:我需要在nginx/php级别上配置任何内容以使fastcgi_param指令生效吗?

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

问题3:如果问题2:是,是否可以将自定义参数从Nginx传递给PHP?

Answers:


14

您可以通过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;
    }                                           
}

以及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

我有fastcgi.conffastcgi_params,但不fastcgi-php.conf:你从哪儿得到它?您介意通过pastebin共享它吗?
2012年

这是我的特定配置,但没有魔术: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; conf / fastcgi.conf包含其余fastcgi必需的参数和设置
KrzysztofKsiężyk2012年

我唯一想到的就是编译时忘记在conf中包含某些内容nginx。另一方面,我忘记nginx了过去在编译时要包含的内容,但是nginx会拒绝开始说它不知道我正在使用的某些指令:这里什么也没有,没有任何抱怨,但是那fastcgi_param是行不通的: (我将尝试使用原始ubuntu nginx程序包,并查看其运行过程
Max

是的,它正在使用默认ubuntu nginx软件包...
2012年

@ user64204这绝对是您的配置问题,并且ubuntu软件包只是覆盖了您的某些配置文件。但是,由于您没有向我们展示您的完整配置,因此无法确定实际问题所在。
VBart 2012年

0

您可以通过在请求标头中传递自定义变量来修改请求,例如:

proxy_set_header Variable-name-here Value-here;

然后,您可以从PHP脚本中的请求标头中读取这些值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.