htaccess配置:如何删除.html格式URL末尾残留的问号
问题原因
- 现有规则第一条的
RewriteCond %{QUERY_STRING} !^$限制了只有非空查询字符串才会触发重定向,而website.com/post.html?这类URL的查询字符串实际为空,所以不会匹配到现有规则,末尾问号无法被处理。 - 单纯靠重定向目标末尾加
?清除查询字符串的方式存在兼容问题,部分场景下仍会残留问号。
调整后的完整重写规则
<IfModule mod_rewrite.c> RewriteEngine On # 清理非白名单的查询参数 RewriteCond %{QUERY_STRING} !(^|&)srp= RewriteCond %{QUERY_STRING} !(^|&)q= RewriteRule ^(.+?)\.html$ https://%{HTTP_HOST}/$1.html [L,R=301,QSD] # 清理.html后缀后多余的非amp路径 RewriteRule ^(.+?)\.html(?!/amp/).+$ https://%{HTTP_HOST}/$1.html [L,R=301,QSD] </IfModule>
调整说明
- 删除了第一条规则中
RewriteCond %{QUERY_STRING} !^$的限制,兼容带空查询字符串(末尾带问号)的场景 - 用Apache 2.4及以上版本支持的
QSD(查询字符串丢弃)标志替代原有的末尾加?的方式,会彻底清除所有查询参数,不会残留问号 - 合并了重复的
<IfModule mod_rewrite.c>块,规则结构更简洁
如果你使用的是不支持QSD标志的Apache 2.2版本,可以把规则末尾的
[L,R=301,QSD]换回[L,R=301],同时在重定向目标URL末尾加?,再额外新增一条专门处理末尾带问号的规则即可:RewriteCond %{THE_REQUEST} \?\ HTTP RewriteRule ^(.+?)\.html$ https://%{HTTP_HOST}/$1.html [L,R=301]
内容的提问来源于stack exchange,提问作者Sartyy
相关产品推荐
相关产品推荐

