.htaccess配置失效:需实现http跳https、去尾斜杠、无.html后缀访问
现有配置的核心问题
- 规则执行顺序完全错位:先跑去斜杠跳转、再跑HTTPS强制跳转,会让每个访问请求多走一次冗余301,甚至可能因为跳转节点不连续触发浏览器重定向循环报错
- 跳转规则里硬编码域名和动态主机变量混用,一旦访问路径和规则预期不匹配,直接触发死循环
- .html后缀补全规则没有加真实文件、目录的校验,遇到已经存在的静态资源请求会被错误重写,直接出404
- 重复写了两次
RewriteEngine On,不仅冗余,部分Apache版本会因为重复指令重置规则栈,打乱所有规则的执行顺序
修正后三规则并行生效的完整.htaccess配置
<IfModule mod_rewrite.c> RewriteEngine On # 声明站点部署根路径,避免子目录场景下路径解析错误 RewriteBase / # 规则1:强制所有HTTP请求跳转到HTTPS RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://www.gasstudio.co.uk/$1 [R=301,L] # 规则2:非目录类URL自动去除末尾斜杠,301永久跳转 RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)/$ https://www.gasstudio.co.uk/$1 [R=301,L] # 规则3:自动匹配无.html后缀的请求,映射到对应实际页面文件 # 跳过已经匹配到真实文件/目录的请求,避免重写循环 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} !\.[a-zA-Z0-9]{2,4}$ RewriteRule ^(.*)$ $1.html [L] </IfModule>
配置实际执行逻辑
- 所有带301状态码的跳转规则全部放在最前端,确保用户第一次请求就被导向最终的标准URL(HTTPS、无多余斜杠),没有冗余跳转链路
- 去斜杠规则严格判断「当前请求路径不是服务器上真实存在的目录」,不会误伤本来就需要带斜杠的目录类访问(比如静态资源存储目录、文档索引目录这类场景)
- .html映射属于服务器内部重写,全程不会修改用户浏览器地址栏显示的URL;加了真实文件校验后,遇到已经能直接匹配的资源就会跳过重写,从根源避免循环
- 所有301跳转统一指向主域名,不会因为用户输入不同主机头(比如裸域名、http开头的域名)出现跨站跳转问题
内容的提问来源于stack exchange,提问作者Screech
相关产品推荐
相关产品推荐

