CodeIgniter中使用Ajax传递URL时遭遇412错误求解决
解决Ajax POST请求返回412 Precondition Failed错误的方案
首先,412错误代表前置条件不满足,服务器拒绝处理你的请求。结合你使用CodeIgniter框架(从site_url调用能看出来),最常见的原因和解决方案如下:
1. 缺失CSRF令牌验证(最可能的原因)
CodeIgniter默认开启了CSRF保护机制,所有POST请求必须携带有效的CSRF令牌才能被服务器接受。你的Ajax请求里没有传递这个令牌,这大概率是触发412错误的元凶。
修复步骤:
- 先确保页面中存在CodeIgniter生成的CSRF隐藏字段(如果用
form_open()生成表单,框架会自动添加;如果没有表单,手动添加):
<input type="hidden" name="<?php echo $this->security->get_csrf_token_name(); ?>" value="<?php echo $this->security->get_csrf_hash(); ?>">
- 修改你的Ajax代码,在
data中加入CSRF令牌:
$(function() { $(".check-multi").change(function() { // 获取CSRF令牌的名称和值 const csrfName = "<?php echo $this->security->get_csrf_token_name(); ?>"; const csrfHash = $('input[name="' + csrfName + '"]').val(); $.ajax({ type: "POST", url: "<?php echo site_url('adm/updateproperty'); ?>", async: true, data: { link: $(this).data('link'), [csrfName]: csrfHash // 加入CSRF令牌 }, success: function(msg) { alert('Success'); if (msg!= 'success') { alert('Fail'); } }, error: function(xhr) { // 新增错误回调,方便查看具体错误信息 console.log(xhr.responseText); } }); }); });
2. 检查服务器端的前置条件校验
查看你的adm/updateproperty控制器方法,有没有对link参数设置前置校验逻辑——比如要求link必须是非空、符合特定格式(如包含http/https),如果不满足就返回412错误。
举个例子,服务器端可能有类似代码:
if (!filter_var($this->input->post('link'), FILTER_VALIDATE_URL)) { $this->output->set_status_header(412); exit('Invalid URL format'); }
如果是这种情况,你需要确保前端传递的link值符合服务器的校验规则,或者调整服务器端的校验逻辑。
3. 确认请求头和参数格式
虽然概率较低,但可以尝试明确指定请求头的Content-Type,确保和服务器预期一致:
$.ajax({ // 其他配置... headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, // 其他配置... });
另外,建议你打开浏览器的开发者工具(F12),查看Network标签下该请求的响应内容——服务器通常会在响应体里说明具体的前置条件失败原因,这能帮你更快定位问题。
内容的提问来源于stack exchange,提问作者Cool Guy
相关产品推荐
相关产品推荐

