CodeIgniter POST表单提交报Undefined index: HTTP_REFERER,需跳转外部站点
解决CodeIgniter POST表单提交后出现Undefined index: HTTP_REFERER错误
错误原因
这个错误是因为代码中直接访问了$_SERVER['HTTP_REFERER']变量,但该变量并非在所有请求场景下都存在——比如用户直接提交表单、浏览器禁用Referer头时,这个变量就会未定义,从而触发错误。
解决方案
1. 安全获取Referer值
如果代码中需要用到Referer,不要直接访问$_SERVER['HTTP_REFERER'],改用CodeIgniter提供的安全方法:
// 方式1:使用Input类,变量不存在时返回NULL $referer = $this->input->server('HTTP_REFERER', TRUE); // 方式2:先判断变量是否存在,避免报错 $referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : '';
2. 修正表单与提交逻辑
- 不要在视图中处理POST请求:将表单提交的处理逻辑移到控制器中,视图仅负责渲染表单。示例控制器代码:
public function submit_form() { if ($this->input->post()) { // 可添加表单验证、数据处理逻辑 // 重定向到外部站点 redirect('https://目标外部站点地址', 'refresh'); } // 加载视图展示表单 $this->load->view('你的视图文件名'); } - 动态生成CSRF Token:视图中的CSRF Token不要硬编码,改用CodeIgniter方法动态生成,避免过期失效:
<form action="" method="post"> <input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>"> <input type="text" name="username" class="form-control auth-form-input"> <button type="submit" class="btn btn-md btn-custom btn-block">submit</button> </form>
3. 检查CSRF配置(若开启CSRF保护)
如果config.php中开启了$config['csrf_protection'] = TRUE;,确保:
- 表单提交的目标地址是当前站点内的控制器方法(重定向到外部站点的逻辑放在控制器中完成)
- 不要依赖Referer进行CSRF验证,CodeIgniter默认CSRF验证逻辑不依赖Referer,若自定义了相关逻辑,需调整为兼容无Referer的场景。
内容的提问来源于stack exchange,提问作者ebrahim babavand
相关产品推荐
相关产品推荐

