升级服务器后CodeIgniter 2.2.0的HTTPS跳转异常问题求助
核心原因
CodeIgniter 2.2.0是2014年的旧版本,原生没有适配HTTPS环境的自动识别逻辑,加上PHP7.4的兼容性差异,导致框架生成URL时默认使用HTTP,触发302跳转;若.htaccess配置重复强制HTTPS,就会引发重定向循环。
具体修复步骤
1. 强制设置HTTPS的Base URL
打开application/config/config.php,不要依赖框架自动检测,直接指定HTTPS的base_url:
$config['base_url'] = 'https://你的域名/';
同时确保$config['uri_protocol']设置正确,推荐用AUTO或REQUEST_URI:
$config['uri_protocol'] = 'REQUEST_URI';
2. 修复框架的HTTPS识别逻辑
CI2默认的is_https()函数(位于system/core/Input.php)仅检测$_SERVER['HTTPS'] === 'on',但部分服务器(如带反向代理的主机)会通过HTTP_X_FORWARDED_PROTO传递HTTPS标识,需要修改这个函数:
public function is_https() { if (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on') { return TRUE; } elseif (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { return TRUE; } elseif (isset($_SERVER['HTTP_X_FORWARDED_SSL']) && strtolower($_SERVER['HTTP_X_FORWARDED_SSL']) === 'on') { return TRUE; } return FALSE; }
3. 修正.htaccess配置(避免重定向循环)
使用以下配置,先强制HTTPS再处理CI的URL重写,确保逻辑不冲突:
RewriteEngine On # 仅当非HTTPS时强制跳转,避免循环 RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # CodeIgniter URL重写(移除index.php) RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
注意:不要在框架内部(如控制器)和.htaccess同时做HTTPS强制跳转,否则会触发“重定向过多”。
4. 检查框架重定向函数的URL生成
CI2的redirect()函数依赖site_url()生成地址,如果base_url未正确设置HTTPS,会生成HTTP链接。可以修改system/helpers/url_helper.php里的site_url()函数,强制替换为HTTPS:
function site_url($uri = '') { $CI =& get_instance(); $url = $CI->config->site_url($uri); // 强制替换为HTTPS return str_replace('http://', 'https://', $url); }
5. 排查PHP7.4兼容性隐性错误
开启CI的日志功能,检查是否有静默错误:
在application/config/config.php中设置:
$config['log_threshold'] = 2; // 记录严重错误和运行时错误 $config['log_path'] = './application/logs/';
查看application/logs下的日志,重点排查:
create_function()相关错误(PHP7.2+已移除该函数,CI2部分代码使用了它)- 未定义的变量、数组索引
- 过时的语法(如
$this->some_function(&$param)的引用传递)
这些隐性错误可能导致框架异常跳转,需要手动替换或修复相关代码。
总结
优先通过强制设置HTTPS的base_url和修复框架HTTPS识别逻辑解决跳转问题,再配合正确的.htaccess配置避免循环,最后通过日志排查PHP7.4的兼容性隐性错误,即可解决CI2.2.0在新环境下的HTTPS跳转问题。
内容的提问来源于stack exchange,提问作者rob - not a robber

