NGINX essayer de fichiers + alias directives

J'essaie de servir request to / blog sous-répertoire d'un site avec le code php, situé dans un dossier en dehors du répertoire racine du document. Voici ma configuration d'hôte:

server {
    server_name  local.test.ru;
    root   /home/alex/www/test2;

    location /blog {
        alias   /home/alex/www/test1;
        try_files $uri $uri/ /index.php$is_args$args;

        location ~ .php$ {
            fastcgi_split_path_info ^(/blog)(/.*)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
        }
    }
}

Et je reçois des demandes comme

Wget -O - http://local.test.ru/blog/nonExisting

Juste un code d'indice.fichier php de/home/alex/www/ test2 / dossier.

Cependant, cette configuration:

server {
    server_name  local.test.ru;
    root   /home/alex/www/test2;

    location /blog {
        alias   /home/alex/www/test1;
        try_files $uri $uri/ /blog$is_args$args;
        index index.php;

        location ~ .php$ {
            fastcgi_split_path_info ^(/blog)(/.*)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
        }
    }
}

Me donne l'index.fichier html à partir de /home/alex/www/test2/. Merci de me donner un indice - pourquoi? Et comment puis-je forcer NGINX à traiter /home/alex/www/test1/index.php à la place?

24
demandé sur Alex Kovytin 2013-12-06 18:49:33

3 réponses

C'est un bogue de longue date dans nginx. Mais vous pouvez contourner le problème en utilisant à nouveau la directive root. Une sorte de hack, mais au moins ça marche.

server {
    index       index.php;
    root        /home/alex/www/test2;
    server_name local.test.ru;

    location /blog {
        root      /home/alex/www/test1;
        try_files $uri $uri/ /blog$is_args$args;
    }
}
17
répondu Fleshgrinder 2014-05-01 01:43:26

Nous n'avons pas pu le faire fonctionner en spécifiant root dans le bloc d'emplacement. La solution pour nous était d'utiliser alias à la place. Notez qu'il est nécessaire de répéter le chemin de l'emplacement deux fois dans la directive try_files, puis aussi dans le .bloc de configuration php:

server {
    server_name localhost;
    root /app/frontend/www;

    location /backend/ {

        alias /app/backend/www/;

        # serve static files direct + allow friendly urls
        # Note: The seemingly weird syntax is due to a long-standing bug in nginx: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /backend//backend/index.php?$args;

        location ~ /backend/.+\.php$ {
            include fastcgi_params;
            fastcgi_buffers 256 4k;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param HTTPS $proxied_https;
            fastcgi_pass phpfiles;
        }

    } # / location

}

Source: nginx / conf.d / app.conf de la debian-php-nginx pile dans le support de la pile de projet

20
répondu Motin 2016-01-30 13:17:24

Il existe une autre solution de contournement qui donne plus de flexibilité. Il se compose d'une directive proxy_pass qui pointe sur 127.0.0.1 et un autre bloc server.

, Dans votre cas, il devrait ressembler à ceci:

upstream blog.fake {
    server 127.0.0.1;
}
server {
    server_name local.test.ru;
    root /home/alex/www/test2;
    index index.html;

    location /blog {
        proxy_pass http://blog.fake/;
    }
}
server {
    server_name blog.fake;
    root /home/alex/www/test1;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}
0
répondu Melwin Kieffer 2017-08-14 14:16:46