2013-12-19 81 views
23

我想爲跨域訪問標頭配置apache。我已經嘗試了多個組合,如論壇上的線程數所示。但它不適合我。在Apache中使用Access-Control-Allow-Origin標頭處理多個域

的方式,我曾嘗試:

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

你看這一個:http://stackoverflow.com/a/4730826/550618與304響應代碼的問題? – regilero

+0

如果我使用「標題集」,那麼它在FF上工作。但在這種情況下,它只取最後一個域:(我想爲多個域配置。 – Kuldeep

+0

問題不是'set'或'add',它是添加'always'關鍵字 – regilero

回答

12

除非我誤解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行動,通過以下方式表現:

集:「響應報頭使用此名稱替換任何以前的標題「

add:」...這可能導致在兩個(或更多)具有相同名稱的標題中。這可能會導致無法預見的後果......」

+0

該手冊還說'附加...這是HTTP標準的方式給一個頭多個值。' –

+0

我的上帝謝謝你。我花了很多摸索找到這個。 – dudewad

29

對於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> 

我已經試過這和它的作品對我來說讓我知道,如果它不爲。你

+2

這是唯一的方法,它通過在服務之前檢查主機來動態地僅提供一個值。 「總是追加」或「添加」對我不起作用。 – Ciantic

+0

感謝您的肯定:) – George

+1

適合我。我想知道「$ 0 $ 1」,因爲許多其他例子只是使用「$ 0」。當重複使用不同Web服務器的相同.htaccess文件時,它看起來很健壯($ 0適用於Apache)。 –

2

限制訪問某些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文件中添加以下行。並且,您可以使用添加而不是設置,但要注意添加可以多次添加標題,所以使用set通常更安全。

-2

這在傳統的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 
+0

問題是關於Apache。 – iamnotmaynard