我想为跨域访问标头配置 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"
该手册指出,set
和add
操作的行为方式如下:
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