try_files

Phil Kulin schors at gmail.com
Sun Jul 29 21:49:15 UTC 2012


Добрый вечер.

Я себе сегодня голову сломал. Есть вот такой конфиг (nginx 1.2.1):
>========begin========
        server {
                include listen.conf; # там просто listen

                server_name 1.cms.cz8.ru;
                access_log  off;

                root /home/cms/www/site1/public_html;
                index index.php;

                location / {
                        disable_symlinks if_not_owner
from=/home/cms/www/site1/public_html;
                        charset utf-8;
                        source_charset utf-8;
                        log_not_found off;
                        try_files $uri $uri/ @apache;
                        access_log /home/cms/www/site1/logs/nginx-access.log;
                }

                location = /favicon.ico {
                        log_not_found off;
                        access_log /home/cms/www/site1/logs/nginx-access.log;
                }

                location = /robots.txt {
                        allow all;
                        log_not_found off;
                        access_log /home/cms/www/site1/logs/nginx-access.log;
                }

                location ~ /\. {
                        deny all;
                        log_not_found off;
                        access_log off;
                }

                location ~* /(?:uploads|files)/.*\.php$ {
                        deny all;
                        log_not_found off;
                        access_log off;
                }

                location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                        disable_symlinks if_not_owner
from=/home/cms/www/site1/public_html;
                        charset utf-8;
                        source_charset utf-8;
                        expires 24h;
                        log_not_found off;
                        access_log /home/cms/www/site1/logs/nginx-access.log;
                }

                location ~ \.php$ {
                        try_files $uri =404;
                        proxy_pass  http://127.0.0.1:13315;
                }

                location @apache {
                        proxy_pass  http://127.0.0.1:13315;
                }

        }
>=================end==============

Загвоздка собственно в первом location / с try_files
Судя по всему, доходя до проверки $uri/ nginx проверяет на самом деле
<root>/$uri/<индекс>
Причём, в этом случае он не отдаёт при наличии там index.php его в
голом виде, а пересматривает location и идёт уже в правило location ~
\.php$ указывая новый $uri с присутствующим там index.php (посмотрел
phpinfo() что ему приходит)

Ещё забавная вещь, при смене индекса:
index index.html
он тут же начинает ругаться 403-ей ошибкой (!)

Это я пытался WordPress настроить. Т.е. ни одна из конфигураций с
документации nginx.org, wiki.nginx.org, и самих CMS для
Joomla/Wordpress не будут работать при замене fastcgi на proxy (у меня
бэкендом apache).

Но вопрос собственно в том, что я реально поведения не понимаю, не
могу формализовать, а главное - зачем он это делает?

-- 
Non nobis Domine non nobis sed Nomini Tuo da gloriam
Phil Kulin


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