使用访问控制源指定多个子域

Ben*_*rey 8 javascript php ajax header cross-domain

我试图允许访问我的网站上的每个子域,以允许跨子域AJAX调用.有没有办法指定网站的所有子域,*.example.com或者,当我列出多个域时,为什么以下不起作用:

header('Access-Control-Allow-Origin: http://api.example.com http://www.example.com');
Run Code Online (Sandbox Code Playgroud)

我已经阅读了以下似乎相似的问题,如果不是与此问题相同,除了我想访问子域这一事实,这个问题涉及一般域.

Access-Control-Allow-Origin多个源域?

如果上述问题是此问题的解决方案,那么我如何从标头中检索原点.似乎$ _SERVER ['HTTP_ORIGIN']非常不可靠,甚至不能跨浏览器.我需要能够在尝试使用javascript发送AJAX调用时在任何可能显示错误的浏览器中查看原点.

Ben*_*rey 20

此问题的解决方案是使用$ _SERVER ['HTTP_ORIGIN']变量来确定请求是否来自允许的域.然后它设置了这个:

$allowed_domains = [/* Array of allowed domains*/];

if (in_array($_SERVER['HTTP_ORIGIN'], $allowed_domains)) {
    header('Access-Control-Allow-Origin: ' . $_SERVER['HTTP_ORIGIN']);
}
Run Code Online (Sandbox Code Playgroud)


bei*_*lex 14

这就是我做到的.

Origin头是由浏览器指定,将包含要求对其他域的脚本的网站域名:

Origin: http://www.websiteA.com
Run Code Online (Sandbox Code Playgroud)

因此,您可以在服务器端脚本中将多个域"列入白名单":

$allowedOrigins = [
    "http://www.websiteA.com",
    "https://www.websiteB.com"
    // ... etc
];
Run Code Online (Sandbox Code Playgroud)

然后,您可以检查$_SERVER["HTTP_ORIGIN"]全局是否包含该白名单中的域:

if (in_array($_SERVER["HTTP_ORIGIN"], $allowedOrigins)) {
Run Code Online (Sandbox Code Playgroud)

并将Access-Control-Allow-Origin响应标头设置为任何Origin标头值:

header("Access-Control-Allow-Origin: " . $_SERVER["HTTP_ORIGIN"]);
Run Code Online (Sandbox Code Playgroud)

完整脚本:

$allowedOrigins = [
    "http://www.websiteA.com",
    "https://www.websiteB.com"
    // ... etc
];

if (in_array($_SERVER["HTTP_ORIGIN"], $allowedOrigins)) {
    header("Access-Control-Allow-Origin: " . $_SERVER["HTTP_ORIGIN"]);
}
Run Code Online (Sandbox Code Playgroud)

  • `$_SERVER['HTTP_ORIGIN')` 并不总是可用,这取决于浏览器。您可以将其替换为:```if (array_key_exists('HTTP_ORIGIN', $_SERVER)) { $origin = $_SERVER['HTTP_ORIGIN']; } else if (array_key_exists('HTTP_REFERER', $_SERVER)) { $origin = $_SERVER['HTTP_REFERER']; } else { $origin = $_SERVER['REMOTE_ADDR']; }``` (2认同)