如何用.htaccess重定向移除URL中重复的.html后缀?
解决URL中重复
.html的重定向问题 核心方案
分两步处理路径和查询参数中的重复.html,同时通过精准条件避免重定向循环:
具体Apache Rewrite规则
将以下规则添加到.htaccess文件头部:
# 处理路径中的重复.html RewriteCond %{THE_REQUEST} \s/+([^?\s]+?)(\.html)+(\?|\s) RewriteRule ^ %1.html?%{QUERY_STRING} [L,R=302] # 处理查询参数中的重复.html RewriteCond %{QUERY_STRING} ^(.*?)(\.html)+(.*)$ RewriteCond %{QUERY_STRING} !^(.*?)\.html(.*)$ [NC] RewriteRule ^ %{REQUEST_URI}?%1.html%3 [L,R=302]
规则细节说明
路径处理逻辑:
- 依赖
%{THE_REQUEST}(原始请求行)匹配,避免内部重写后的循环触发——因为内部重写会改变REQUEST_URI,但THE_REQUEST始终保留用户初始请求的原始字符串 - 正则
([^?\s]+?)(\.html)+捕获路径中带重复.html的部分,将其替换为仅含单个.html的路径 [L,R=302]标记为当前规则组的最后一条,并发送302临时重定向
- 依赖
查询参数处理逻辑:
- 第一个条件匹配参数中存在连续
.html的情况 - 第二个条件排除已经是单个
.html的参数,避免重复重定向 - 保留处理后的路径,将参数中的重复
.html合并为单个
- 第一个条件匹配参数中存在连续
对应测试案例验证
针对你给出的URL,重定向结果如下:
https://mywebsite.com/pages.html?limit=24&start=7440&t=3349.html.html.html→https://mywebsite.com/pages.html?limit=24&start=7440&t=3349.htmlhttps://mywebsite.com/pages.html.html.html?limit=24&start=8136&t=3358→https://mywebsite.com/pages.html?limit=24&start=8136&t=3358https://mywebsite.com/pages.html.html?limit=24&start=8136&t=3358.html.html.html.html→https://mywebsite.com/pages.html?limit=24&start=8136&t=3358.html
内容的提问来源于stack exchange,提问作者v3ntus
相关产品推荐
相关产品推荐

