codeigniter本身不自动处理http→https重定向,必须依赖web服务器(如apache/nginx配置)或网关(如istio的httpsredirect: true)实现;php层redirect()仅用于应用内跳转,无法强制协议切换,且ci3不支持完整url跳转,ci4需显式调用send()并校验域名。

CodeIgniter 本身不自动处理 HTTP → HTTPS 重定向,必须靠外部机制或手动干预。框架只管生成链接和响应,不控制底层协议跳转。
CI3 中用 redirect() 强制跳 HTTPS?别试了
CI3 的 redirect() 函数默认只接受相对路径或同域 URL,传入 'https://example.com' 会被当作本地路由解析,大概率 404 或跳回首页。它不是设计来干这事的。
- 想“伪强制”——比如登录后跳
https://页面?可以,但得先确保当前请求已是 HTTPS,否则跳过去仍可能被中间人劫持 - 直接在控制器里写
redirect('https://example.com')是无效的,不会发 301/302 到浏览器 - 若硬要走框架流程,只能先判断协议:
if ($_SERVER['HTTPS'] !== 'on') { redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); }—— 但这依然会失败,因为redirect()不认完整 URL
真正生效的 HTTPS 重定向只有两种方式
一种是 Web 服务器层(推荐),一种是 PHP 层手动发头(慎用)。
- Apache:在
.htaccess里加两行:RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] - Nginx:在 server 块里加
return 301 https://$host$request_uri; - PHP 手动跳转(仅限 CI3 无法改配置时):
header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); exit;—— 注意必须exit,否则后续代码继续执行,可能造成 session 写入冲突或重复查询 - CI4 用户注意:
redirect()->to('https://...')->send()可以用,但前提是已启用外部重定向开关,且不能漏掉->send(),否则静默失败
CI4 的 redirect() 外部跳转必须显式允许
CI4 默认禁止跳外部域名,哪怕只是换协议也不行。抛出的错误是 InvalidArgumentException: Only relative or base URLs are allowed。
- 启用方式不是全局配置,而是在每次调用前加白名单校验:
$url = 'https://example.com'; if (filter_var($url, FILTER_VALIDATE_URL) && parse_url($url, PHP_URL_HOST) === 'example.com') { redirect()->to($url)->send(); } -
redirect()在 CI4 是响应服务实例,不是函数,不能直接redirect('...') - 漏掉
->send()是最常见坑:控制器继续往下跑,session 可能被重写,数据库可能再查一遍,浏览器却没跳转 - 别把用户输入(如
$_GET['next'])直接塞进to(),哪怕做了FILTER_VALIDATE_URL,也得比对parse_url($url)['host']是否在可信域名列表里
协议跳转这件事,框架越轻量,越该交给 Web 服务器或网关(比如 Istio 的 httpsRedirect: true)。CI 的 redirect() 是为应用内导航设计的,不是为 TLS 升级兜底的。强行在 PHP 层做,容易漏掉 header 已发送、空格/BOM、exit 遗漏等低级但致命的问题。











