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