首页 文章

在Apache中使用Access-Control-Allow-Origin标头处理多个域

提问于
浏览
28

我想为跨域访问头配置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"

通过此设置,它将选择 only last one 并忽略其余部分 .

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"

有了这个,它在 Headers 中显示了所有三个域,但是在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

最后使用“*”,但我不想使用它 .

请帮忙 .

6 回答

  • 34

    对于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>
    

    我试过这个,它对我有用 . 如果它不适合你,请告诉我 .

  • 4

    除非我误解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: "The response header is set, replacing any previous header with this name"

    add: "...This can result in two (or more) headers having the same name. This can lead to unforeseen consequences..."

  • 16

    要限制对某些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要公开 Headers ,您可以在“目录”,“位置”和“文件”部分或.htaccess文件中添加以下行 .

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

    AND,你可以使用add而不是set,但要注意add可以多次添加 Headers ,所以使用set通常更安全 .

  • -2

    尝试这个,它适合我 . 在.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
    
  • 1

    将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]
    
  • 0

    这适用于Classic 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
    

相关问题