必须在web服务器层(nginx或apache)配置强制https跳转,codeigniter框架本身不处理协议跳转;nginx用return 301 https://$host$request_uri;,apache用.htaccess重写或redirect permanent,并需验证配置语法与响应头。

要在CodeIgniter应用中实现所有HTTP请求自动跳转到HTTPS,必须在Web服务器层(Nginx或Apache)完成,框架本身不处理协议跳转;直接在CI路由文件里写重定向逻辑不仅无效,还会因请求已进入PHP而丧失安全性与性能。
Nginx环境下强制HTTPS跳转
这一步操作起来很简单,直接编辑Nginx站点配置文件,在监听80端口的server块中添加return指令即可。
第一步:打开你的站点配置文件,通常位于 /etc/nginx/conf.d/your-site.conf 或 /etc/nginx/sites-enabled/your-site。
第二步:确认该配置中已存在一个监听443端口的HTTPS server块,且SSL证书配置正确(否则跳转后页面将无法加载)。
第三步:在同一个配置文件中,新增或修改监听80端口的server块,内容如下:
【server_name必须与HTTPS块完全一致,否则$host变量会跳转到错误域名】
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
注意:这里用的是 $request_uri 而非 $uri,因为前者包含完整路径+查询参数(如 ?id=123&ref=abc),后者会丢失问号后的全部内容。若只写 https://$host$uri,用户访问 http://example.com/search?q=test 将跳转为 https://example.com/search,参数彻底消失。
Apache环境下启用HTTPS强制跳转
方法一:使用 .htaccess 文件(适用于共享主机或无服务器管理权限场景)
在项目根目录(即public目录)下找到或新建 .htaccess 文件,插入以下三行:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
方法二:在虚拟主机配置中直接设置(推荐,性能更好)
编辑Apache虚拟主机配置(如 /etc/apache2/sites-available/your-site.conf),在
Redirect permanent / https://example.com/
【此处必须用全域名(如 https://example.com/),不能写 https://%{HTTP_HOST}/,否则在多域名共用同一配置时可能跳转异常】
验证跳转是否生效
执行 sudo nginx -t(Nginx)或 sudo apache2ctl configtest(Apache)检查语法,无误后重启服务:sudo systemctl restart nginx 或 sudo systemctl restart apache2。
用curl命令测试真实响应头:
curl -I http://your-domain.com/about
观察返回中是否含 HTTP/1.1 301 Moved Permanently 和 Location: https://... 字段。若返回200或仍为HTTP地址,说明配置未生效或被其他规则覆盖。










