我需要一个脚本,通过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"); }
}
答案 0 :(得分:1)
什么时候是
$_SERVER['HTTP_ORIGIN']
超全球集?
当HTTP请求包含Origin
标头时。浏览器在使用XMLHttpRequest发出跨域请求时会设置一个。
全球可靠吗?
在您可能想要设置CORS响应标头的情况下。