RewriteRule ^\\d{4}/\\d{2}/(.*).html+.* http://www.example.com/$1/ [R=301,L]
这看起来确实应该“起作用”,尽管有一些事情可以整理,查询字符串(即。
m=1
或
m=0
) 将保留在URL上。
此外,在测试之前,请确保已清除浏览器缓存,因为浏览器会硬缓存301s。出于这个原因,使用302(临时)重定向进行测试会更容易,并且只有在您确定其正常工作时才更改为301重定向。(提示:在浏览器的对象检查器打开且选中“禁用缓存”选项的情况下进行测试。)
此重定向还需要位于.htaccess
文件,在WordPress前端控制器之前(即# BEGIN WordPress
第节)。
请尝试以下操作:
RewriteRule ^\\d{4}/\\d{2}/(.+)\\.html$ http://www.example.com/$1/? [R=301,L]
尾部
+.*
在您的模式上,没有太多意义(虽然它不应该引起问题),因为这只是重复
l
(共个)
html
) 1次或多次,然后是任何内容。这个
.html
始终是URL路径的结尾(查询字符串不是URL路径的一部分),因此后面应该紧跟
$
(锚索末端)。
这个?
在RewriteRule
替换通过创建一个“空”查询字符串,有效地从目标URL中删除查询字符串。或者,在Apache 2.4+,您可以使用QSD
改为标记(查询字符串放弃)。ie。... http://www.example.com/$1/ [QSD,R=301,L]
UPDATE: 使用……安全吗。。。
好吧,您可以更具体地使用regex,以确保它不匹配“太多”,只匹配您感兴趣的URL。例如,上述指令还将匹配表单的URL:example.com/2017/02/foo/bar/post-name.html
, 这将导致(可能无效)重定向到/foo/bar/post-name
. 甚至example.com/2017/02/1111/22/post-name.html
, 这将导致双重重定向。这可能根本不重要,事实上,这甚至可能是可取的,这取决于你的情况。但是,您可以限制post-name
仅限于单词字符(a-z
, A-Z
, 0-9
和_
) 通过更改RewriteRule
图案。例如:
RewriteRule ^\\d{4}/\\d{2}/([\\w-]+)\\.html$ http://www.example.com/$1/? [R=301,L]
但除此之外,我看不出这是“不安全的”。