Как передать пользовательские параметры в PHP из Nginx?


10

Я использую Nginx 1.2.4в сочетании с PHP-FPM 5.4.8с fastcgiперевалом и пытаюсь передать пользовательские параметры 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не принимается во внимание.

В1: Нужно ли что-то настраивать на nginx/phpуровне, чтобы fastcgi_paramдиректива вступила в силу?

Q2: fastcgi_paramограничена ли директива предопределенным списком параметров (например, я могу устанавливать, PATH_INFOно не свои собственные переменные, такие как FOO)?

Q3: Если да, то Q2: есть ли способ передать пользовательские параметры в PHP из Nginx?

Ответы:


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.confи , fastcgi_paramsно не fastcgi-php.conf: где вы получили его от? Вы не против поделиться им через pastebin?
Макс

Это мой конкретный конфиг, но в этом нет никакой магии: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; и conf / fastcgi.conf содержит остальные необходимые для fastcgi параметры и настройки
Krzysztof Księżyk

Единственное, о чем я мог подумать, это то, что я забыл включить что-то в conf при компиляции nginx. С другой стороны, я забыл включить вещи при компиляции nginxв прошлом, но nginxотказался бы начать говорить, что не знал о некоторых директивах, которые я использовал: здесь ничего нет, никаких жалоб, но пока это fastcgi_paramне работает: (Я попробую оригинальную ubuntu nginxупаковку и посмотрю, как она идет.
Макс

Да, он работает с ubuntu nginxпакетом по умолчанию ...
Макс

@ user64204 это определенно была проблема с вашей конфигурацией, и пакет ubuntu просто перезаписал некоторые ваши файлы конфигурации. Но так как вы не показали нам свою полную конфигурацию, нет способа определить, в чем на самом деле была проблема.
VBart

0

Вы можете изменить запрос, передав свои пользовательские переменные в заголовок запроса, например:

proxy_set_header Variable-name-here Value-here;

И тогда вы можете прочитать эти значения из заголовка запроса в вашем скрипте PHP.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.