URL重写求助:将丑陋URL重定向至干净URL
解决URL美化后的重复内容问题:重定向丑陋URL到干净URL
没问题,这个重复内容的坑确实是做URL美化时很容易遇到的——你已经实现了把about.html转发到index.php?page=about,但反过来用户直接访问丑陋URL时还能打开,不仅影响SEO,也不利于统一用户体验。下面给你一套完整的解决方案,我会逐行解释原理:
完整的.htaccess配置
把这段代码放在你的.htaccess文件里(如果已经有RewriteEngine On,就不用重复写了):
RewriteEngine On # 第一步:将丑陋URL永久重定向到干净URL RewriteCond %{THE_REQUEST} ^GET\ /index\.php\?page=([^&\ ]+) RewriteRule ^index\.php$ /%1.html? [R=301,L] # 第二步:你的原有URL美化规则(保持不变) RewriteRule ^(.*)\.html$ index.php?page=$1 [L]
逐行解释原理
1. 重定向规则的核心逻辑
RewriteCond %{THE_REQUEST} ^GET\ /index\.php\?page=([^&\ ]+)
这里用%{THE_REQUEST}来匹配用户实际发送的原始请求(而不是内部重写后的请求),确保只有当用户直接输入index.php?page=xxx时才触发重定向。([^&\ ]+)是正则捕获组,用来提取page参数的值(比如about)。RewriteRule ^index\.php$ /%1.html? [R=301,L]%1对应上面捕获组提取的page值,所以会把index.php?page=about重定向到/about.html- 末尾的
?是为了清空原有的查询字符串,避免重定向后URL变成about.html?page=about R=301表示永久重定向,这对SEO非常重要——告诉搜索引擎about.html是首选URL,避免重复内容被惩罚L表示执行完这条规则后就停止处理后续规则,防止循环
2. 为什么不会触发循环?
因为THE_REQUEST记录的是用户最初的请求,当用户访问about.html时,内部会被重写到index.php?page=about,但此时THE_REQUEST还是GET /about.html HTTP/1.1,不会匹配到上面的重定向条件,所以不会出现“重定向→内部重写→再重定向”的死循环。
测试小技巧
刚开始测试时可以把R=301改成R=302(临时重定向),因为301会被浏览器缓存,如果你中途需要调整规则,用302可以避免缓存带来的麻烦,确认一切正常后再改回301。
内容的提问来源于stack exchange,提问作者Tolkar
相关产品推荐
相关产品推荐

