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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:30:30