我正在尝试使用 apache 中的 rewriteengine 编写一个简单的重写规则。我想重定向所有发往网站的流量,除非该流量来自特定 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]
我将这些语句放入我的虚拟主机配置中。但重写引擎似乎重定向所有请求,无论它们是否符合条件。我是否遗漏了什么?谢谢。
- 维奈。
答案1
您已将重写条件设为来自该 IP 地址,而不是不是来自该 IP 地址。
答案2
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 在应用 [OR] 之前先评估 [NC]。
我认为你想要更接近这个的东西:
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]