我很难使用WP的旧URL的一部分为重定向创建重写规则。例子:
旧网址:
http://www.example.com/news/index.php/2014/11/07/my-blog-post-from-old-site
或者
http://www.example.com/news/index.php/2014/11/07/my_blog_post_from_old_site
新网址:
http://www.example.com/2014/11/07/my-blog-post
从破折号中删除后,新网址应仅具有日期和永久链接的前三个元素。
我的解决方案是在合并了来自这里https://stackoverflow.com/a/32852444/1090360和这里https://stackoverflow.com/a/1279758/1090360的答案之后而来的
以某种方式用下划线替换下划线的部分将创建无限重定向,并且服务器将冻结。如果我要删除部分,而用下划线代替破折号,则其余所有部分均应正常工作。
这是我的.httaccess规则
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
#replace underscores with dashes
RewriteRule ^(/news/.*/[^/]*?)_([^/]*?_[^/]*)$ $1-$2 [N]
RewriteRule ^(/news/.*/[^/]*?)_([^/_]*)$ $1-$2 [R=301,L,NC]
#redirect to new URL
RewriteRule ^news/index\.php/([^-]+-[^-]+-[^-]+).* /$1 [R=301,L,NC]
#WP standard stuff
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
我认为,这是用下划线代替下划线的昂贵方法。但这至少在我的测试环境中有效。第一条规则将破折号一个接一个地替换。然后,第二条规则从请求的URL中删除前缀。
RewriteBase /
# replace underscores with dashes
RewriteRule ^(news/index.php/.+?)_(.*) $1-$2 [L]
# strip "news/index.php"
RewriteRule ^news/index.php/(.*) /$1 [R=302,L]
我使用该N|next
标志使用您原来的方法玩的更多,并且服务器也崩溃了。查看error.log
,看来此无限循环是由Apache通过添加“路径信息后缀”创建的,该扩展将URL扩展为原始URL。因此,它会不断地用下划线代替下划线。
您可以使用另一个标志阻止此路径信息后缀,该标志DPI|discardpath
给出以下规则
RewriteRule ^(news/index.php/.+?)_(.*) $1-$2 [N,DPI]
这似乎也可行。尽管我必须承认,但我不太了解这种“路径信息后缀”。Apache的Bugzilla Bug 38642中也有一个条目:mod_rewrite在替换发生后添加路径信息后缀
永远不要在301
启用的情况下进行测试,请参阅此答案。有关调试.htaccess重写规则的提示,请参见详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句