mod_rewrite - 排除网址

时间:2014-01-12 14:31:25

标签: apache mod-rewrite

我需要一个mod_rewrite将所有http个请求重定向到https,但我想要排除一些网址

#   force https
RewriteCond %{HTTPS}            off
RewriteCond %{HTTP_HOST}        ^secure\. [NC]
RewriteCond %{REQUEST_URI}      !gateway_callback [NC]
RewriteRule ^.                  https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,QSA]

必须排除与gateway_callback匹配的所有网址

不应重定向此网址,但确实如此!?

http://secure.localhost/da/gateway_callback/29/

尝试在浏览器中刷新DNS缓存,但网址仍然重定向到https

2 个答案:

答案 0 :(得分:9)

配置的主要问题是REQUEST_URI变量包含正斜杠之后的所有内容。第三个RewriteCond语句需要更新为以下内容:

RewriteCond %{REQUEST_URI} !^/da/gateway_callback/.*$ [NC]

这应与您提供的示例相匹配。如果URI并不总是以/da/开头,那么您可能需要输入通配符:

RewriteCond %{REQUEST_URI} !^/[^/]+/gateway_callback/.*$ [NC]

其中[^/]+匹配一个或多个不是正斜杠的字符。

我建议尽可能使用正则表达式锚点,因为它消除了歧义。尝试匹配REQUEST_URI的原始RewriteCond不使用它们,这可能会使管理员随意混淆。

另请注意,official documentationRewriteCondRewriteRule指令的所有相关示例都使用了起始锚点。

答案 1 :(得分:0)

尾随斜杠可以阻止你匹配吗?我永远不清楚尾部斜线是否被保留。我建议将你的第三个条件改为

RewriteCond %{REQUEST_URI} !/gateway_callback/\d+/?$ [NC]