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



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

最后使用"*",但我不想使用它。

请帮忙。

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

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

除非我误解了手册,否则它应该是:

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:"已设置响应标头,将任何以前的标头替换为此名称"

添加:"...这可能会导致两个(或多个)标头具有相同的名称。这可能会导致不可预见的后果......"

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

跨源请求安全性

服务器端访问控制#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 启用#For_Apache若要公开标头,可以在"目录"、"位置"和"文件"部分或 .htaccess 文件中添加以下行。

<IfModule mod_headers.c>
  Header set Access-Control-Allow-Origin "*"
</IfModule>
AND,您可以使用 add 而不是 set,

但请注意,add 可以多次添加标头,因此使用 set 通常更安全。

试试这个,它对我有用。在 .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

将工作 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]

对于 Apache 2.4,我使用 Apache Web 服务器的 SET 命令来动态设置 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>

添加命令对我不起作用。

我在.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>    
<</div> div class="one_answers">

对于多个域,在您的 .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% 对我有用

这在经典 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

相关内容

  • 没有找到相关文章

最新更新