Re: Помогите разобраться почему не работает

Валентин Бартенев ne на vbart.ru
Вт Авг 23 18:01:58 UTC 2011


Логика работы этого конфига мне более-менее понятна (если я правильно понимаю 
работу Nginx директив), но вот что хотел автор, его написавший, представляется 
боооольшой загадкой.

On Tuesday 23 August 2011 16:23:51 gamak wrote:
> Здравствуйте!
> Помогите разобраться с проблемой:
>         location  @metka  {
>                 rewrite  ^(.*[^/])$  $uri/  last;
>                 sendfile        off;
>                 fastcgi_pass    php_local;
>         }

Прежде всего, зачем вы делаете выделение и не используете его?

Если вдруг внутренним редиректом в этот локэйшн попадает запрос, то происходит 
одно из двух:
1) если на конце нет слэша, то будет выполнен внутренний редирект с добавление 
слэша;
2) в противном случае (если слэш есть), то запрос будет передан factcgi 
бэкэнду.

Редиректнутый запрос (случай 1) попадет опять же сюда:

>         location  /  {
>                 try_files  $uri $uri/ @metka;
>                 location ~ \.php$  {
>                         set  $script_name  $fastcgi_script_name;
>                         sendfile        off;
>                         fastcgi_pass    php_local;
>                 }
>         }

По-умолчанию сюда попадают все запросы.

Тут проверяется существование пути соответствующего запросу или пути 
соответствующего запросу плюс слэш на конце. Если файла или директории не 
существует, то делаем внутренний редирект на именованный локэйшн @metka.

Причем, если у нас запрос без слэша на конце, и соответствующего файла и 
директории не существует, то происходит призабавнейшая ситуация:
1) Убеждаемся в отсутствии $uri и $uri/
2) Запрос уходит в @metka, где к $uri добавляется /
3) Запрос попадает опять сюда только уже $uri = $uri/
4) Очевидно он опять уходит в @metka (ибо п. 1)
5) В @metka он попадает уже на factcgi бэк-энд

Вот так вот понять, что этим конфигом хотел добиться автор, imho, невозможно.

Если $uri или $uri/ все-таки существует, то в случае, если запрос оканчивается 
на .php, он будет передан fastcgi бэк-энду, иначе обработан как обычный запрос 
к файлу или директории.

> При открытии главной -все ок. Как только
> жму по любой вкладе, отдается пустая

Что значит жмете по любой вкладке? Что за вкладки?

> страница. в access.log 404 ошибка.

А в error-лог смотрели?

> Правлю вот так:
>         location  @metka  {
>                 rewrite  ^(.*[^/])$  $uri/  last;
>                 sendfile        off;
>                 fastcgi_pass    php_local;
>         }
> 
>         location  /  {
>                 try_files  $uri $uri/ @metka /index.php?q=$request_uri;


В данном варианте конфига запрос в локэшн @metka не попадет никогда.

Все запросы попадут в location  /, после чего будет проверено наличие путей:
$uri, $uri/ и @metka

К слову сказать файл с именем @metka вполне может существовать, так что смысла 
это не лишено, но вряд ли этого добивается автор.

Если соответствующих объектов не обнаружено, то будет выполнен внутренний 
редирект на /index.php?q=$request_uri , который очевидно попадет опять же 
сюда, и при наличии файла index.php затем попадет на factcgi бэкэнд.

> 
> Все  начинает работать, но меня не
> устраивает такой редирект, потому что
> некоторый функционал на сайте
> перестает работать.
> Подскажите пожалуйста, куда копать.
> 

Подскажите пожалуйста, что вы хотите сделать, и что у вас не получается (какие 
запросы не работают)? Читали ли вы документацию?

--
Валентин Бартенев
http://vbart.ru/



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