问题
我得到了太多的重定向:所有URL都无限地重定向到自己,为什么?
Apache重写规则是自上而下处理的,因此您的自定义重写规则总是先处理。这个R
重定向标志指示Apache告诉浏览器向更改的URL发出新请求,而不是在当前地址提供重写的目标,并且L
“last”标志告诉Apache忽略所有正在进行的重写规则,所以无论何时RewriteRule
应用时,将发出新请求,并从顶部再次处理您的规则。
你的RewriteCond
指示Apache处理该过程RewriteRule
每当请求URI路径不以开头时/privacy-policy
- 因此,实际上每个请求都会在您的.htaccess
甚至可以评估。
正如评论中提到的@MarkKaplen$1
是用第一个“捕获组”(模式中的第一组括号)中包含的匹配URI部分替换的反向引用。自从.*
字面上匹配任意数量的任意字符RewriteRule
$1
替换为整个URI路径。
本质上,您的重写规则:
RewriteCond %{REQUEST_URI} !^/privacy-policy/
RewriteRule (.*) http://www.mywebsite.com/$1 [R=301,L]
如果URI不是以开头,则计算为
/privacy-policy/
, 让web浏览器向发送新请求
http://www.mywebsite.com/(original URI path)
“。
因此,为了便于说明,假设您导航到http://www.mywebsite.com/blog/2015
; 下面是每个请求的情况:
/blog/2015
不以开头/privacy-policy/
, 告诉浏览器转到http://www.mywebsite.com/blog/2015
./blog/2015
不以开头/privacy-policy/
, 告诉浏览器转到http://www.mywebsite.com/blog/2015
./blog/2015
不以开头/privacy-policy/
, 告诉浏览器转到http://www.mywebsite.com/blog/2015
.- […]
卸下
$1
从返回引用
RewriteRule
不足,因为URI路径为
/
(或只是空的一个)仍然不符合以开头的条件
/privacy-policy/
, 导致以下行为:
/blog/2015
不以开头/privacy-policy/
, 告诉浏览器转到http://www.mywebsite.com/
./
不以开头/privacy-policy/
, 告诉浏览器转到http://www.mywebsite.com/
./
不以开头/privacy-policy/
, 告诉浏览器转到http://www.mywebsite.com/
.- […]
您可以通过查看Apache安装的日志文件来验证此行为。
如果您不打算使用WordPress的预期地址路由,那么没有理由保留默认重写规则并在其上堆叠更多规则。根据您的需要定制,而不是增加复杂性:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^(/|index\\.php)$ /index.php? [L]
RewriteRule ^/?privacy-policy/?$ /index.php [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /? [L,R=301]
</IfModule>
总之,
- 。
RewriteRule ^(/|index\\.php)$ /index.php? [L]
如果/
或index.php
已明确请求,请送达index.php
, 但是删除querystring(以防止通过查询var操作更改页面)并停止处理重写。 - 。
RewriteRule ^/?privacy-policy/?$ /index.php [L]
如果privacy-policy
(带或不带前导斜杠和尾随斜杠)已明确请求index.php
并停止处理重写。 - 。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /? [L,R=301]
如果请求的文件名不是文件也不是目录,请在任意位置匹配一个字符(以便无论URI如何都应用该规则),并告诉浏览器向/
丢弃它的querystring。停止处理重写。
值得注意的是,您的预期结果可能会产生许多意外行为,例如,您可能无法访问管理仪表板。附件也可能损坏。但以上内容至少应该为更多地了解重写指令提供一个良好的起点。