ПРОЕКТЫ 


  АРХИВ 


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: Простой редирект средствами nginx



On Wed, 2 Feb 2005, Mike Kolesnikov wrote:

Igor Sysoev wrote:


Замечательная новость! После гибкости mod_rewrite постоянно упираешься
в косяки, подобные этому...
А что Вы можете сказать по поводу "зацикливания" редиректа?
Вроде как URI /forums/index.php не должен попадать в location = /forums/ ?

"=" означает точное равенство URI и location.

Так в том и дело, что в моем примере, несмотря на _неравенство_ URI
и location, срабатывает редирект, находящийся внутри этого самого location:

Видно, что redirect сработал еще раз, хотя URI не совпадал с location,
в котором этот редирект находится. Баг?

Да, это баг. Вот этот патч должен вылечить:

-------------------------
--- src/http/ngx_http_core_module.c     Tue Feb  1 20:13:01 2005
+++ src/http/ngx_http_core_module.c     Wed Feb  2 16:23:52 2005
@@ -659,9 +671,15 @@
         }

         if (n == 0) {
-            if (clcfp[i]->exact_match && r->uri.len == clcfp[i]->name.len) {
-                r->loc_conf = clcfp[i]->loc_conf;
-                return NGX_HTTP_LOCATION_EXACT;
+            if (clcfp[i]->exact_match) {
+
+                if (r->uri.len == clcfp[i]->name.len) {
+                    r->loc_conf = clcfp[i]->loc_conf;
+                    return NGX_HTTP_LOCATION_EXACT;
+
+                } else {
+                    continue;
+                }
             }

             if (len > clcfp[i]->name.len) {
-------------------------

> Нет, это неправильный подход. Нужно будет придумать что-то вроде

   location ~* ^/~([\w-]+) {
        alias /home/$1/web;
   }

или

   rewrite ^/~([\w-]+)/(.*)$  /home/$1/web/$2  alias;

тогда uri остаётся без изменений и редирект уйдёт правильным.
Я склоняюсь к реализации втрого варианта.

Да, второй вариант смотрится проще. Но тут надо вообще разобраться
с логикой, над чем будет работать rewrite - над URI или над реальным путем
к файлу. Если добавлять alias к rewrite, значит, переписывается URI
в путь к файлу. Но как тогда переписывать сам путь к файлу?
Может, сделать разные директивы, rewrite_uri и rewrite_filepath?

Или вообще сделать вот так, не размножая сущностей:
   location ~* ^/~([\w-]+) {
        root /home/$1/web;
   }

Тут нужен именно alias, а не root, так как к root прибавляется весь uri,
а для alias - только часть uri.

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

Директива "rewrite ^/~([\w-]+)/(.*)$  /home/$1/web/$2  filepath"
формирует из uri путь (то, что это путь говорит модификатор filepath).

Лично мне не нравится переписывать пути к файлу, как это делается
в mod_rewrite. Что касается разных директив, то будут такие варианты:

rewrite $path  ....
rewrite $uri  ....

rewrite без указания будет переписывать $uri.


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




 




Copyright © Lexa Software, 1996-2009.