Apache服务器子目录.htaccess配置HTTP跳转HTTPS不生效问题求助
问题根源
1. 规则顺序错误被截断
根目录.htaccess中存在RewriteRule ^(.*)\.php$ - [L]规则,所有.php后缀的请求命中该规则后,会触发L标记直接终止后续所有重写规则执行。你之前将HTTPS跳转规则放在这条规则之后,或者放在子目录的.htaccess中(子目录规则本身晚于根目录规则执行),因此访问/FOLDER/index.php时跳转逻辑根本没有运行。而访问/FOLDER/SUBFOLDER属于目录请求,未命中.php规则,所以跳转可以正常触发,完全匹配你遇到的特殊现象。
2. 子目录规则写法错误
放置在/FOLDER目录下的.htaccess,RewriteRule的匹配路径是相对于当前目录的,不会包含前面的FOLDER/前缀,你写的RewriteRule FOLDER/(.*)完全匹配不到任何请求,自然不会生效。
3. 重定向循环成因
从你提供的环境参数中的HTTP_X_FORWARDED_PROTO、HTTP_X_FORWARDED_PORT字段可以确认,你的服务器前端存在反向代理/负载均衡,客户端到代理走HTTPS,代理到后端Apache走HTTP,部分场景下后端Apache拿到的HTTPS变量状态和客户端实际请求的协议不一致,导致HTTPS请求仍然被判定为HTTPS off,反复触发跳转形成循环。
修复方案
- 将HTTPS跳转规则放在根目录
.htaccess的最开头,放在所有现有规则之前,配置内容如下:
RewriteEngine On # 兼容代理架构的HTTPS协议判断 RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP:X-Forwarded-Proto} !https # 全局跳转至对应HTTPS地址,自动适配域名和请求路径 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
- 删除
/FOLDER子目录下你之前创建的.htaccess跳转规则,避免规则冲突。 - 测试前清理浏览器缓存,避免之前的301永久跳转被缓存影响测试结果。
内容的提问来源于stack exchange,提问作者Alarik
相关产品推荐
相关产品推荐

