PHP导入脚本引发CORS跨域请求拦截问题求助
解决跨域CORS请求重复设置头的问题
你的核心问题是重复调用了setCommonHeaders()函数,导致浏览器收到重复的CORS响应头(尤其是Access-Control-Allow-Origin),触发跨域错误。
问题分析
- 在
get_flagged_policies.php中,你已经调用setCommonHeaders()完成了CORS头设置 - 导入
validate_session_token.php时,该脚本再次调用setCommonHeaders(),重复发送CORS相关响应头 - 浏览器对重复的
Access-Control-Allow-Origin头会直接判定为跨域错误,这就是你看到报错的根本原因
解决方案
方案1:移除验证脚本中的CORS头设置
直接修改validate_session_token.php,去掉重复的头设置逻辑,只保留会话校验函数:
<?php // 移除 require '../miscellaneous/common_headers.php'; 和 setCommonHeaders(); function validateSessionToken($conn, $session_token, $adminRequired) { if (session_status() == PHP_SESSION_NONE) { session_start(); } if (!isset($_SESSION['user_id'])) { exit('user_not_logged_in'); } // ... 脚本剩余部分 }
让主脚本get_flagged_policies.php统一处理CORS头,验证脚本仅负责会话校验逻辑,从根源避免重复设置头。
方案2:优化公共头函数,确保只执行一次
修改common_headers.php,添加静态标记变量,保证setCommonHeaders()仅实际执行一次:
<?php function setCommonHeaders() { static $headersSet = false; if ($headersSet) return; $allowedOrigins = [ 'https://php.<my website>.com', 'https://admin.<my website>.com', 'https://www.<my website>.com', ]; if (isset($_SERVER['HTTP_ORIGIN'])) { $origin = $_SERVER['HTTP_ORIGIN']; $parsedUrl = parse_url($origin); $host = $parsedUrl['host'] ?? ''; if (in_array($origin, $allowedOrigins) || preg_match('/(^|\.)<my website>\.com$/', $host)) { header("Access-Control-Allow-Origin: " . $origin); header("Access-Control-Allow-Credentials: true"); header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"); header("Access-Control-Allow-Methods: POST, GET"); header("Access-Control-Max-Age: 3600"); if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { header("HTTP/1.1 200 OK"); $headersSet = true; return; } } } else { header("Content-Type: application/json; charset=UTF-8"); } $headersSet = true; } ?>
这样即使多次调用setCommonHeaders(),也只会发送一次CORS头,避免触发浏览器的跨域错误。
额外优化建议
- 验证脚本中
exit('user_not_logged_in')直接输出文本可能导致前端解析异常,建议改为标准JSON格式的错误响应:
if (!isset($_SESSION['user_id'])) { http_response_code(401); echo json_encode(['error' => 'user_not_logged_in']); exit; }
- 建议在主脚本最顶部统一启动会话(
session_start()),避免函数内启动会话时因已有输出导致的潜在报错。
内容的提问来源于stack exchange,提问作者Leif Giering
相关产品推荐
相关产品推荐

