2010-03-29 1 views
34

Я написал небольшое приложение-рельсы, чтобы обслуживать контент на другом сайте через xmlhttprequests, который будет работать из другого домена (его невозможно будет запустить на том же сервере). Я понимаю, что мне нужно будет установить доступ к управлению доступом-allow-origin на моем сервере rails, чтобы разрешить запрашивающей веб-странице получать доступ к этому материалу.Как установить контроль доступа-allow-origin в webrick под рельсами?

Кажется довольно хорошо документированным, как это сделать с Apache, и это, вероятно, сервер, который я буду использовать после развертывания сайта. Хотя я развиваюсь, хотя я надеюсь просто использовать webrick, как я привык делать с рельсами. Есть ли способ настроить webrick, чтобы обеспечить соответствующий HTTP-заголовок в рельсах?

+0

Что такое «контроль доступа-разрешить-происхождение»? для понимания webrick немного лучше, я нашел этот хороший старт: http://microjet.ath.cx/webrickguide/html/What_is_WEBrick.html – poseid

+0

Это заголовок http, который сообщает браузеру, что в порядке доступа к ресурсам с этого сервера, если запрашивающая страница из другого домена. – brad

ответ

12

Если вы находитесь на Rails 2, просто добавьте это в свой прикладной контоллер.

before_filter :set_access 

def set_access 
    @response.headers["Access-Control-Allow-Origin"] = "*" 
end 

Очевидно изменение "*" к чему-то немного менее открытым будет хорошей идеей.

+0

Вау, ты вытащил этот вопрос из недр истории. Спасибо (к сожалению, я отказался от этого проекта по другим причинам некоторое время назад, но это полезно иметь там) – brad

+4

и на рельсах 3? – macool

+3

возможно рельсы 4? edit: rails 4 ниже;) http://stackoverflow.com/a/17815546/845717 – BradGreens

8

Рельсы 2.3.8

before_filter :allow_cross_domain_access 
def allow_cross_domain_access 
    response.headers["Access-Control-Allow-Origin"] = "*" 
    response.headers["Access-Control-Allow-Methods"] = "*" 
end 
14

Рельсы 3.1

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    after_filter :set_access_control_headers 

    def set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Request-Method'] = '*' 
    end 
end 
77

Рельсы 4 (http://edgeguides.rubyonrails.org/security.html#default-headers)

В конфигурации/application.rb:

config.action_dispatch.default_headers.merge!({ 
    'Access-Control-Allow-Origin' => '*', 
    'Access-Control-Request-Method' => '*' 
}) 
+6

+1 Помните, что приведенный выше код также удаляет существующие заголовки по умолчанию (X-Frame-Options, X-XSS-Protection, X-Content-Type-Options) –

+0

@ DanielRikowski Итак, это не проблема, если мы просто добавим эти заголовки по умолчанию вернуться к списку, не так ли? – Noz

+0

@Noz: Это правильно. Либо добавив их в хэш, либо просто объединив дополнительные заголовки выше. –

12

Рельсы 3.1 - с помощью контроллер after_filter не работает для меня, поэтому я добавил пользовательское промежуточное программное обеспечение вместо:

В приложение/промежуточного/cors_middleware.rb:

# For icons to work in Firefox with CDN 
class CorsMiddleware 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 
    cors_headers = headers.merge({ 
     'Access-Control-Allow-Origin' => '*', 
     'Access-Control-Request-Method' => '*'   
    }) 
    [status, cors_headers, body] 
    end 
end 

В конфигурации/application.rb:

require File.join(Rails.root, "app", "middleware", "cors_middleware") 
config.middleware.insert_before ActionDispatch::Static, CorsMiddleware # Need it early in the chain to work for assets 
6

В случае, если вы хотите, чтобы это решение представляло собой драгоценный камень промежуточного программного обеспечения стойки: https://github.com/cyu/rack-cors