Замечательная новость! После гибкости 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