web-dev-qa-db-fra.com

Comment définir l'accès-Control-Autory-Origin dans Webrick Sous Rails?

J'ai écrit un petit Rails application pour servir de contenu à un autre site via XMLHTTPQUESTS qui fonctionnera à partir d'un autre domaine (il ne sera pas possible de les obtenir en cours d'exécution sur le même serveur). Je comprends Je devrai définir une origine de contrôle d'accès-contrôle sur mon Rails Server pour permettre à la page Web demandeur d'accéder à ce matériau.

Il semble assez bien documenté comment faire cela avec Apache et c'est probablement le serveur que j'utiliserai une fois que je déploierai le site. Pendant que je me développe, j'espère simplement utiliser Webrick comme je suis habitué à faire avec des rails. Existe-t-il un moyen de configurer Webrick pour fournir l'en-tête HTTP approprié dans les rails?

34
brad

Si vous êtes sur Rails 2, ajoutez simplement ceci à votre candidature à votre application.

before_filter :set_access

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

Manifestement changeant "*" à quelque chose d'un peu moins ouvert serait une bonne idée.

13
thomasfedb

Rails 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
14
freemanoid

Rails 3.1 - L'utilisation d'un contrôleur après_filter n'a pas fonctionné pour moi, j'ai donc ajouté un middleware personnalisé à la place:

Dans l'application/middleware/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

Dans config/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
12
Peter Marklund

Rails 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
8
grosser

Si vous souhaitez la solution en tant que piégeage de middleware rack: https://github.com/cyu/rack-cors

6
demisx