
本文详细讲解如何在 codeigniter 项目中安全、可靠地强制启用 https,涵盖 .htaccess 重写规则编写、常见陷阱规避及配套配置优化,确保 url 正确跳转且应用功能不受影响。
本文详细讲解如何在 codeigniter 项目中安全、可靠地强制启用 https,涵盖 .htaccess 重写规则编写、常见陷阱规避及配套配置优化,确保 url 正确跳转且应用功能不受影响。
在生产环境中,强制 HTTPS 不仅是安全合规(如 GDPR、PCI-DSS)的基本要求,更是防止会话劫持、中间人攻击的关键措施。对于基于 CodeIgniter 搭建的 Web 应用,最高效、低侵入的方式是通过 Apache 的 .htaccess 文件实现协议重定向——无需修改业务逻辑,也无需依赖 PHP 层判断。
✅ 正确的 HTTPS 强制重写规则
将以下规则置于您当前 .htaccess 文件顶部(务必在其他重写规则之前),并确保 mod_rewrite 已启用:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
# Step 1: 强制 HTTPS(优先级最高)
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Step 2: 可选 — 同时统一 www 前缀(若需)
# RewriteCond %{HTTP_HOST} !^www\. [NC]
# RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
# Step 3: CodeIgniter 路由入口(保持原有逻辑不变)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^/(favicon\.ico|apple-touch-icon.*\.png)$ [NC]
RewriteRule ^(.+)$ index.php?p=$1 [QSA,L]
</IfModule>? 关键说明:
- RewriteCond %{HTTPS} off 是判断非 HTTPS 请求的核心条件,比检查 $_SERVER['HTTPS'] 更底层、更可靠;
- 使用 ^(.*)$(或 ^(.*)$)而非 (.+) 可匹配空路径(如首页 /),避免根目录跳转失败;
- [R=301] 表示永久重定向,有利于 SEO;生产环境建议使用 301,开发调试阶段可临时改为 302;
- RewriteBase / 必须与您的部署路径一致:若 CodeIgniter 部署在子目录(如 /app/),请改为 RewriteBase /app/。
⚠️ 注意事项与常见问题排查
避免重复跳转或无限重定向:确保 HTTPS 规则位于所有其他重写规则最上方。若存在多个 RewriteRule,Apache 按顺序执行,错误顺序会导致 https → http → https… 循环。
-
代理/负载均衡场景:若您网站部署在 Nginx + Apache 组合、CDN(如 Cloudflare)或反向代理后,%{HTTPS} 可能始终为 off。此时需配合 X-Forwarded-Proto 判断:
RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] -
CodeIgniter 配置同步更新:虽然 .htaccess 控制了访问层跳转,但为保障生成的 URL(如 site_url()、base_url())默认输出 HTTPS 链接,建议在 application/config/config.php 中显式设置:
$config['base_url'] = 'https://' . $_SERVER['HTTP_HOST'] . str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
或更健壮地兼容本地开发(非 HTTPS):
$is_https = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on'; $protocol = $is_https ? 'https' : 'http'; $config['base_url'] = $protocol . '://' . $_SERVER['HTTP_HOST'] . str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
-
Cookie 安全强化(推荐):启用 HTTPS 后,应同步开启 Cookie 的 Secure 标志,防止明文传输:
$config['cookie_secure'] = TRUE; // 在 config.php 中设置
✅ 验证是否生效
- 直接访问 http://yoursite.com/some-page → 应自动 301 跳转至 https://yoursite.com/some-page;
- 浏览器地址栏显示锁形图标,且开发者工具 Network 标签中状态码为 301;
- 检查响应头中是否包含 Strict-Transport-Security: max-age=31536000; includeSubDomains(可选,通过额外 Header 设置增强安全性)。
遵循以上配置,即可零侵入、高稳定性地为 CodeIgniter 应用启用全站 HTTPS,兼顾安全性、SEO 及用户体验。


















