如何通过.htaccess配置移除网站所有URL中的.html后缀并保留查询参数
正确移除URL中.html后缀的配置方案
你之前配置失效的核心原因有两个:
- 单独使用三组配置的任意一组,都只覆盖了一半逻辑:要么只做了带后缀跳转无后缀,没有做无后缀的内部映射;要么只做了内部映射,没有做旧地址跳转
- 若你测试时返回Nginx目录列表,说明你的站点运行在Nginx服务器上,Nginx原生不支持.htaccess配置,你之前的.htaccess修改完全不会生效,需要直接修改Nginx站点配置文件。
场景1:站点运行在Apache服务器
需要同时配置「带.html后缀地址301跳转到无后缀地址」+「无后缀地址内部映射到对应.html文件」两部分逻辑,完整配置如下:
RewriteEngine On # 1. 处理带.html后缀的请求301跳转到无后缀地址,自动保留查询参数 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^/?(.*)\.html$ /$1 [L,R=301,QSA] # 2. 处理无后缀的请求,内部映射到对应的.html文件,不改变地址栏URL RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{DOCUMENT_ROOT}/$1.html -f RewriteRule ^/?([^\.]+)$ $1.html [NC,L,QSA]
配置前需确认Apache已经开启mod_rewrite模块,且站点配置中开启了AllowOverride All允许.htaccess生效。
场景2:站点运行在Nginx服务器
直接修改Nginx站点的server配置块,添加以下规则:
# 1. 带.html后缀的请求301跳转到无后缀地址,自动保留查询参数 if ($request_uri ~ ^/(.*)\.html(\?.*)?$) { return 301 /$1$is_args$args; } # 2. 无后缀请求内部映射到.html文件 location / { try_files $uri $uri.html $uri/ =404; }
修改后重启Nginx即可生效。
注意事项
- 301跳转是永久跳转,浏览器会长期缓存,测试时请使用浏览器无痕模式,或者每次修改配置后清空浏览器缓存避免旧缓存影响测试结果
- 若使用Apache,需确认站点目录权限配置正确,.htaccess文件有可读权限
官方文档参考
Apache侧的.htaccess以及rewrite规则,可以直接搜索Apache官方的mod_rewrite模块文档、.htaccess使用指南查看官方规范;Nginx侧的rewrite规则可以搜索Nginx官方ngx_http_rewrite_module文档查看规范。
内容的提问来源于stack exchange,提问作者Pioupia
相关产品推荐
相关产品推荐

