2013-07-08 26 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 
相关问题