.htaccess的RewriteRule不生效

由于网站链接改版,需要对一些旧的已经被收录的内容进行301跳转。规则如下

Old: http://blog.zivers.com/post/666
New: http://blog.zivers.com/post/666.html

规则很简单,就是添加一个.html后缀。于是我在.htaccess中写入了一条RewriteRule:

RewriteRule ^post/(\d+)$ /post/$1.html [R=301,L]

但是,实际访问/post/123时,并没有按预期跳转,而是返回了一个404页面。由于我其他RewriteRule生效正常,所以排除了例如没有开启Rewrite Mod这一类的问题。焦点放在了这条规则上。然而这条规则太简单,以至于一眼就能明白肯定正确。在网上查了许久也没找到答案,于是我还是去看Apache的官方文档怎么说吧。果然,问题找到了,RewriteRule是顺序生效的,这点和Nginx一样,当第一条规则匹配生效后,第二条匹配到相同规则的URL就不会使用这条规则了。而我的.htaccess规则如下:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
RewriteRule ^post/(\d+)$ /post/$1.html [R=301,L]
</IfModule>
# END WordPress

显然,上面的RewriteCond已经匹配到了我想要跳转的URL,然后执行了这条规则:

RewriteRule . /index.php [L]

所以,问题迎刃而解,把我所需要执行的规则上移即可:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^post/(\d+)$ /post/$1.html [R=301,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

发表评论

电子邮件地址不会被公开。 必填项已用*标注