2012-08-27 20 views
12

Sto cercando di far funzionare alcuni AJAX tra due sottodomini.CORS abilitato in Apache, ma AJAX non funziona (Chrome dice che l'origine non è consentita)

rails.mydomain.com e mydomain.com

in Apache, in/etc/apache2/sites-available/ho il mio file rails.mydomain.com:

<VirtualHost *:80> 
    Header add Access-Control-Allow-Origin "http://www.mydomain.com" 
    Header add Access-Control-Allow-Origin "http://www.dev-mydomain.com" 
</VirtualHost> 

Tuttavia, ogni volta Provo a fare una semplice richiesta di prova ajax da http://www.dev-mydomain.com, in Chrome ottengo: "XMLHttpRequest non può caricare http://rails.mydomain.com/directory. L'origine http://www.dev-mydomain.com non è consentita da Access-Control-Allow-Origin."

Qualcuno sa cosa mi manca?

+1

Partenza [Access-C domini di origine multiplo ontrol-Allow-Origin] (http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains) –

+1

Ok, quindi ho visto quella pubblicazione prima, ma ho seguito la risposta su come eseguire due istruzioni "Aggiungi intestazione". Ho rimosso la seconda istruzione add, e ho solo un Header Set e funziona, tuttavia, alla fine avrò bisogno di avere due origini ... dovrei solo fare due istruzioni set, o quale soluzione da quel post è il metodo migliore –

+0

yup , batte con più di un'impostazione. google ha bisogno di risolvere questo al più presto. non hanno inventato ajax in primo luogo? –

risposta

0

ho usato rack-cors ad un certo successo, abbastanza semplice da aggiungere quando si fa croce origine Ajax ...

2

Potrebbe provare questo per favore?

Per Gemfile

gem "rack-cors", "~> 0.2.7" 

Per config/application.rb

config.middleware.use Rack::Cors do |requests| 
    requests.allow do |allow| 
    allow.origins '*' 
    allow.resource '*', headers: :any, methods: [:get, :post, :put, :delete, :options] 
    end 
end 

Non dimenticare il server riavvio. Quindi dovrebbe funzionare.

+1

Ciò non rende il server meno sicuro. – mindmyweb

3

Come indica il collegamento di Dahazer, la migliore scommessa è impostare una singola intestazione Access-Control-Allow-Origin. Non è assolutamente appropriato per la produzione, ma potresti semplicemente richiamare l'intestazione Origin mentre sei in modalità dev.

Se si verifica ancora un problema, è probabile che nella risposta non vengano impostati abbastanza intestazioni CORS. Nella mia esperienza di fare croce dominio ajax in cromo, (se non utilizzano jQuery mente), ho anche bisogno di impostare la seguente intestazione:

Access-Control-Allow-Headers : X-Requested-With,Content-Type 

Dato che stavo usando metodi HTTP diversi POST e GET è stato anche necessario per me per impostare

Access-Control-Allow-Methods : GET,PUT,POST,DELETE 

Tuttavia, prima di tutto vi consiglio di leggere l'HTML5 CORS tutorial, in particolare la sezione di CORS on the server. Dovrebbe darti una buona idea dei diversi modi di configurare CORS, sia sul server o sul client (nel tuo caso le opzioni di configurazione ajax di jquery), in base al tuo caso d'uso specifico.

2

Ho avuto questo problema di recente. Avevo impostato Access-Control-Allow-Origin a * in Apache. Tuttavia, Chrome stava ancora bloccando le mie richieste tra domini, mentre funzionava bene in Firefox.

La soluzione che ha funzionato per me era aggiungere un'intestazione Access-Control-Allow-Methods con il valore OPTIONS, GET, POST. Inserendo questo qui, nel caso in cui qualcuno abbia lo stesso problema in futuro e nessuna delle altre soluzioni funzioni.

0

Il problema potrebbe essere in 4 diversi posti qui. Iniziamo con la definizione <virthualhost. Innanzitutto, ci sono alcuni moduli e impostazioni di configurazione che è necessario avere anche per consentire alla definizione di vhost di implementare queste impostazioni.

  • Garantire mod_headers è abilitato
  • assicurare il vostro file di configurazione di apache primario ha un ambiente che consente ai tuoi AllowOverride vhosts per ignorare predefinito CORS Opzioni

Dopo aver fatto sia di quelli, si può utilizzare l'impostazione Access-Control-Allow-Origin, a condizione che si utilizza anche una direttiva DocumentRoot

<VirtualHost *:80> 
    DocumentRoot /server/path/to/site/root 
    Header add Access-Control-Allow-Origin "mydomain.com" 
    Header add Access-Control-Allow-Origin "dev-mydomain.com" 
    Header set Access-Control-Allow-Methods "GET,POST,PUT,OPTIONS" 
</VirtualHost> 
Problemi correlati