Простой редирект средствами nginx

Igor Sysoev is at rambler-co.ru
Wed Feb 2 16:39:05 MSK 2005


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





More information about the nginx-ru mailing list