Como passar parâmetros personalizados para PHP a partir do Nginx?

10

Estou usando Nginx 1.2.4em combinação com PHP-FPM 5.4.8um fastcgipasse e tentando passar parâmetros personalizados para PHP. Aqui estão as opções que encontrei até agora:

  • usando a envdiretiva para definir uma variável de ambiente nginxe buscá-la com getenv()ou $_ENVde PHP. O problema é que envsó opera no maincontexto, enquanto eu preciso definir o parâmetro no servercontexto.

  • usando a fastcgi_paramdiretiva como foi projetada para isso.

Eu tentei alterar os valores de alguns parâmetros usando, fastcgi_parammas não obtive êxito:

nginx:

fastcgi_param PATH_INFO "/var/tmp";

PHP:

Eu verifiquei todas as matrizes 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>';

O único a mostrar PATH_INFOfoi $_SERVER:

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

Mas o valor que defini nginxnão é levado em consideração.

P1: Preciso configurar algo no nginx/phpnível para que a fastcgi_paramdiretiva entre em vigor?

P2: A fastcgi_paramdiretiva está limitada a uma lista predefinida de parâmetros (por exemplo, eu posso definir, PATH_INFOmas não variáveis ​​personalizadas próprias como FOO)?

Q3: Se sim para o Q2: existe uma maneira de passar parâmetros personalizados para o PHP a partir do Nginx?

Máx.
fonte

Respostas:

14

Você pode passar parâmetros adicionais via diretiva fastcgi_param. Tenho certeza porque usei essa funcionalidade.

Minha configuração nginx exemplar

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

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

E parte da saída 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
fonte
Eu tenho fastcgi.confe fastcgi_paramsnão fastcgi-php.conf: de onde você tirou isso? Você se importa de compartilhá-lo via pastebin?
Max
É a minha configuração específica, mas não há mágica: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; e o conf / fastcgi.conf contém o restante dos parâmetros e configurações necessários do fastcgi
Krzysztof Księżyk
A única coisa em que pude pensar é que esqueci de incluir algo no conf ao compilar nginx. Por outro lado, esqueci-me de incluir coisas ao compilar nginxno passado, mas me nginxrecusaria a começar a dizer que não sabia sobre algumas diretrizes que eu estava usando: aqui nada, sem queixas, mas ainda assim fastcgi_paramnão está funcionando: (Vou tentar a ubuntu nginxembalagem original e ver como ela vai. #
15/11/12 Max
Sim, ele está trabalhando com o padrão ubuntu nginxpacote ...
Max
@ user64204 isso definitivamente foi um problema com a sua configuração, e o pacote ubuntu apenas substituiu alguns dos seus arquivos de configuração. Mas como você não nos mostrou sua configuração completa, não há como determinar qual era realmente o problema.
VBart #
0

Você pode modificar a solicitação passando suas variáveis ​​personalizadas no cabeçalho da solicitação, exemplo:

proxy_set_header Variable-name-here Value-here;

E então você pode ler esses valores no cabeçalho da solicitação no seu script PHP.

Mahmoud Zalt
fonte