Як передати користувацькі параметри до 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, не враховується.

Q1: Чи потрібно конфігурувати що-небудь на 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

Єдине, про що я міг придумати, це те, що я забув включити щось у конф 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.