htaccess使用regexp和inifite重定向重写规则

时间:2015-09-30 15:55:15

标签: .htaccess mod-rewrite url-rewriting rewrite url-redirection

我很难使用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>

1 个答案:

答案 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了解详细信息。