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

Igor Sysoev igor на sysoev.ru
Пт Сен 16 12:35:53 UTC 2011


On Fri, Sep 16, 2011 at 01:37:54PM +0300, Alexander Moskalenko wrote:
> Игорь, если подобный rewrite находится в секции server это хуже чем через
> location ?
> 
> редирект вот такой:
> rewrite ^(\/+[\w\/-]*[^\/])$    $scheme://$host$1/ permanent;

Большой разницы нет.

Я предпочитаю не использоватоь rewrite вообще и не использовать
регулярные выражения в location'ах. Или же локализовывать их
использование внутри location'ах с префиксом.

> 2011/9/16 Igor Sysoev <igor at sysoev.ru>
> 
> > On Fri, Sep 16, 2011 at 04:17:52PM +0700, Игорь Вавржин wrote:
> >
> > > >>>>>>> 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 который после редиректа
> > > проихошел?
> >
> > Так работать не будет.
> > Тогда только так:
> >
> > location / {
> >    index index.php;
> >    try_files $uri $uri/ /index.php?$args;
> > }
> >
> > location ~ (?<URL>^.*/[^/.]+$) {
> >    return   301  http://$host$url/$is_args$args;
> > }
> >
> > location ~ \.php$ {
> >    ...
> > }


-- 
Игорь Сысоев
http://sysoev.ru



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