You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ajax请求自定义Header无法在PHP中正常获取的技术问询

这个问题我之前也碰到过,本质是跨域请求的预检(OPTIONS)请求没处理好导致的,来一步步解决:

问题根源

当你发送带自定义Header(比如HASH)的跨域请求时,浏览器会先发起一个OPTIONS预检请求,用来确认服务器是否允许这个自定义Header、请求方法等。如果服务器没有正确响应这个OPTIONS请求,或者没在响应头里声明允许HASH,浏览器要么不会发送后续的GET请求,要么你的GET请求里就拿不到这个自定义Header。

解决方案:修改你的api.php

你需要在api.php里先处理OPTIONS请求,并添加正确的CORS响应头,确保允许自定义的HASH头。修改后的代码如下:

<?php
// 处理跨域CORS头
header("Access-Control-Allow-Origin: *"); // 允许所有域名跨域,生产环境建议改为具体域名
header("Access-Control-Allow-Methods: GET, OPTIONS"); // 允许的请求方法
header("Access-Control-Allow-Headers: HASH, Content-Type"); // 必须明确列出允许的自定义Header

// 如果是OPTIONS预检请求,直接返回200即可
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(200);
    exit;
}

// 处理GET请求,获取头信息
$headers = getallheaders();
echo json_encode($headers);
?>

关键说明:

  • Access-Control-Allow-Headers:这里必须明确包含你自定义的HASH头,不然浏览器会认为服务器不允许这个Header,导致后续请求无法携带它。
  • Access-Control-Allow-Origin:生产环境不要用*,换成你实际的前端域名(比如http://localhost:8080),更安全。
  • OPTIONS请求不需要返回业务数据,直接返回200状态码并退出即可。

前端代码的小优化

你的前端Ajax代码里processData: false对于GET请求来说是多余的(GET请求没有请求体,不需要处理表单数据),可以去掉,不影响功能,但代码更简洁:

$.ajax({
    url: 'api.php',
    type: 'get',
    beforeSend: function(xhr) {
        xhr.setRequestHeader('HASH', '5c268592cd4db9c7f6b813bb689005c6');
    },
    success: function(data) {
        console.log(data);
    },
    error: function(xhr, status, error) {
        console.log(xhr);
    }
});

这样修改后,你就能在后端拿到HASH头了。

内容的提问来源于stack exchange,提问作者shaNnex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:00:23