Comment passer des paramètres personnalisés à PHP depuis Nginx?

10

J'utilise Nginx 1.2.4en combinaison avec PHP-FPM 5.4.8une fastcgipasse et j'essaie de passer des paramètres personnalisés à PHP. Voici les options que j'ai trouvées jusqu'à présent:

  • en utilisant la envdirective pour définir une variable d'environnement dans nginxet la récupérer avec getenv()ou $_ENVdepuis PHP. Le problème est que envne fonctionne que dans le maincontexte alors que je dois définir le paramètre dans le servercontexte.

  • en utilisant la fastcgi_paramdirective telle qu'elle est conçue pour cela.

J'ai essayé de changer les valeurs de certains paramètres en utilisant fastcgi_parammais n'a pas réussi:

nginx:

fastcgi_param PATH_INFO "/var/tmp";

PHP:

J'ai vérifié tous les tableaux prédéfinis que j'ai pu trouver:

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

Le seul à montrer PATH_INFOétait $_SERVER:

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

Mais la valeur que j'ai définie nginxn'est pas prise en compte.

Q1: Dois-je configurer quoi que ce soit au nginx/phpniveau pour que la fastcgi_paramdirective prenne effet?

Q2: La fastcgi_paramdirective se limite-t-elle à une liste prédéfinie de paramètres (par exemple, je peux définir PATH_INFOmes propres variables mais pas de telles, par exemple FOO)?

Q3: Si oui à Q2: existe-t-il un moyen de passer des paramètres personnalisés à PHP depuis Nginx?

Max
la source

Réponses:

14

Vous pouvez passer des paramètres supplémentaires via la directive fastcgi_param. J'en suis sûr car j'ai utilisé cette fonctionnalité.

Ma configuration nginx exemplaire

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

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

Et une partie de la sortie de 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
la source
Je l'ai fastcgi.conf, fastcgi_paramsmais pas fastcgi-php.conf: d'où l'avez-vous obtenu? Cela vous dérange de le partager via pastebin?
Max
C'est ma configuration spécifique, mais il n'y a pas de magie: fastcgi_pass 127.0.0.1:1028; fastcgi_index index.php; include conf/fastcgi.conf; et conf / fastcgi.conf contient le reste des paramètres et paramètres requis par fastcgi
Krzysztof Księżyk
La seule chose à laquelle je pouvais penser, c'est que j'avais oublié d'inclure quelque chose dans la conf lors de la compilation nginx. D'un autre côté, j'ai oublié d'inclure des choses lors de la compilation nginxdans le passé, mais nginxje refuserais de commencer à dire qu'il ne connaissait pas certaines directives que j'utilisais: ici rien, rien à redire, mais cela fastcgi_paramne fonctionne pas: (Je vais essayer le ubuntu nginxpackage d' origine et voir comment ça se passe.
Max
Oui, cela fonctionne avec le ubuntu nginxpackage par défaut ...
Max
@ user64204 c'était définitivement un problème avec votre configuration, et le paquet ubuntu a juste écrasé certains de vos fichiers de configuration. Mais puisque vous ne nous avez pas montré votre configuration complète, il n'y a aucun moyen de déterminer quel était réellement le problème.
VBart
0

Vous pouvez modifier la demande en passant vos variables personnalisées dans l'en-tête de la demande, exemple:

proxy_set_header Variable-name-here Value-here;

Et puis vous pouvez lire ces valeurs à partir de l'en-tête de la demande dans votre script PHP.

Mahmoud Zalt
la source