Назад | Перейти на главную страницу

Помощь с правилами Apache rewriteengine

Я пытаюсь написать простое правило перезаписи, используя rewriteengine в apache. Я хочу перенаправить весь трафик, предназначенный для веб-сайта, если только трафик не исходит от определенного IP-адреса, а URI содержит две определенные строки.

RewriteEngine On
RewriteLog /var/log/apache2/rewrite_kudithipudi.log
RewriteLogLevel 1

RewriteCond %{REMOTE_ADDR} ^199\.27\.130\.105
RewriteCond %{REQUEST_URI} !/StringOne [NC, OR]
RewriteCond %{REQUEST_URI} !/StringTwo [NC]
RewriteRule ^/(.*) http://www.google.com [R=302,L]

Я поместил эти утверждения в конфигурацию моего виртуального хоста. Но похоже, что rewriteengine перенаправляет все запросы, соответствуют они условию или нет. Я что-то упускаю? Спасибо.

RewriteCond %{REMOTE_ADDR} ^127\.0\.0\.1$
RewriteCond %{REQUEST_URI} !/StringOne [NC, OR]
RewriteCond %{REQUEST_URI} !/StringTwo [NC]
RewriteRule ^/(.*) http://www.google.com [R=302,L]

Я поместил это в свою конфигурацию apache и установил RewriteLogLevel равным 9 и выполнил этот запрос:

> telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET /StringOne/StringTwo

И я получил это в журнале:

127.0.0.1 - - [11/Jan/2011:00:02:34 --0800] [<host>/sid#2b1603885d30][rid#2b1603e75af0/initial] (4) RewriteCond: input='/StringOne/StringTwo' pattern='!/StringOne' [NC] => not-matched

Похоже, что apache оценивает [NC] перед тем, как применить [OR].

Я думаю, вам нужно что-то ближе к этому:

RewriteCond %{REMOTE_ADDR} !^199\.27\.130\.105$
RewriteCond %{REQUEST_URI} !/StringOne [NC]
RewriteCond %{REQUEST_URI} !/StringTwo [NC]
RewriteRule ^/(.*) http://www.google.com [R=302,L]

Вы сделали перезапись условной при переходе с этого IP-адреса, а не на не исходящий с этого IP-адреса.