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

我想为跨域访问标题configurationapache。 我已经尝试了多个组合作为论坛上的线程数build议。 但它不为我工作。

方法,我已经尝试过了:

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" 

有了这个设置,它只能select最后一个,而忽略其余的。

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" 

有了这个在头上显示了所有三个域名,但字体没有得到拾起火狐。

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中:

 <Ifmodulee 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 </Ifmodulee> 

我已经试过这个,它适用于我。 让我知道如果它不适合你。

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

 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操作的行为如下:

设置: “响应头被设置,用这个名字替换任何以前的头”

加上: “…这可能会导致两个(或更多)具有相同名称的头文件,这可能导致无法预料的后果……”

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

CrossOriginRequestSecurity

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

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

而且,您可以使用add而不是set,但要注意add可以多次添加标题,所以使用set通常更安全。

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