这都是老生常谈的东西了。我还在踩坑,记录一下。
我在项目入口明明写了如下代码:
// 处理预检请求 (OPTIONS)
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {header("Access-Control-Allow-Origin: https://xxx.vip");header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");header("Access-Control-Max-Age: 3600"); // 预检缓存时间header("Vary: Origin"); // 修复缓存问题http_response_code(204); // 明确状态码exit;
}// 处理正式请求
header("Access-Control-Allow-Origin: xxx.vip");
header("Access-Control-Expose-Headers: Content-Length, X-Custom-Header"); // 按需暴露头
header("Vary: Origin");//此代码可以解决浏览器一个接口同时请求2次的问题 start
header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Pragma: no-cache");
//此代码可以解决浏览器一个接口同时请求2次的问题 end
此代码经过测试是可以正常使用的。
但是现在浏览器跨域访问我的接口,依然报跨域错误,问了各大AI,也做了多重尝试,结果还是不行。
我这牙都块咬碎了!
现象:
这是我的代码:
// 处理预检请求 (OPTIONS)
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
header("Access-Control-Allow-Origin: xxx22.vip");
header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
header("Access-Control-Max-Age: 3600"); // 预检缓存时间
header("Vary: Origin"); // 修复缓存问题
http_response_code(204); // 明确状态码
exit;
}// 处理正式请求
header("Access-Control-Allow-Origin: xxx2.vip");
header("Access-Control-Expose-Headers: Content-Length, X-Custom-Header"); // 按需暴露头
header("Vary: Origin");这是浏览器响应头:
access-control-allow-origin:
https://wx_customer_service_monitor1.excn.vip
access-control-expose-headers:
Content-Length, X-Custom-Header
content-encoding:
gzip
content-type:
text/html; charset=utf-8
date:
Thu, 27 Feb 2025 09:00:09 GMT
server:
nginx
vary:
Accept-Encoding
vary:
Origin当前现象:
浏览器请求的api接口返回:跨域检测无效(我的代码没有输出这行代码)
确定用了几种方式,以上代码改来改去,翻来覆去测,还是不行,最后带着实在不相信是框架代码的问题去复制了“跨域检测无效”,去代码里面搜索了一番,结果!! 卧槽~!!!!,竟然在代码里面做了跨域处理,只是这跨域处理不对,导致我在入口怎么改都没用!!
我的天!竟然是很久以前埋下的坑,我就说我不会犯这种错误,这下打脸了!啪啪啪!!!
总结:有时候遇到反复解决不了的问题还是多怀疑下自己。
END