2013-07-08 28 views
2

我怎樣才能設置多個Access-Control-Allow-Origin頭與機架兼容應用程序。發送兩個與機架相同的報頭(訪問控制 - 允許來源)

規範說,我應該返回[status, headers, body]陣列作爲結果。標題是標題的哈希:)。所以我不能設置相同的頭兩次。

headers = {} 
headers["Access-Control-Allow-Origin"] = "http://my.domain1.com" 
headers["Access-Control-Allow-Origin"] = "http://my.domain2.com" 

將永遠不會工作。

我該怎麼辦?我怎樣才能發送兩個相同的頭文件?

回答

1

這是很常見使用數組的哈希所以嘗試:

headers = { 
    "Access-Control-Allow-Origin" => %w[ 
    http://my.domain1.com 
    http://my.domain2.com 
    ] 
} 

我有一個猜測,它應該是{ "Access-Control-Allow-Origin" => [ 'a', 'b' ] * "\n" }

望着the RFC中,相關部分爲「5.1 Access-Control-Allow-Origin Response Header」,其中points to

The Origin header field has the following syntax: 

origin    = "Origin:" OWS origin-list-or-null OWS 
origin-list-or-null = %x6E %x75 %x6C %x6C/origin-list 
origin-list   = serialized-origin *(SP serialized-origin) 
serialized-origin = scheme "://" host [ ":" port ] 
        ; <scheme>, <host>, <port> from RFC 3986 

所以,儘量:

[ 'a', 'b' ] * ";" 

或者for the uninitiated

%w[a b].join(';') 
+0

我問:)之前已經測試過,並沒有,它並沒有幫助我。我猜測它應該是'{「Access-Control-Allow-Origin」=> ['a','b'] *「\ n」}',明天再測試 – fl00r

+0

謝謝反饋 – fl00r

+0

檢查編輯。我看了看RFC,應該猜到它是';'。 –

0

基於https://www.w3.org/TR/cors/#access-control-allow-origin-response-header規範,Access-Control-Allow-Origin頭可能只有一個資源。

我已經解決了通過自定義的中間件這種情況下:

class CORS 
    ORIGINS = %w[http://localhost:3001 http://localhost:3002].freeze 

    # ... 

    def call(env) 
    @status, @headers, @response = @app.call(env) 
    @headers['Access-Control-Allow-Origin'] = assign_allow_origin_header(env['HTTP_ORIGIN']) 
    [@status, @headers, @response] 
    end 

    private 

    def assign_allow_origin_header(origin) 
    ORIGINS.include?(origin) ? origin : 'null' 
    end 
end 
相關問題