Come passare parametri personalizzati a PHP da Nginx?


10

Sto usando Nginx 1.2.4in combinazione con PHP-FPM 5.4.8un fastcgipassaggio e sto cercando di passare parametri personalizzati a PHP. Ecco le opzioni che ho trovato finora:

  • usando la envdirettiva per impostare una variabile d'ambiente nginxe recuperarla con getenv()o $_ENVda PHP. Il problema è che envfunziona solo nel maincontesto, mentre ho bisogno di impostare il parametro nel servercontesto.

  • usando la fastcgi_paramdirettiva come è progettato per quello.

Ho provato a modificare i valori di alcuni parametri utilizzando fastcgi_paramma non è riuscito:

nginx:

fastcgi_param PATH_INFO "/var/tmp";

PHP:

Ho controllato tutti gli array predefiniti che ho trovato:

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

L'unico da mostrare PATH_INFOera $_SERVER:

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

Ma il valore che ho impostato nginxnon viene preso in considerazione.

Q1: Devo configurare qualcosa a nginx/phplivello affinché la fastcgi_paramdirettiva abbia effetto?

Q2: la fastcgi_paramdirettiva è limitata a un elenco predefinito di parametri (ad es. Posso impostare PATH_INFOma non variabili personalizzate come ad esempio FOO)?

Q3: Se sì a Q2: c'è un modo per passare parametri personalizzati a PHP da Nginx?

Risposte:


14

È possibile passare parametri aggiuntivi tramite la direttiva fastcgi_param. Sono sicuro perché ho usato questa funzionalità.

La mia configurazione nginx esemplare

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

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

E parte dell'output di 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

Ho fastcgi.confe fastcgi_paramsno fastcgi-php.conf: da dove l'hai preso? Ti dispiace condividerla tramite pastebin?
Max

È la mia configurazione specifica ma non c'è magia: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; e conf / fastcgi.conf contiene il resto dei parametri e delle impostazioni richiesti da fastcgi
Krzysztof Księżyk

L'unica cosa che mi viene in mente è che ho dimenticato di includere qualcosa nella conf durante la compilazione nginx. D'altra parte, ho dimenticato di includere le cose durante la compilazione nginxin passato, ma mi nginxrifiuterei di iniziare a dire che non sapeva di alcune direttive che stavo usando: qui niente, nessuna lamentela, ma tuttavia fastcgi_paramnon funziona: (Proverò il ubuntu nginxpacchetto originale e vedrò come va.
Max

Sì, funziona con il ubuntu nginxpacchetto predefinito ...
Max

@ user64204 questo è stato sicuramente un problema con la tua configurazione, e il pacchetto Ubuntu ha appena sovrascritto alcuni dei tuoi file di configurazione. Ma dal momento che non ci hai mostrato la tua configurazione completa, non c'è modo di determinare quale fosse effettivamente il problema.
Vart

0

È possibile modificare la richiesta passando le variabili personalizzate nell'intestazione della richiesta, ad esempio:

proxy_set_header Variable-name-here Value-here;

E poi puoi leggere quei valori dall'intestazione della richiesta nel tuo script PHP.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.