Wie übergebe ich benutzerdefinierte Parameter von Nginx an PHP?

10

Ich verwende Nginx 1.2.4in Kombination mit PHP-FPM 5.4.8einem fastcgiPass und versuche, benutzerdefinierte Parameter an zu übergeben PHP. Hier sind die Optionen, die ich bisher gefunden habe:

  • Verwenden der envDirektive, um eine Umgebungsvariable festzulegen nginxund mit getenv()oder $_ENVvon abzurufen PHP. Das Problem ist, dass envnur im mainKontext gearbeitet wird, während ich den Parameter im serverKontext setzen muss.

  • Verwenden der fastcgi_paramRichtlinie, wie sie dafür ausgelegt ist.

Ich habe versucht, die Werte einiger Parameter mit zu ändern fastcgi_param, war jedoch nicht erfolgreich:

Nginx:

fastcgi_param PATH_INFO "/var/tmp";

PHP:

Ich habe alle vordefinierten Arrays überprüft, die ich finden konnte:

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

Der einzige zu zeigen PATH_INFOwar $_SERVER:

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

Der von mir eingestellte Wert nginxwird jedoch nicht berücksichtigt.

Frage 1: Muss ich irgendetwas auf nginx/phpEbene konfigurieren, damit die fastcgi_paramRichtlinie wirksam wird?

F2: Ist die fastcgi_paramDirektive auf eine vordefinierte Liste von Parametern beschränkt (z. B. kann PATH_INFOich eigene , aber keine benutzerdefinierten Variablen festlegen , z. B. FOO)?

F3: Wenn ja zu Q2: Gibt es eine Möglichkeit, benutzerdefinierte Parameter von Nginx an PHP zu übergeben?

Max
quelle

Antworten:

14

Sie können zusätzliche Parameter über die Direktive fastcgi_param übergeben. Ich bin mir sicher, weil ich diese Funktion genutzt habe.

Meine beispielhafte Nginx-Konfiguration

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

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

Und ein Teil der Ausgabe von 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
Krzysztof Księżyk
quelle
Ich habe fastcgi.confund fastcgi_paramsaber nicht fastcgi-php.conf: Woher hast du es? Haben Sie etwas dagegen, es über Pastebin zu teilen?
Max
Es ist meine spezifische Konfiguration, aber es gibt keine Magie: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; und conf / fastcgi.conf enthält den Rest der für fastcgi erforderlichen Parameter und Einstellungen
Krzysztof Księżyk
Das einzige, woran ich denken konnte, war, dass ich beim Kompilieren vergessen hatte, etwas in die conf aufzunehmen nginx. Andererseits habe ich nginxin der Vergangenheit vergessen, Dinge beim Kompilieren nginxeinzubeziehen, wollte aber nicht sagen, dass es nichts über einige von mir verwendete Anweisungen wusste: hier nichts, keine Beschwerden, aber das fastcgi_paramfunktioniert noch nicht: (Ich werde versuchen, das Originalpaket ubuntu nginxund sehen, wie es geht.
Max
Ja, es funktioniert mit dem Standardpaket ubuntu nginx...
Max
@ user64204 Dies war definitiv ein Problem mit Ihrer Konfiguration, und das Ubuntu-Paket hat gerade einige Ihrer Konfigurationsdateien überschrieben. Da Sie uns jedoch nicht Ihre vollständige Konfiguration angezeigt haben, können Sie nicht feststellen, wo das Problem tatsächlich lag.
VBart
0

Sie können die Anforderung ändern, indem Sie Ihre benutzerdefinierten Variablen im Anforderungsheader übergeben. Beispiel:

proxy_set_header Variable-name-here Value-here;

Und dann können Sie diese Werte aus dem Anforderungsheader in Ihrem PHP-Skript lesen.

Mahmoud Zalt
quelle