添加Access-Control-Allow-Origin后仍遇CORS跨域请求阻塞问题求助
解决CORS Header缺失问题的排查步骤
我来帮你排查这个CORS问题——虽然你已经在getlocker.php里添加了header('Access-Control-Allow-Origin: *');,但还是有几个常见的坑可能导致这个错误,咱们一步步来:
1. 确认CORS Header真的被发送了
首先要排除“代码写了但没生效”的情况:
- 打开浏览器开发者工具,切换到Network标签,找到那个请求
getlocker.php的条目,查看它的Response Headers,确认是否存在Access-Control-Allow-Origin: *。 - 如果没看到这个Header,大概率是PHP代码在输出Header之前有内容输出(比如文件开头的空格、BOM字符,或者提前执行了
echo/print),导致Header无法被正确发送。可以在getlocker.php最顶部加上缓冲输出的代码,确保Header是第一个输出的内容:<?php ob_start(); // 开启输出缓冲 header('Access-Control-Allow-Origin: *'); // 你的其他PHP代码... ob_end_flush(); // 输出缓冲内容 ?> - 另外,检查是否存在Header冲突:如果同时设置了
Access-Control-Allow-Credentials: true和Access-Control-Allow-Origin: *,浏览器会拒绝这个响应(因为带凭证的请求不允许用*作为来源)。如果你的请求不需要带凭证,确保没有设置这个Header。
2. 检查Plesk服务器的额外配置
Plesk的Apache/nginx可能会覆盖PHP设置的Header:
- 登录Plesk面板,进入域名 > 网站与域名 > 你的域名 > Apache & nginx 设置,查看是否添加了自定义的CORS Header规则(比如Apache的
Header set指令,或者nginx的add_header指令)。如果服务器层面已经设置了Access-Control-Allow-Origin,可能会和PHP里的设置冲突,或者限制了来源。 - 可以尝试暂时移除服务器层面的CORS配置,只保留PHP里的设置,再测试。
3. 处理OPTIONS预检请求
浏览器在某些情况下会先发一个OPTIONS预检请求,确认服务器允许跨域请求。如果你的服务器没处理OPTIONS请求,也会报错:
- 在
getlocker.php开头添加OPTIONS请求的处理逻辑:if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type'); exit; } - 即使你的请求是GET,如果带有自定义参数或Header,浏览器也可能触发预检,所以处理OPTIONS请求很有必要。
4. 清除缓存
缓存可能会导致旧的响应被复用:
- 强制刷新浏览器页面(Ctrl+Shift+R),或者在开发者工具的Network标签勾选禁用缓存,重新测试请求。
- 清空Plesk的服务器缓存(比如OPcache、页面缓存),或者重启Apache/nginx服务,确保新的配置生效。
5. 检查PHP代码是否有错误
如果getlocker.php本身存在PHP错误,可能会导致Header无法发送:
- 在代码开头开启错误提示,排查潜在问题:
error_reporting(E_ALL); ini_set('display_errors', 1); - 确认
check_input函数存在且能正常返回值,避免因为函数报错导致页面提前输出内容,打断Header的发送。
内容的提问来源于stack exchange,提问作者Chiriac Ion
相关产品推荐
相关产品推荐

