¿Cómo pasar parámetros personalizados a PHP desde Nginx?

10

Estoy usando Nginx 1.2.4en combinación con PHP-FPM 5.4.8un fastcgipase e intento pasar parámetros personalizados a PHP. Estas son las opciones que he encontrado hasta ahora:

  • usando la envdirectiva para establecer una variable de entorno nginxy buscarla con getenv()o $_ENVdesde PHP. El problema es que envsolo opera en maincontexto, mientras que necesito establecer el parámetro en servercontexto.

  • usando la fastcgi_paramdirectiva ya que está diseñada para eso.

Intenté cambiar los valores de algunos parámetros usando fastcgi_parampero no tuve éxito:

nginx:

fastcgi_param PATH_INFO "/var/tmp";

PHP:

Revisé todas las matrices predefinidas que pude encontrar:

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

El único que se mostró PATH_INFOfue $_SERVER:

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

Pero el valor que configuré nginxno se tiene en cuenta.

P1: ¿Necesito configurar algo a nginx/phpnivel para que la fastcgi_paramdirectiva surta efecto?

P2: ¿La fastcgi_paramdirectiva está limitada a una lista predefinida de parámetros (p. Ej., Puedo establecer PATH_INFOpero no variables personalizadas propias como FOO)?

P3: En caso afirmativo a P2: ¿hay alguna forma de pasar parámetros personalizados a PHP desde Nginx?

Max
fuente

Respuestas:

14

Puede pasar parámetros adicionales a través de la directiva fastcgi_param. Estoy seguro porque usé esta funcionalidad.

Mi ejemplar configuración nginx

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

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

Y parte de la salida 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
fuente
Tengo fastcgi.confy fastcgi_paramsno fastcgi-php.conf: ¿de dónde lo sacaste? ¿Te importaría compartirlo a través de pastebin?
Max
Es mi configuración específica, pero no hay magia: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; y conf / fastcgi.conf contiene el resto de parámetros y configuraciones requeridas por fastcgi
Krzysztof Księżyk
Lo único que se me ocurre es que olvidé incluir algo en la configuración al compilar nginx. Por otro lado, olvidé incluir cosas al compilar nginxen el pasado, pero me nginxnegaría a comenzar a decir que no sabía sobre algunas directivas que estaba usando: aquí nada, no tengo quejas, pero eso fastcgi_paramno funciona: (Voy a probar el ubuntu nginxpaquete original y veré cómo funciona.
Max
Sí, está funcionando con el ubuntu nginxpaquete predeterminado ...
Max
@ user64204 esto definitivamente fue un problema con su configuración, y el paquete ubuntu simplemente sobrescribió algunos de sus archivos de configuración. Pero como no nos mostró su configuración completa, no hay forma de determinar cuál era realmente el problema.
VBart
0

Puede modificar la solicitud pasando sus variables personalizadas en el encabezado de la solicitud, por ejemplo:

proxy_set_header Variable-name-here Value-here;

Y luego puede leer esos valores desde el encabezado de la solicitud en su script PHP.

Mahmoud Zalt
fuente