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

Mike Kolesnikov mozilla_bugs at mail.ru
Wed Feb 2 15:10:01 MSK 2005


Igor Sysoev wrote:

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

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

    location = /forums/     { redirect /forums/index.php; }

Запрос wget -S --spider http://127.0.0.1:8080/forums/
вызывает редирект на http://127.0.0.1:8080/forums/index.phpforums/
как и должно быть. wget следует по редиректу, вот его следующий запрос:

2005/02/02 12:13:15 [debug] 18535#0: *2 http request line: "GET /forums/index.phpforums/ HTTP/1.0"
2005/02/02 12:13:15 [debug] 18535#0: *2 http uri: "/forums/index.phpforums/"
2005/02/02 12:13:15 [debug] 18535#0: *2 http args: ""
2005/02/02 12:13:15 [debug] 18535#0: *2 http exten: ""
2005/02/02 12:13:15 [debug] 18535#0: *2 http process request header line
2005/02/02 12:13:15 [debug] 18535#0: *2 http header: "User-Agent: Wget/1.8.2"
2005/02/02 12:13:15 [debug] 18535#0: *2 http header: "Host: 127.0.0.1:8080"
2005/02/02 12:13:15 [debug] 18535#0: *2 http header: "Accept: */*"
2005/02/02 12:13:15 [debug] 18535#0: *2 http header: "Connection: Keep-Alive"
2005/02/02 12:13:15 [debug] 18535#0: *2 http header done
2005/02/02 12:13:15 [debug] 18535#0: *2 event timer del: 5: 61319
2005/02/02 12:13:15 [debug] 18535#0: *2 http rewrite handler
2005/02/02 12:13:15 [debug] 18535#0: *2 find location
2005/02/02 12:13:15 [debug] 18535#0: *2 find location: "/"
2005/02/02 12:13:15 [debug] 18535#0: *2 find location: = "/forums/"
2005/02/02 12:13:15 [debug] 18535#0: *2 find location: ~ "^.+\.php$"
2005/02/02 12:13:15 [debug] 18535#0: *2 http cl:-1 max:1048576
2005/02/02 12:13:15 [debug] 18535#0: *2 http redirect handler
2005/02/02 12:13:15 [debug] 18535#0: *2 http finalize request: 302
2005/02/02 12:13:15 [debug] 18535#0: *2 http set discard body
2005/02/02 12:13:15 [debug] 18535#0: *2 HTTP/1.1 302 Found
Server: nginx/0.1.16
Date: Wed, 02 Feb 2005 09:13:15 GMT
Content-Length: 161
Content-Type: text/html
Connection: keep-alive
Location: http://127.0.0.1:8080/forums/index.phpforums/index.phpforums/

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


 > Нет, это неправильный подход. Нужно будет придумать что-то вроде
> 
>    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;
    }





More information about the nginx-ru mailing list