跨域XMLHttpRequest,Access-Control-Allow-Origin标头和$ _SERVER [' HTTP_ORIGIN']

时间:2014-12-15 11:07:02

标签: javascript php ajax cross-domain

我需要一个脚本,通过XMLHttpRequest将信息传递到托管在不同域上的请求页面。关于这个问题有很多问题和答案,但我找到的没有一个完全回答了我的问题。

在网上搜索让我发现我必须通过诸如
的标题允许这些域名 header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Origin: http://example.com");

由于我需要多个外部域名,但我仍然认为*过于开放,因此进一步的研究为我提供了依赖于$_SERVER['HTTP_ORIGIN']与授权值的服务器端比较的解决方案。 (在StackOverflow上:例如Access-Control-Allow-Origin Multiple Origin Domains?

但我发现在php manuel(http://php.net/manual/fr/reserved.variables.server.php)中没有提到$_SERVER['HTTP_ORIGIN'],我的测试显示该条目并不总是设置。

所以我的问题是:
- $_SERVER['HTTP_ORIGIN']超全球集是什么时候? - 全球可靠吗?...或依赖客户端浏览器?

似乎(但仅凭经验,从我的测试/ Firefox 34.0.5和ios Safari),它只在“需要”时设置,即当请求实际来自另一个域时。至少在使用时。

请参阅下面的简短代码摘要,以帮助理解需要 - 如果$_SERVER['HTTP_ORIGIN']未定义,则不会发送标头   (假设它实际上不是跨域调用,不应该有任何问题),
- 发送"允许"标头如果已定义并属于接受域的数组。

if(isset($_SERVER['HTTP_ORIGIN'])) {// in case of cross domain ajax call
    $http_origin = $_SERVER['HTTP_ORIGIN']; 
    if(in_array($http_origin, $ajaxAllowedDomains))
       { header("Access-Control-Allow-Origin: $http_origin"); }
}

1 个答案:

答案 0 :(得分:1)

  

什么时候是$_SERVER['HTTP_ORIGIN']超全球集?

当HTTP请求包含Origin标头时。浏览器在使用XMLHttpRequest发出跨域请求时会设置一个。

  

全球可靠吗?

在您可能想要设置CORS响应标头的情况下。