【问题标题】:Cross-domain XMLHttpRequest, Access-Control-Allow-Origin header and $_SERVER['HTTP_ORIGIN']跨域 XMLHttpRequest、Access-Control-Allow-Origin 标头和 $_SERVER['HTTP_ORIGIN']
【发布时间】:2020-03-31 06:05:31
【问题描述】:

我需要一个脚本来通过 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"); }
}

【问题讨论】:

  • 我们不是来审查您的代码的。我们在这里帮助修复某人的编程错误。
  • 我不需要代码审查。我根本无法在其他 SO 问题/答案中引用的 $_SERVER 条目的 php 手册中找到帮助。当遇到文档无法提供帮助的问题时,我认为这里是寻求他人帮助的地方。对不起,如果我弄错了……
  • 已编辑以更清楚地表明问题是关于(据我所知)无证 php 超全局的信息请求,并且没有代码审查请求。

标签: javascript php ajax cross-domain


【解决方案1】:

$_SERVER['HTTP_ORIGIN'] 超全局集何时出现?

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

在全球范围内是否可靠?

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

【讨论】:

  • 谢谢,在 CORS 上搜索使我能够在 w3 规范中找到我需要的所有信息 (w3.org/TR/cors)
猜你喜欢
  • 2015-07-18
  • 2019-08-15
  • 2018-09-29
  • 2016-01-11
  • 2014-04-25
  • 2019-02-28
  • 1970-01-01
  • 2016-08-03
  • 2015-01-08
相关资源
最近更新 更多