javascript - origin - CORS mortal cuando http:// localhost es el origen
enable cors javascript (3)
Chrome no admite localhost para solicitudes CORS (un error abierto desde 2010).
Para evitar esto, puede usar un dominio como lvh.me
(que apunta a 127.0.0.1 al igual que localhost) o iniciar Chrome con el --disable-web-security
(suponiendo que solo está probando).
Estoy atascado con este problema CORS, aunque configuré el servidor (nginx / node.js) con los encabezados apropiados.
Puedo ver en el panel Red de Chrome -> Encabezados de respuesta:
Access-Control-Allow-Origin:http://localhost
que debería hacer el truco.
Aquí está el código que ahora uso para probar:
var xhr = new XMLHttpRequest();
xhr.onload = function() {
console.log(''xhr loaded'');
};
xhr.open(''GET'', ''http://stackoverflow.com/'');
xhr.send();
yo obtengo
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 del cliente y no en la configuración del servidor ...
El verdadero problema es que si establecemos -Allow- para todas las solicitudes (OPTIONS & POST), Chrome lo cancelará. El siguiente código funciona para mí con POST a LocalHost 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);
}
?>
Por la respuesta de Per @ Beau, Chrome no admite las solicitudes CORS de localhost, y es poco probable que haya algún cambio en esta dirección.
Uso Allow-Control-Allow-Origin: * Chrome Extension para solucionar este problema. La extensión agregará los encabezados 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>
El código fuente está publicado en Github .
Tenga en cuenta que la extensión filtra todas las URL de forma predeterminada. Esto puede interrumpir algunos sitios web (por ejemplo, Dropbox). Lo he cambiado para filtrar solo URL de localhost con el siguiente filtro de URL
*://localhost:*/*