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

时间:2013-12-19 05:09:41

标签: apache .htaccess http cross-domain cors

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

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

请帮忙解决这个问题。

9 个答案:

答案 0 :(得分:36)

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

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

答案 1 :(得分:17)

除非我误解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操作的行为方式如下:

设置:“设置了响应标头,用此名称替换任何以前的标头”

添加:“...这可能导致两个(或更多)标题具有相同的名称。这可能会导致无法预料的后果......”

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:1)

尝试一下,它对我有用。 在.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

答案 4 :(得分:0)

  

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

答案 5 :(得分:0)

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

ADD命令对我不起作用。

答案 6 :(得分:0)

我正在.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>    

答案 7 :(得分:0)

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

答案 8 :(得分:-2)

这适用于Classic ASP:

select EXTRACTVALUE (COLUMN_VALUE, '/row/Code') code,
        EXTRACTVALUE (COLUMN_VALUE, '/row/Value') Value
from TABLE(XMLSEQUENCE(EXTRACT(XMLTYPE('<rowset><row>'||replace(replace(replace(replace('{12345=Gold}|{12346=Silver}','}|{','</Value></row><row><Code>'),'{','<Code>'),'=','</Code><Value>'),'}','</Value>')||'</row></rowset>'),'/rowset/row')));