我很难使用WP旧网址的一部分为重定向创建重写规则。例如:
旧网址:
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>
答案 0 :(得分:2)
我认为,用破折号替换下划线是一种昂贵的方法。但这至少在我的测试环境中起作用。第一条规则逐个替换破折号。然后,第二个规则从请求的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通过添加&#34;路径信息后缀&#34;创建的,它使用原始URL扩大URL。因此,它一直用破折号替换下划线。
您可以使用另一个标记DPI|discardpath
来阻止此路径信息后缀,这会提供以下规则
RewriteRule ^(news/index.php/.+?)_(.*) $1-$2 [N,DPI]
这似乎也有效。虽然我必须承认,我并不是真的理解这个&#34;路径信息后缀&#34;事情。这也是Apache的Bugzilla中的一个条目,Bug 38642: mod_rewrite adds path info postfix after a substitution occured
永远不要在启用301
的情况下进行测试,请参阅此回答Tips for debugging .htaccess rewrite rules了解详细信息。