我需要一个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
答案 0 :(得分:9)
配置的主要问题是REQUEST_URI变量包含正斜杠之后的所有内容。第三个RewriteCond语句需要更新为以下内容:
RewriteCond %{REQUEST_URI} !^/da/gateway_callback/.*$ [NC]
这应与您提供的示例相匹配。如果URI并不总是以/da/
开头,那么您可能需要输入通配符:
RewriteCond %{REQUEST_URI} !^/[^/]+/gateway_callback/.*$ [NC]
其中[^/]+
匹配一个或多个不是正斜杠的字符。
我建议尽可能使用正则表达式锚点,因为它消除了歧义。尝试匹配REQUEST_URI的原始RewriteCond不使用它们,这可能会使管理员随意混淆。
另请注意,official documentation中RewriteCond
和RewriteRule
指令的所有相关示例都使用了起始锚点。
答案 1 :(得分:0)
尾随斜杠可以阻止你匹配吗?我永远不清楚尾部斜线是否被保留。我建议将你的第三个条件改为
RewriteCond %{REQUEST_URI} !/gateway_callback/\d+/?$ [NC]