Re: Подпапки, alias и try_files

Maxim Dounin mdounin на mdounin.ru
Ср Янв 20 15:57:08 UTC 2016


Hello!

On Tue, Jan 19, 2016 at 05:46:39PM +0300, Mamontov Roman wrote:

> Добрый день.
> 
> Пытаюсь настроить nginx + php-fpm для подпапки:
> 
> Такая конфигурация работает при cgi.fix_pathinfo=1:
> 
>         location /owa {
>                 alias /usr/local/www/vexim/;
>                 try_files $uri $uri/ /index.php;
> 
>                 location ~ ^/owa(.+\.php)$ {
>                         alias /usr/local/www/vexim$1;
>                         fastcgi_pass php-fpm;
>                         include fastcgi_params;
>                         fastcgi_index index.php;
>                         fastcgi_param SCRIPT_FILENAME
> $document_root$fastcgi_script_name;
>                 }
>         }
> 
> Если поставить cgi.fix_pathinfo=0, то будет ошибка "No input file specified.
> [error] 30721#0: *2 FastCGI sent in stderr: "Unable to open primary
> script: /usr/local/www/vexim/index.php/owa/index.php (No such file or
> directory)"

Потому что SCRIPT_FILENAME у вас установлен в 
$document_root$fastcgi_script_name, где

- $document_root = /usr/local/www/vexim/index.php, т.к. 
  используется директива alias с полным заданием пути,

- $fastcgi_script_name = /owa/index.php, т.к. это переменная 
  задаёт имя скрипта в пространстве адресов, а не файлов, и 
  соответственно не знает про alias.

Чтобы работало, нужно задать в SCRIPT_FILENAME значение, которое 
бы показывало на правильное имя файла, e.g.:

    fastcgi_param SCRIPT_FILENAME $request_filename;

Отдельно отмечу, что задавать alias во внутреннем location'е в 
nginx 1.9.4+ не надо, он корректно отнаследуется из внешнего 
location'а.

> Если при cgi.fix_pathinfo=1 указать директиву try_files $uri =404, то
> получаем ошибку 404.
> 
> Хочется понять, как правильно настроить nginx одновременно с alias и
> try_files $uri =404 в location?

При использовании try_files совместно с alias, задающим полное имя 
файла, nginx сейчас пытается трактовать параметры try_files как 
дополнения к имени, e.g.

    try_files ".html" =404;

Т.е. если хочется совместить alias с полным путём и try_files, 
проверяющий существование непосредственно запрашиваемого файла, то 
сейчас надо писать так:

    alias /path/to/$1;
    try_files "" =404;

Впрочем, лучше alias из внутреннего location'а убрать, как 
предложено выше, тогда "try_files $uri =404" будет работать 
штатно.

-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru