mod_rewrite : если/иначе введите RewriteRule

Следующее переписывание передает строку, начинающуюся с цифры 4, в качестве переменной для process.php:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(4[^/]*)$ /process.php?variable=$1 [L]

Так это

http://www.domain.com/4shopping

сопоставляется с

http://www.domain.com/process.php?variable=4shopping

Но я хочу расширить это последнее правило перезаписи до состояния:

if word begins with 4, map to /process.php?variable=$1
else map to /index.php

Вторая (остальная) часть этого утверждения — это основное правило перезаписи WordPress. Так, например:

http://www.domain.com/shopping

который не имеет 4, будет направлен на

http://www.domain.com/index.php?shopping (I believe this is how WordPress permalinks work!)

person Paul    schedule 25.09.2009    source источник


Ответы (3)


Попробуй это:

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

RewriteRule ^(4[^/]*)$ process.php?variable=$1 [L]
RewriteRule ^([^4/][^/]*)$ index.php?$1 [L]

Первое правило перехватит любой запрос, который может быть сопоставлен с существующим файлом или каталогом, и завершит процесс перезаписи. Второе правило за вами (без RewriteCond условий). А третье правило отловит любой запрос, URL-адрес которого не начинается с цифры 4.

person Gumbo    schedule 25.09.2009
comment
По какой-то причине третье правило не работает — т. е. обычные URL-адреса WordPress приводят к ошибке «файл не найден». - person Paul; 25.09.2009
comment
Используйте функцию ведения журнала mod_rewrite, чтобы увидеть, что происходит не так. См. http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewriteloglevel - person Gumbo; 27.09.2009

Вот решение:

RewriteRule ^(4[^/]*)$ /feedback.php?sms_code=$1 [L]
#
# BEGIN wordpress
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END wordpress

Я оставил правила Wordpress по умолчанию на месте и добавил свое собственное условное правило выше, убедившись, что обработка [L] завершена, если условие было выполнено.

person Paul    schedule 26.09.2009

Я бы добавил две строки в конец того, что у вас уже есть. Дополнительные правила преобразуют в index.php все, что еще не было преобразовано в process.php.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(4[^/]*)$ /process.php?variable=$1 [L]

RewriteCond %{SCRIPT_FILENAME} !process\.php
RewriteRule ^([^/]*)$ index.php?$1
person bmb    schedule 25.09.2009
comment
Опять же, в принципе работает, но не работает с Wordpress. - person Paul; 26.09.2009