Question

J'ai écrit une petite application de rails pour servir du contenu à un autre site via XMLHttpRequests qui opéreraient à partir d'un autre domaine (il ne sera pas possible de les faire fonctionner sur le même serveur). Je comprends que je vais devoir mettre de contrôle d'accès permettent aux origine sur mon serveur rails pour permettre à la page Web demandant d'accéder à ce matériel.

Il semble assez bien documenté comment faire avec Apache et ce qui est probablement le serveur que je vais utiliser une fois que je Déployez le site. Alors que je développe si j'espère juste utiliser webrick comme je suis habitué à faire avec des rails. Est-il possible de configurer webrick pour fournir l'en-tête HTTP approprié dans les rails?

Était-ce utile?

La solution

Si vous êtes sur Rails 2 ajouter ceci à votre contoller d'application.

before_filter :set_access

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

Il est évident que le changement "*" à quelque chose d'un peu moins ouvert serait une bonne idée.

Autres conseils

Rails 4 ( http://edgeguides.rubyonrails.org/security.html#default-headers)

Dans config / application.rb:

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

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

Rails 3.1 - en utilisant un contrôleur after_filter n'a pas fonctionné pour moi, donc j'ai ajouté à la place d'un middleware personnalisé:

app / 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

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

Si vous voulez la solution comme un petit bijou de middleware Rack: https://github.com/cyu/rack-cors

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top