帮助了解 Apache rewriteengine 规则

帮助了解 Apache rewriteengine 规则

我正在尝试使用 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]

相关内容