Jak przekazać parametry niestandardowe do PHP z Nginx?


10

Używam Nginx 1.2.4w połączeniu z PHP-FPM 5.4.8z fastcgiprzełęczy i próbuje przekazać parametry niestandardowych PHP. Oto opcje, które znalazłem do tej pory:

  • używając envdyrektywy do ustawienia zmiennej środowiskowej nginxi pobrania jej za pomocą getenv()lub $_ENVz PHP. Problem polega na tym, że envdziała tylko w mainkontekście, podczas gdy muszę ustawić parametr w serverkontekście.

  • używając fastcgi_paramdyrektywy, ponieważ jest do tego przeznaczona.

Próbowałem zmienić wartości niektórych parametrów przy użyciu, fastcgi_paramale nie powiodło się:

nginx:

fastcgi_param PATH_INFO "/var/tmp";

PHP:

Sprawdziłem wszystkie predefiniowane tablice, które mogłem znaleźć:

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

Jedyny do pokazania PATH_INFOto $_SERVER:

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

Ale wartość, którą ustawiłem, nginxnie jest brana pod uwagę.

P1: Czy muszę coś skonfigurować na nginx/phppoziomie, aby fastcgi_paramdyrektywa zaczęła obowiązywać?

P2: Czy fastcgi_paramdyrektywa ogranicza się do wstępnie zdefiniowanej listy parametrów (np. Mogę ustawić PATH_INFOwłasne zmienne niestandardowe, takie jak FOO)?

P3: Jeśli tak do Q2: czy istnieje sposób na przekazanie niestandardowych parametrów do PHP z Nginx?

Odpowiedzi:


14

Możesz przekazać dodatkowe parametry za pomocą dyrektywy fastcgi_param. Jestem pewien, ponieważ skorzystałem z tej funkcjonalności.

Moja przykładowa konfiguracja nginx

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

    location    ~* "\.php$" {
        fastcgi_param CRS "crs";
        include conf/fastcgi-php.conf;
    }                                           
}

I część danych wyjściowych 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

Mam fastcgi.confa fastcgi_paramsjednak nie fastcgi-php.conf: gdzie to masz od? Czy masz coś przeciwko udostępnieniu go za pośrednictwem pastebin?
Maks.

To moja specyficzna konfiguracja, ale nie ma magii: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; a conf / fastcgi.conf zawiera resztę wymaganych parametrów i ustawień fastcgi
Krzysztof Księżyk

Jedyne, o czym mogłem pomyśleć, to to, że podczas kompilacji zapomniałem włączyć coś do konf nginx. Z drugiej strony, nginxw przeszłości zapomniałem o włączeniu różnych rzeczy , ale nginxnie chciałbym mówić, że nie wiedziałem o niektórych dyrektywach, których używałem: tutaj nic, żadnych skarg, ale fastcgi_paramto nie działa: (Spróbuję oryginalnego ubuntu nginxopakowania i zobaczę, jak to będzie.
Max

Tak, działa z domyślnym ubuntu nginxpakietem ...
Max

@ user64204 to zdecydowanie był problem z twoją konfiguracją, a pakiet ubuntu właśnie nadpisał niektóre twoje pliki konfiguracyjne. Ale ponieważ nie pokazałeś nam pełnej konfiguracji, nie ma sposobu, aby ustalić, na czym polegał problem.
VBart

0

Możesz zmodyfikować żądanie, przekazując zmienne niestandardowe do nagłówka żądania, na przykład:

proxy_set_header Variable-name-here Value-here;

Następnie możesz odczytać te wartości z nagłówka żądania w skrypcie PHP.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.