Re: Как правильно сделать редирект

Игорь Вавржин igor.vavrjin на gmail.com
Пт Сен 16 09:17:52 UTC 2011


16.09.2011 15:55, Igor Sysoev пишет:
> On Fri, Sep 16, 2011 at 03:49:48PM +0700, Игорь Вавржин wrote:
>> 16.09.2011 15:35, Igor Sysoev пишет:
>>> On Fri, Sep 16, 2011 at 02:43:28PM +0700, Игорь Вавржин wrote:
>>>> 16.09.2011 13:11, Igor Sysoev пишет:
>>>>> On Fri, Sep 16, 2011 at 01:09:15PM +0700, Игорь Вавржин wrote:
>>>>>> 16.09.2011 12:49, Igor Sysoev пишет:
>>>>>>> On Fri, Sep 16, 2011 at 11:55:01AM +0700, Игорь Вавржин wrote:
>>>>>>>> Не подскажите как правильнее сделать редирект со страниц у которых
>>>>>>>> REQUEST_URI не заканчиватся на / и у которых в урл после последнего
>>>>>>>> слэша нет символа "."
>>>>>>>>
>>>>>>>> / на такой же урл но со слэшем на конце?
>>>>>>>>
>>>>>>>> Примеры:
>>>>>>>> stite.com/page ->     stite.com/page/
>>>>>>>> stite.com/page/ ->     нет редиректа
>>>>>>>> stite.com/page.html ->     нет редиректа
>>>>>>>> stite.com/image.jpg ->     нет редиректа
>>>>>>> Если это статические файлы и каталоги, то nginx делает это автоматом.
>>>>>>>
>>>>>> Нет это не статика.
>>>>> А что должно уходить на бэкенд ?
>>>>>
>>>>>
>>>> У меня пока как-то вот так выглядит:
>>>>
>>>> location ~* /[^/\.]+$ {
>>>>            rewrite ^(.*)$ http://$http_host$1/ permanent;
>>>> }
>>> Да, можно так. Единственное, я бы отделил это от статики и вынес бы
>>> в location, который работает с бэкендом:
>>>
>>> location / {
>>>
>>>       location ~ (?<URL>^.*/[^/.]+$) {
>>>           return   301  http://$host$url/$is_args$args;
>>>       }
>>>
>>>       location / {
>>>           proxy_pass  ...
>>>           # or fastcgi_pass  ...
>>>       }
>>> }
>>>
>>> location /images/ {
>>> }
>>>
>> Игорь спасибо за подсказку насчет переноса location. Объясните
>> пожалуйста что означает вот эта часть в регулярном выражении:
>> (?<URL>
> Именованное выделение, вот тут подробнее, хотя и не про location:
> http://nginx.org/en/docs/http/server_names.html#regex_names
>
Ух ты :) классная штука. Игорь а не подскажите вот в такой записи:

location ~ \.php$ {
         location ~ (?<URL>^.*/[^/.]+$) {
             return   301  http://$host$url/$is_args$args;
         }
}

Воторой location проверяет соответствие с каким location?
Просто выше по конфигу стоит :

location / {
         index index.php;
         try_files $uri $uri/ /index.php?$args;
}
ну и дальше:
location ~ \.php$ {
         location ~ (?<URL>^.*/[^/.]+$) {
             return   301  http://$host$url/$is_args$args;
         }
}

И соответственно в location \.php попадает после внутреннего редиректа. 
Так вот во внутреннем location соответсвие идет покакому location - 
изначальному или после редиректа? И сразу следующий вопрос: если идет по 
изначальному, то как достать текущий location который после редиректа 
проихошел?



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