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