如何通过.htaccess实现PHP MVC强制HTTPS跳转与路由转发?
解决强制HTTPS跳转+MVC路由的.htaccess配置方案
问题根源
- 原有父目录规则缺少跳转标记,仅做内部重写而非外部跳转,浏览器感知不到协议切换
- 子目录的MVC路由规则执行优先级高于父目录的HTTPS规则,跳转逻辑被覆盖
- Cloudflare的
CF-Visitor头匹配格式存在问题,JSON字符串的双引号未做正则转义,导致条件判断失效
最终生效的配置(直接替换MVC程序根目录的.htaccess)
将以下内容覆盖原有子目录的.htaccess,确保先完成HTTPS跳转,再处理内部路由:
RewriteEngine On # 1. 强制跳转至HTTPS(兼容Cloudflare、反向代理场景) RewriteCond %{HTTPS} off RewriteCond %{HTTP:X-Forwarded-Proto} !https [OR] RewriteCond %{HTTP:CF-Visitor} !\"scheme\":\"https\" RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L] # 2. MVC路由规则:转发非文件/目录请求到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [L]
关键调整说明
- 规则顺序:HTTPS跳转必须放在路由规则之前,保证先完成协议切换再处理内部请求分发
- 跳转标记:添加
[R=301,L],R=301是永久跳转(利于搜索引擎收录),L表示匹配后停止执行后续规则 - Cloudflare头修正:将
!{"scheme":"https"}调整为!\"scheme\":\"https\",正则中需转义双引号才能正确匹配JSON格式的请求头 - 统一配置:所有规则放在MVC根目录的.htaccess中,避免父/子目录的规则冲突问题
验证方法
- 清除浏览器缓存(避免旧规则缓存干扰)
- 访问HTTP协议的站点地址,确认自动跳转至HTTPS
- 访问自定义路由(如
https://你的域名/home),检查index.php是否能正常获取到url参数
内容的提问来源于stack exchange,提问作者De Heger
相关产品推荐
相关产品推荐

