1 votes

NGINX : routage vers index.php à l'intérieur d'un alias pour un composant de chemin spécifique avec une chaîne de requête

C'est une application héritée (Zend framework 1), nous passons d'apache à nginx. Nous avons un contrôleur frontal qui dispatche vers un contrôleur/action spécifique en fonction de l'URI de la requête.

Exigence

 1. www.example.com         --> /home/user/www/public/index.php
 2. www.example.com/a/b     --> /home/user/www/public/index.php
 3. www.example.com/api     --> /home/user/api/public/index.php
 4. www.example.com/api/a/b --> /home/user/api/public/index.php
 5. www.example.com/api/a/b?x=1 --> /home/user/api/public/index.php

Configuration actuelle

    location /api {
            alias /home/user/api/public/;
            try_files $uri /api/index.php;
             location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include /etc/nginx/fastcgi_params;
            }           

}

Voici ce que les scripts PHP reçoivent

array
(
    [USER] => www-data
    [HOME] => /var/www
    [FCGI_ROLE] => RESPONDER
    [SCRIPT_FILENAME] => /home/user/api/public//index.php
    [QUERY_STRING] => 
    [REQUEST_METHOD] => GET
    [CONTENT_TYPE] => 
    [CONTENT_LENGTH] => 
    [SCRIPT_NAME] => /api/index.php
    [REQUEST_URI] => /api/account/get?id=1
    [DOCUMENT_URI] => /api/index.php 
...
)

Problème La configuration ci-dessus fonctionne bien. Mais la chaîne de requête est manquante, donc $_GET est vide.

Astuce: Générer $_GET à partir de l'URI de la requête avant que le contrôleur frontal ne dispatche.

$arr = explode("?",$_SERVER['REQUEST_URI']);
if (count($arr) == 2 && count($_GET) == 0){
    parse_str($arr[1], $_GET);
} 

Mais j'aimerais corriger cela au niveau du serveur, veuillez me dire comment passer la chaîne de requête dans ce cas. Merci d'avance.

[MODIFIER] /etc/nginx/fastcgi_params

fastcgi_param   QUERY_STRING            $query_string;
fastcgi_param   REQUEST_METHOD          $request_method;
fastcgi_param   CONTENT_TYPE            $content_type;
fastcgi_param   CONTENT_LENGTH          $content_length;

fastcgi_param   SCRIPT_FILENAME         $request_filename;
fastcgi_param   SCRIPT_NAME             $fastcgi_script_name;
fastcgi_param   REQUEST_URI             $request_uri;
fastcgi_param   DOCUMENT_URI            $document_uri;
fastcgi_param   DOCUMENT_ROOT           $document_root;
fastcgi_param   SERVER_PROTOCOL         $server_protocol;

fastcgi_param   GATEWAY_INTERFACE       CGI/1.1;
fastcgi_param   SERVER_SOFTWARE         nginx/$nginx_version;

fastcgi_param   REMOTE_ADDR             $remote_addr;
fastcgi_param   REMOTE_PORT             $remote_port;
fastcgi_param   SERVER_ADDR             $server_addr;
fastcgi_param   SERVER_PORT             $server_port;
fastcgi_param   SERVER_NAME             $server_name;

fastcgi_param   HTTPS                   $https if_not_empty;

# PHP seulement, requis si PHP a été compilé avec --enable-force-cgi-redirect
fastcgi_param   REDIRECT_STATUS         200;

Configuration complète:

server {
    listen *:80;
    server_name dev.xyz.com;

    # Jeu de caractères
    charset utf-8;

    # Journaux
    access_log /var/log/nginx/access;
    error_log /var/log/nginx/error;

    # Répertoire de documents
    root /home/user/www/src;
    index  index.html index.htm;
    location / {
        try_files $uri $uri/ =404;
    }

    # Pages d'erreur
    error_page 404 /404.html;
    error_page 500 502 503 504 /50x.html;

    location /api/ {
        alias /home/user/api/public/;
        try_files $uri /api/index.php;
         location ~ \.php$ {
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include /etc/nginx/fastcgi_params;
        }

    }

0voto

drookie Points 7850

Vous le manquez parce que vous ne le transmettez pas.

fastcgi_param QUERY_STRING $query_string;

Et, au fait, vous avez besoin du $_SERVER['QUERY_STRING'].

0voto

Michael Hampton Points 232226

Vous devez vérifier que /etc/nginx/fastcgi_params est tel que livré par le vendeur et n'a pas été altéré de quelque manière que ce soit. S'il a été modifié, vous devriez restaurer une copie propre.


Aussi, lorsque vous utilisez alias dans une location, vous devez avoir des barres obliques en correspondance.

Actuellement, vous avez :

    location /api {
            alias /home/user/api/public/;

Mais cela devrait être :

    location /api/ {
            alias /home/user/api/public/;

Sans cela, en fonction de la barre oblique manquante, les URL peuvent avoir des doubles barres obliques (que Linux ne prend pas en compte, mais les applications web pourraient) ou les URL peuvent ne pas avoir de barre oblique du tout (ce qui casse toujours).

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X