自托管WordPress博客旧链接跳转新链接的.htaccess配置问题
解决WordPress旧链接到新链接的Apache重定向问题
我来帮你搞定这个无缝重定向的需求!你的旧链接是带日期的/index.php/yyyy/mm/dd/title-of-post,要转到简洁的/title-of-post/,用Apache的RewriteRule完全可以实现,关键是要把规则放在正确的位置,并且匹配逻辑准确。
具体的重定向规则
首先,在你的.htaccess文件中添加这条规则,一定要放在WordPress默认规则的前面(也就是# BEGIN WordPress注释块之前):
RewriteEngine On RewriteRule ^index.php/[0-9]{4}/[0-9]{2}/[0-9]{2}/(.*)$ /$1/ [R=301,L]
规则解释
^index.php/[0-9]{4}/[0-9]{2}/[0-9]{2}/(.*)$:精准匹配旧链接的结构——以index.php/开头,接着4位数字的年份、2位的月份、2位的日期,最后捕获标题部分到变量$1。/$$1/:重定向到根目录下的标题路径,结尾加上斜杠,和你的新链接格式保持一致。R=301:永久重定向,告诉搜索引擎更新索引,同时让浏览器缓存这个重定向关系,避免重复跳转。L:标记为最后一条规则,匹配到旧链接后就不再执行后面的规则,提升效率。
完整的.htaccess示例
把规则放在WordPress默认规则之前,整个文件大概是这样:
# 旧链接到新链接的永久重定向 RewriteEngine On RewriteRule ^index.php/[0-9]{4}/[0-9]{2}/[0-9]{2}/(.*)$ /$1/ [R=301,L] # 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] </IfModule> # END WordPress
注意事项和排查点
- 确保mod_rewrite开启:这个模块是Apache重定向的基础,如果没开启,规则完全不会生效。你可以通过phpinfo()页面查看,或者联系你的主机服务商确认。
- 权限设置正确:
.htaccess文件的权限一般设为644,确保Apache服务器能够读取它。 - 测试重定向:可以直接在浏览器输入旧链接,看是否自动跳转到新链接;也可以用命令行测试:
查看返回的curl -I https://domain.tld/index.php/2024/05/20/your-old-post-titleLocation响应头,确认是否指向正确的新链接。 - WordPress固定链接设置:确保你已经在WordPress后台把固定链接设置为「自定义结构」,并填入
/%postname%/,这样新链接才能正常工作。
这样配置后,旧书签和搜索引擎里的旧链接都会自动跳转到新链接,完全不会出现404页面啦!
内容的提问来源于stack exchange,提问作者Brandon Nolet
相关产品推荐
相关产品推荐

