ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 301 redirect на URI без слэша на конце


  • To: nginx-ru@xxxxxxxxx
  • Subject: Re: 301 redirect на URI без слэша на конце
  • From: Валентин Бартенев <vbart@xxxxxxxxx>
  • Date: Thu, 09 Jan 2014 19:09:55 +0400
  • In-reply-to: <CAK1EO=Xdm64fpeOuKfQAk8njG9XqZ9Gd0FXfUD5ADLzaOdfrqA@mail.gmail.com>
  • Organization: Nginx, Inc.
  • References: <CAK1EO=Xdm64fpeOuKfQAk8njG9XqZ9Gd0FXfUD5ADLzaOdfrqA@mail.gmail.com>

On Thursday 09 January 2014 17:55:57 Андрей Середенко wrote:
> Здравия, друзья! Всех с прошедшими праздниками!
> 
> В процессе приведения конфигурации своих веб-серверов в более лицеприятный
> столкнулся с таким моментом: автоматическое добавление слэша не происходит
> после отрабатывания директивы try_files. Было неожиданно. Немного примеров,
> чтобы стало понятнее, о чем речь (ниже 2 фрагмента конфигурации - "до" и
> "после"):
> 
> location /webapp/ {
>         proxy_pass         http://app_upstream;
>  include my-site/proxy_pass_params.conf;
> }
> 
> Подумалось, что правильнее отдавать статику силами nginx'а, а не напрягать
> и без того кривое приложение:) В итоге, location принял следующий облик:
> 
> location /webapp/ {
> root /var/www/webapps/nginx-static;
>  try_files $uri @application-handle;
> }
> 
> location @application-handle {
>         proxy_pass         http://app_upstream;
>  include my-site/proxy_pass_params.conf;
> }
> 
> В результате, в принципе, получил то, что хотел: запрашиваемые файлы
> сначала ищутся в /var/www/webapps/nginx-static, и, если ничего не нашли, -
> проксируем на приложение. Но - перестали обрабатываться запросы вида
> http://my.site.com/webapp, хотя запросы http://my.site.com/webapp/ (со
> слэшем на конце) обрабатываются корректно.
> Оно то, в общем-то, и правильно: в документации сказано:
> 
> Если location задан префиксной строкой со слэшом в конце и запросы
> 
> > обрабатываются при помощи
> > proxy_pass<http://nginx.org/ru/docs/http/ngx_http_proxy_module.html#proxy
> > _pass>
 ,
> > fastcgi_pass<http://nginx.org/ru/docs/http/ngx_http_fastcgi_module.html#f
> > astcgi_pass> ,
> > scgi_pass<http://nginx.org/ru/docs/http/ngx_http_scgi_module.html#scgi_pa
> > ss> ,
> > uwsgi_pass<http://nginx.org/ru/docs/http/ngx_http_uwsgi_module.html#uwsgi
> > _pass>> 
> >  или
> >  memcached_pass<http://nginx.org/ru/docs/http/ngx_http_memcached_module.h
> >  tml#memcached_pass>,
> 
> > а в ответ на запрос с URI равным этой строке, но без завершающего слэша,
> > будет возвращено постоянное перенаправление с кодом 301 на URI с
> > добавленным в конец слэшом. Если такое поведение нежелательно, можно
> > задать точное совпадение URI и location, например:
> >
> >
> >
> > location /user/ {
> > 
> >     proxy_pass http://user.example.com;
> > 
> > }
> >
> >
> >
> > location = /user {
> > 
> >     proxy_pass http://login.example.com;
> > 
> > }
> >
> >
> >
> >
> > Про try_files тут не сказано ни слова.) Но возник законный вопрос: а как
> 
> вернуть прежнее поведение? можно ли сделать это "красиво"? или придется
> городить магию с реврайтами? а если писать реврайты - куда их пихать.. в
> общем, как-то так. Как-то сходу не получилось самому ответить на эти
> вопросы, решил поделиться с сообществом. Буду признателен за любые
> предложения выхода из ситуации.
>
[...]

Вся магия сводится к добавлению:

  location = /webapp {
      return 301 /webapp/;
  }

--
Валентин Бартенев
_______________________________________________
nginx-ru mailing list
nginx-ru@xxxxxxxxx
http://mailman.nginx.org/mailman/listinfo/nginx-ru


 




Copyright © Lexa Software, 1996-2009.