最佳方法:Access-Control-Allow-Origin多个源域

时间:2014-08-14 13:32:41

标签: http xmlhttprequest cross-domain cors

这个问题之前已经在这里提出并给出了一系列好的答案,主要是: Access-Control-Allow-Origin Multiple Origin Domains?

然而,就应批准的方法而言,似乎存在解释上的空白。通过W3文档阅读,我认为这是一种指导冲突。

首先,我们在许多先前的答案中看到了作为正确方式的答案,这些答案规定主机服务器必须动态回显给定的' Origin&#39 ;如果它出现在预定义的白名单'上。 http://www.w3.org/TR/cors/#resource-implementation

然而,所使用的许多答案和方法也提到了一个空格分隔列表,它也可以用作传递多个“起源”的方法。允许。如果我们在http://www.w3.org/wiki/CORS_Enabled查看另一篇W3文档,我们会在页面的第一部分中看到这样的示例:

 Access-Control-Allow-Origin: http://example.com:8080 http://blah.example.com http://foo.example.com

在这两种方法中,我同样乐意与其合并,但是可能会有大量的URL列表需要入组,所以我想确保我第一次正确地执行此操作。如果有人对上述两种方法有任何见解,我将非常感谢您在选择中听到决定,以及是否有我可能错过的推荐方法的明确指南。

2 个答案:

答案 0 :(得分:38)

关于此的文档似乎意味着它允许多个来源与空格分隔列表,但这不是它实际意味着什么。以下我可以收集的内容作为您问题的最明确答案:Access-Control-Allow-Origin标题应与Origin标题的值相同,只要您想允许它。

它不是您发送回客户端的白名单的原因是因为从技术上讲,客户端可以发送空格分隔的源列表,以便服务器可以验证请求。因此,原因列表的目的是因为请求可能来自多个来源(即,请求是跨域重定向的)。使用不同的重定向可能性A test suite可以很容易地观察到这种行为,即使永远不会生成空格分隔列表(至少是Firefox)。

这在您提供的第一个linked W3C document中显示为较低位置:

  

Access-Control-Allow-Origin标头指示是否可以通过返回Origin请求标头的值来共享资源," *"或" null"在回应中。 ABNF:

     
    

Access-Control-Allow-Origin =" Access-Control-Allow-Origin" ":" origin-list-or-null | " *"

  
     

在实践中,origin-list-or-null生产受到更多限制。它不是允许以空格分隔的原点列表,而是单个原点或字符串" null"。

再次在the definition of the origin list。另外它显示了你是否想要允许字符串" null"作为起源,它无论如何都不能嵌入原始列表中。

请坚持使用基于客户端Origin标头的动态生成的标头,以及它是否与您的白名单相匹配。

答案 1 :(得分:0)

如果您需要允许包含特定单词的原点"示例"您可以在apache vhost中使用以下配置。

SetEnvIf Origin "^((?:https?:\/\/)?(?:[^@\n]+@)?(?:www.)?.example?.*)" REFERER=$0 
Header always set Access-Control-Allow-Origin %{REFERER}e env=REFERER

这将满足以下一些Origin条件:

http://abc.bcd.example.com
https://www.example.in 
http://abcdexample.com 
many more

您可以根据自己的要求调整上述正则表达式。