我们有此 RedirectMatch 规则来移动启用 SSL 的站点上的客户端,同时保持他们尝试访问的路径:
Redirectmatch permanent (.*) https://www.foobar.com$1
并且运行正常。现在我们想为 /somepath 添加一个例外,它应该不是被重定向。我该怎么做?
使用 mod_rewrite 时,我会添加一个重写规则,说明“不重写并停止匹配”,但重定向没有这样的机制。此外,如果我简单地反转正则表达式,如 !(/somepath|/someotherpath),它将不再获得 $1 参数。
答案1
您不想使用 mod_rewrite 的原因是什么?
你可以用这个来模仿这个功能:
RewriteCond %{REQUEST_URI} !^/(somepath|someotherpath) 重写规则 (.*) $1 [R=永久] 重写规则 http://%{SERVER_NAME}(.*) https://www.foobar.com$1 [L]
我之前没有意识到 Apache 使用 PCRE。既然它确实使用了 PCRE,你可以使用这个小技巧来对 mod_alias 执行你想执行的操作:
RedirectMatch 永久 ^/?((?!(thisisfoo|thisisbar)).*) https://www.foobar.com/$1
其中 /thisisfoo 和 /thisisbar 是重定向的例外。
答案2
根据文档(在http://httpd.apache.org/docs/2.2/mod/mod_alias.html#order)Redirect
按照它们出现的顺序进行处理。因此,您需要首先设置限制性更强的规则,然后将包罗万象的规则放在最后。
答案3
在我找到适合我的情况的正确答案之前,我来到这里,所以我添加了我的解决方案以供参考。
我需要改变一切除了两个文件夹,我将它们命名files1
为files2
:
RedirectMatch permanent "^(/(?!(files1/|files2/)).*)" https://www.example.com$1
同样,单词可以用本质上相同的(HTTP 代码中的“永久”)或(表示临时重定向)来permanent
替换。301
302