2012-06-04 22 views
70

Estoy atascado con este problema CORS, aunque configuré el servidor (nginx/node.js) con los encabezados correspondientes.CORS mortal cuando http: // localhost es el origen

puedo ver en el panel de Chrome Red -> Cabeceras de Respuesta:

Access-Control-Allow-Origin:http://localhost 

que debe hacer el truco.

Aquí está el código que ahora utilizo para probar:

var xhr = new XMLHttpRequest(); 
xhr.onload = function() { 
    console.log('xhr loaded'); 
}; 
xhr.open('GET', 'http://stackoverflow.com/'); 
xhr.send(); 

me sale

XMLHttpRequest cannot load http://stackoverflow.com/. Origin http://localhost is not allowed by Access-Control-Allow-Origin. 

Sospecho que es un problema en el script de cliente y no la configuración del servidor ...

+17

No, stackoverflow.com tiene que establecer esta cabecera, no tú. :X. Cuál sería el objetivo de la misma política de origen de lo contrario. – Esailija

+2

Intente acceder al servidor que configuró no desbordamiento de pila. ;) – Nek

+0

DOH! ¿Hay alguna manera de decirle a Chrome (u otro navegador), para obtener el recurso, incluso si el encabezado falta cuando mi origen es localhost? – whadar

Respuesta

117

Chrome does not support localhost for CORS requests (un error abierto desde 2010).

Para solucionar esto, puede usar un dominio como lvh.me (que apunta a 127.0.0.1 al igual que localhost) o iniciar cromo con el indicador --disable-web-security (suponiendo que solo esté probando).

+0

Esto no es correcto. Puedo publicar en localhost con cromo – greensuisse

+10

@greensuisse - no está publicando en localhost. Está publicando * desde * localhost ese es el problema. – Cheeso

+1

Ese error no es válido (y se ha marcado como tal - http://crbug.com/67743#c17). [El comentario de Esail] (http://stackoverflow.com/questions/10883211/deadly-cors-when-http-localhost-is-the-origin#comment14184025_10883211) es correcto, agregar estos encabezados a localhost no le dará mágicamente acceso a todos los otros sitios. Es el sitio remoto que necesita ser servido con estos encabezados. –

15

El problema real es que si configuramos -Allow- para todas las solicitudes (OPCIONES & POST), Chrome lo cancelará. El siguiente código funciona para mí con la POST al servidor local con Chrome

<?php 
if (isset($_SERVER['HTTP_ORIGIN'])) { 
    //header("Access-Control-Allow-Origin: {$_SERVER['HTTP_ORIGIN']}"); 
    header("Access-Control-Allow-Origin: *"); 
    header('Access-Control-Allow-Credentials: true');  
    header("Access-Control-Allow-Methods: GET, POST, OPTIONS"); 
} 
if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') { 
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) 
     header("Access-Control-Allow-Methods: GET, POST, OPTIONS");   
    if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) 
     header("Access-Control-Allow-Headers:{$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); 

    exit(0); 
} 
?> 
+2

OP usa nginx/node.js. No PHP –

4

por @ respuesta de Beau, Chrome no admite solicitudes CORS localhost, y no es improbable cualquier cambio en esta dirección.

Uso el Allow-Control-Allow-Origin: * Chrome Extension para solucionar este problema. La extensión agregará las cabeceras HTTP necesarios para CORS:

Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: "GET, PUT, POST, DELETE, HEAD, OPTIONS" 
Access-Control-Expose-Headers: <you can add values here> 

la source code is published on Github.

Tenga en cuenta que la extensión filtra todas las URL de forma predeterminada. Esto puede interrumpir algunos sitios web (por ejemplo, Dropbox). He cambiado para filtrar sólo localhost URL con el siguiente filtro URL

*://localhost:*/* 
Cuestiones relacionadas