首页 文章

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

提问于
浏览
29

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

但是,在应该采用的核准方法方面似乎存在着解释上的差距 . 通过W3文档阅读,我认为这是一个指导冲突 .

首先,我们在许多先前的答案中看到了给出答案的正确方法,该答案规定主机服务器必须动态回显给定的'Origin'(如果它出现在预定义的'whitelist'上) . http://www.w3.org/TR/cors/#resource-implementation

然而,许多使用的答案和方法也提到了空格分隔列表,它也可以用作传递多个'Origins'以允许的方法 . 如果我们看一下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 回答

  • 37

    关于这个的文档似乎意味着它允许多个来源以空格分隔列表,但是我可以收集的是你问题的最明确答案: Access-Control-Allow-Origin Headers 应该与 Origin Headers 的值相同,只要 Access-Control-Allow-Origin Headers 可以与 Origin Headers 相同你想允许它 .

    它来自多个来源(即请求被跨域重定向)的原因 . 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 标头的动态生成的标头以及是否与您的白名单相匹配 .

  • 0

    如果您需要允许包含特定单词“example”的原点,您可以在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
    

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

相关问题