【问题标题】:handle multiple domains with Access-Control-Allow-Origin header in Apache在 Apache 中使用 Access-Control-Allow-Origin 标头处理多个域
【发布时间】:2014-01-07 13:26:46
【问题描述】:

我想为跨域访问标头配置 apache。我已经按照论坛上线程数的建议尝试了多种组合。但它不适合我。

方法,我试过了:

1) 使用Header set 如下在不同行指定域:

Header set Access-Control-Allow-Origin "example1.com"
Header set Access-Control-Allow-Origin "example2.com"
Header set Access-Control-Allow-Origin: "example3.com"

使用此设置,它会选择只选择最后一个并忽略其余的。

2) 使用Header add 如下在不同行指定域:

Header add Access-Control-Allow-Origin "example1.com"
Header add Access-Control-Allow-Origin "example2.com"
Header add Access-Control-Allow-Origin: "example3.com"

它在标题中显示所有三个域,但字体在 Firefox 上没有被选中。

3.) 尝试使用 SetEnvIf,但它再次不起作用:

SetEnvIf Origin "http(s)?://(www\.)?(mydomain.com|mydomain2.com)$" AccessControlAllowOrigin=$0$1
Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin

终于用“*”了,但我不想用这个。

请帮忙。

【问题讨论】:

  • 您是否阅读过这篇文章:stackoverflow.com/a/4730826/550618 的 304 响应代码问题?
  • 如果我使用“标题集”,那么它在 FF 上工作。但在那种情况下,它只占用最后一个域:(我想为多个域进行配置。
  • 问题不是setadd,是加了always关键字
  • 仍然有同样的问题。如果我使用“always”关键字并设置如下: 标头始终设置 Access-Control-Allow-Origin “example1.com” 标头始终设置 Access-Control-Allow-Origin “example2.com” 标头始终设置 Access-Control-Allow -Origin:“example3.com”然后它只采用最后一个域和字体在FF上工作。另一方面,如果我将 always 关键字与 add 一起使用,如下所示: 标头始终添加 Access-Control-Allow-Origin "example1.com" 标头始终添加 Access-Control-Allow-Origin "example2.com" 标头始终添加 Access-Control -Allow-Origin: "example3.com" 然后字体在 FF 上不起作用。
  • 各位专家,您能指导我吗?

标签: apache .htaccess http cross-domain cors


【解决方案1】:

对于 3 个域,在您的 .htaccess 中:

<IfModule mod_headers.c>
    SetEnvIf Origin "http(s)?://(www\.)?(domain1.org|domain2.com|domain3.net)$" AccessControlAllowOrigin=$0$1
    Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
    Header set Access-Control-Allow-Credentials true
</IfModule>

我已经尝试过了,它对我有用。如果它不适合你,请告诉我。

【讨论】:

  • 这是唯一的方法,它通过在服务之前检查主机来动态地只提供一个值。 “总是附加”或“添加”对我不起作用。
  • 非常适合我。我想知道“$ 0 $ 1”,因为许多其他示例只使用“$ 0”。当为不同的 Web 服务器重复使用相同的 .htaccess 文件时,它看起来很健壮($0 适用于 Apache)。
  • 只有在离开“$1”时才对我有用。由于某种原因,“$1”被设置为“s”,因此它不匹配(“domain1.org”不匹配“domain1.orgs”)。
  • 这是错误的。它必须是$0,而不是$0$1$0$1 将匹配组 1 附加到 URL。这是匹配组 1:http(s)?,因此它将为 https 来源附加 s,为 http 来源附加 undefined
  • @FabienHaddadi %{AccessControlAllowOrigin}e 是头指令的一种格式说明符。 httpd.apache.org/docs/current/mod/mod_headers.html#header
【解决方案2】:

除非我误会the manual,否则应该是:

Header always append Access-Control-Allow-Origin: "example1.com"
Header always append Access-Control-Allow-Origin: "example2.com"
Header always append Access-Control-Allow-Origin: "example3.com"

手册指出setadd 操作的行为方式如下:

set: "设置响应头,用这个名字替换之前的任何头"

add: "...这可能导致两个(或多个)标题具有相同的名称。这可能导致无法预料的后果..."

【讨论】:

【解决方案3】:

要限制对某些 URI 的访问,请查看以下文档:

CrossOriginRequestSecurity

Server-Side Access Control#Apache_examples

一个有用的技巧是使用 Apache 重写、环境变量和标头将 Access-Control-Allow-* 应用于某些 URI。这很有用,例如,将跨域请求限制为没有凭据的 GET /api(.*).json 请求:

RewriteRule ^/api(.*)\.json$ /api$1.json [CORS=True]
Header set Access-Control-Allow-Origin "*" env=CORS
Header set Access-Control-Allow-Methods "GET" env=CORS
Header set Access-Control-Allow-Credentials "false" env=CORS

另外,一般来说,根据W3 Wiki - CORS Enabled#For_Apache 要公开标头,您可以在 Directory、Location 和 Files 部分或 .htaccess 文件中添加以下行。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>

并且,您可以使用 add 而不是 set,但要注意 add 可以多次添加 header,因此通常使用 set 更安全。

【讨论】:

    【解决方案4】:

    试试这个,它对我有用。 在 .htaccess 中申请:

    SetEnvIf Origin "^http(s)?://(.+\.)?(domain\.org|domain2\.com)$" origin_is=$0 
    Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is
    

    【讨论】:

      【解决方案5】:

      将 100% 工作,在 .htaccess 中申请:

      # Enable cross domain access control
      SetEnvIf Origin "^http(s)?://(.+\.)?(domain1\.com|domain2\.org|domain3\.net)$" REQUEST_ORIGIN=$0
      Header always set Access-Control-Allow-Origin %{REQUEST_ORIGIN}e env=REQUEST_ORIGIN
      Header always set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
      Header always set Access-Control-Allow-Headers "x-test-header, Origin, X-Requested-With, Content-Type, Accept"
      
      # Force to request 200 for options
      RewriteEngine On
      RewriteCond %{REQUEST_METHOD} OPTIONS
      RewriteRule .* / [R=200,L]
      

      【讨论】:

      • 这个答案和批准的答案都在末尾添加了一个 * ,这是不正确的。 IE 如果我从 localhost:3000 发出请求,则响应标头包含:Access-Control-Allow-Origin: http://localhost:3000, *
      【解决方案6】:

      对于 Apache 2.4,我使用 SET 命令让 Apache Web 服务器动态设置 Header。

      <IfModule mod_deflate.c>
        # CORS
        SetEnvIfNoCase Origin "http(s)?://(\w+\.)?(example.com|localhost)(:[0-9]+)?$" AccessControlAllowOrigin=$0
        Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
        Header set Access-Control-Allow-Credentials true
      </IfModule>
      

      ADD 命令对我不起作用。

      【讨论】:

        【解决方案7】:

        我在我的.htaccess 文件中使用它来允许访问多个域

         <ifModule mod_headers.c>
            SetEnvIf Origin "http(s)?://(localhost:25120|domain.com|domain2.com)$" AccessControlAllowOrigin=$0
            Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
            Header always set Access-Control-Allow-Methods: "GET,POST,OPTIONS,DELETE,PUT"
         </ifModule>    
        

        【讨论】:

          【解决方案8】:

          对于多个域,在您的 .htaccess 中:

           <IfModule mod_headers.c>
              SetEnvIf Origin "http(s)?://(www\.)?(domain.com|domain.online|domain.in|domain.net|domain.site|domain.website|domain.space)$" AccessControlAllowOrigin=$0
              Header set Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin
              Header set Access-Control-Allow-Credentials true
          </IfModule>
          

          它 100% 适合我

          【讨论】:

            【解决方案9】:

            这在经典 ASP 中适用于我:

            If Request.ServerVariables("HTTP_ORIGIN") = "http://domain1.com" Then
              Response.AddHeader "Access-Control-Allow-Origin","http://domain1.com"
            ElseIf Request.ServerVariables("HTTP_ORIGIN") = "http://domain2.com" Then
              Response.AddHeader "Access-Control-Allow-Origin","http://domain2.com"
            'and so on
            End If
            

            【讨论】:

            • 问题是关于 Apache。
            猜你喜欢
            • 2012-03-17
            • 2018-07-18
            • 1970-01-01
            • 2019-06-19
            • 2016-01-11
            • 1970-01-01
            • 2014-03-20
            • 2013-12-02
            相关资源
            最近更新 更多