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
相关产品推荐
相关产品推荐

