2010-03-29 13 views
34

Ho scritto un'app per le piccole rotaie per offrire contenuti a un altro sito tramite xmlhttprequests che funzioneranno da un altro dominio (non sarà possibile farli funzionare sullo stesso server). Capisco che sarà necessario impostare access-control-allow-origin sul mio server di rotaie per consentire alla pagina web richiedente di accedere a questo materiale.Come impostare access-control-allow-origin in webrick sotto le guide?

Sembra abbastanza ben documentato come farlo con Apache e questo è probabilmente il server che userò una volta distribuito il sito. Mentre sto sviluppando, spero di usare solo webrick come sono abituato a fare con le guide. C'è un modo di configurare webrick per fornire l'intestazione http appropriata all'interno delle rotaie?

+0

quali sono "access-control-allow-origin"? per capire meglio webrick ho trovato questo un buon inizio: http://microjet.ath.cx/webrickguide/html/What_is_WEBrick.html – poseid

+0

È un'intestazione http che indica a un browser che è OK accedere alle risorse da quel server se la pagina di richiesta proviene da un dominio diverso. – brad

risposta

12

Se si utilizza Rails 2, è sufficiente aggiungerlo al contoller dell'applicazione.

before_filter :set_access 

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

Ovviamente cambiando "*" a qualcosa di un po 'meno aperta sarebbe una buona idea.

+0

Wow, hai trascinato questa domanda fuori dalle viscere della storia. Grazie (purtroppo ho abbandonato quel progetto per altri motivi qualche tempo fa ma è utile averlo fuori) – brad

+4

e su rotaie 3? – macool

+3

forse binari 4? edit: rails 4 is below;) http://stackoverflow.com/a/17815546/845717 – BradGreens

8

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 
14

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 
77

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

in config/application.rb:

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

+1 Tieni presente che il codice sopra rimuove anche le intestazioni predefinite esistenti (X-Frame-Options, X-XSS-Protection, X-Content-Type-Options) –

+0

@DanielRikowski Quindi non è un problema se aggiungiamo semplicemente quelle intestazioni predefinite torna alla lista, giusto? – Noz

+0

@Noz: è corretto. O aggiungendoli all'hash o semplicemente unendoli nelle intestazioni aggiuntive di cui sopra. –

12

Rails 3.1 - utilizzando un controller after_filter non ha funzionato per me, così ho aggiunto un middleware personalizzato invece:

in 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 

in 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 
Problemi correlati