2012-08-27 22 views
12

Estoy tratando de que algo de AJAX funcione entre dos subdominios.CORS habilitado en Apache, pero AJAX no funciona (Chrome dice que el origen no está permitido)

rails.mydomain.com y mydomain.com

en Apache, en/etc/apache2/sites-available/tengo mi archivo 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> 

Sin embargo, cada vez Intento hacer una simple solicitud de prueba ajax desde http://www.dev-mydomain.com, en Chrome obtengo: "XMLHttpRequest no puede cargar http://rails.mydomain.com/directory. El origen http://www.dev-mydomain.com no está permitido por Access-Control-Allow-Origin."

¿Alguien sabe lo que me falta?

+1

salida [Acceso-C ontrol-Allow-Origin múltiples dominios de origen] (http://stackoverflow.com/questions/1653308/access-control-allow-origin-multiple-origin-domains) –

+1

Ok, entonces vi esa publicación antes, pero seguí la respuesta sobre hacer dos declaraciones de "agregar encabezado". Eliminé la segunda declaración de agregar, y solo tengo un encabezado configurado y funciona, sin embargo, eventualmente necesitaré tener dos orígenes ... ¿Debería hacer dos declaraciones de conjunto, o qué solución de esa publicación es el mejor método? –

+0

yup , craps con más de una configuración. google necesita arreglar esto lo antes posible. ¿No inventaron ajax en primer lugar? –

Respuesta

0

he utilizado rack-cors a cierto éxito, bastante sencillo añadir al hacer cruz ajax origen ...

2

Podría probar esto, por favor?

Para Gemfile

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

Para 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 

no se olvide el servidor de reinicio. Entonces debería ser trabajo.

+1

¿Esto no hace que el servidor sea menos seguro? – mindmyweb

3

Como señala el enlace de Dahazer, la mejor opción es establecer un solo encabezado Access-Control-Allow-Origin. Definitivamente no es apropiado para la producción, pero puede repetir el encabezado Origin mientras está en modo dev.

Si aún tiene un problema, es probable que no establezca suficientes encabezados CORS en la respuesta. En mi experiencia de hacer cruz ajax dominio en cromo, (no usar la mente jQuery), también me he necesitado para establecer el siguiente encabezado:

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

Teniendo en cuenta que estaba usando métodos HTTP POST y distintas de conseguirlo era también necesarios para que fije

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

Sin embargo, por encima de todo me gustaría recomendar la lectura de la CORS html5 tutorial, en particular la sección CORS on the server. Debe darle una buena idea de las diferentes formas de configurar CORS, ya sea en el servidor o en el cliente (en su caso, las opciones de configuración de jquery's ajax), en función de su caso de uso específico.

2

Tuve este problema recientemente. Establecí Access-Control-Allow-Origin en * en Apache. Sin embargo, Chrome seguía bloqueando mis solicitudes de dominios cruzados, mientras que funcionó bien en Firefox.

La solución que funcionó para mí fue agregar un encabezado Access-Control-Allow-Methods con el valor OPTIONS, GET, POST. Publicando esto aquí, en caso de que alguien tenga el mismo problema en el futuro y ninguna de las otras soluciones funcione.

0

El problema podría estar en 4 lugares diferentes aquí. Comencemos con su definición <virthualhost. En primer lugar, hay algunos módulos y configuraciones que debe tener para permitir que su definición de vhost implemente estas configuraciones.

  • Asegurar mod_headers está habilitado
  • asegurarse de que su archivo de configuración de Apache primaria tiene una configuración que permite a sus AllowOverride vhosts anule la configuración predeterminada CORS

Después de haber hecho ambas cosas, puede utilizar la configuración Access-Control-Allow-Origin, siempre que también usa una directiva 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> 
Cuestiones relacionadas