.htaccess配置问题:HTTP与HTTPS请求的行为差异排查求助
问题分析与修复方案
原因解释
你的.htaccess规则顺序导致了HTTP和HTTPS访问的行为差异:
- 当用HTTP访问根路径
/时,先触发了内部重写规则(把/映射到src/public/index.php),之后才执行HTTP转HTTPS的重定向。此时%{REQUEST_URI}已经被替换成了内部重写后的/src/public/index.php,所以重定向后的URL就会带上这个真实路径。 - 当用HTTPS访问时,不会触发HTTP转HTTPS的规则,直接执行内部重写,而内部重写是服务器端的隐式操作,浏览器地址栏会保持显示原始的
/。
修复步骤
把HTTP转HTTPS的重定向规则移到所有重写规则的最顶部,确保先完成协议跳转,再处理内部路径映射。修改后的.htaccess内容如下:
RewriteEngine On RewriteBase / # 先处理HTTP -> HTTPS重定向 RewriteCond %{HTTPS} !=on RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # / -> src/public/index.php RewriteRule ^$ src/public/index.php [L] # /index.php -> src/public/index.php RewriteRule ^index.php$ src/public/index.php [L] RewriteRule ^([a-zA-Z0-9]+)$ index.php?campaign=$1 [L] RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ index.php?campaign=$1&id=$2 [L] ErrorDocument 404 /src/public/404.php ErrorDocument 403 /src/public/404.php <FilesMatch config.ini|composer.json|config.php> Order deny,allow Deny from all </FilesMatch>
额外说明
- 301是永久重定向,浏览器会缓存规则,测试前建议清除浏览器缓存,或者先用
R=302临时重定向验证效果,确认正常后再改回301。 - 确保服务器已启用
mod_rewrite模块,否则所有重写规则无法生效。
内容的提问来源于stack exchange,提问作者Maniek910
相关产品推荐
相关产品推荐

