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