我想为跨域访问标头配置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
最后使用" *",但我不想使用它。
请帮忙解决这个问题。
答案 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"
手册指出set
和add
操作的行为方式如下:
设置:“设置了响应标头,用此名称替换任何以前的标头”
添加:“...这可能导致两个(或更多)标题具有相同的名称。这可能会导致无法预料的后果......”
答案 2 :(得分:4)
要限制对某些URI的访问,请查看以下文档:
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')));