¿Error de CORS en el mismo dominio?

86

Me estoy encontrando con un extraño problema de CORS en este momento.

Aquí está el mensaje de error:

XMLHttpRequest cannot load http://localhost:8666/routeREST/select?q=[...] 
Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin

Dos servidores:

  • localhost: 8666 / routeREST /: este es un servidor de botella de Python simple.
  • localhost: 8080 /: Python simpleHTTPserver donde ejecuto la aplicación Javascript. Esta aplicación está ejecutando solicitudes Ajax en el servidor anterior.

¿Alguna idea sobre cuál podría ser el problema?

EDITAR:

Y ... el puerto era el problema. Gracias por tus respuestas :)

Si alguien también está usando un servidor de botellas de Python, puede seguir la respuesta dada en esta publicación para resolver el problema de CORS: Bottle Py: Habilitación de CORS para solicitudes de jQuery AJAX

Mr_Pouet
fuente
10
Dado que están en diferentes puertos, ¡no son iguales!
alrededor del
Los números de puerto son diferentes. Esto podría violar las reglas de origen cruzado.
4
Tenga en cuenta que IE no tiene en cuenta el número de puerto.
Ray Nicholus
@algunos La mayoría de los navegadores también concluyen que no son iguales si uno tiene 'www' y el otro no. El diablo está en los detalles.
Rara vez 'Where's Monica' Needy
@SeldomNeedy example.com, www.example.com, www1.example.com y mirror.www.example.com son dominios diferentes. example.com , example.com , example.com , example.com:80443 son todos de diferentes orígenes.
algo del

Respuestas:

122

Solo se considera igual si el protocolo , el host y el puerto son los mismos: Política de mismo origen

Si desea habilitarlo, debe seguir el intercambio de recursos de origen cruzado (cors) agregando encabezados. Mozilla tiene ejemplos

Debe agregar Access-Control-Allow-Origin como encabezado en su respuesta. Para permitir que todos (probablemente NO deberías hacer eso):

Access-Control-Allow-Origin: *

Si necesita admitir varios orígenes (por ejemplo, ambos example.comy www.example.com), establezca Access-Control-Allow-Originen su respuesta el valor del Origin-encabezado de la solicitud (después de verificar que el origen está en la lista blanca).

También tenga en cuenta que algunas solicitudes envían una solicitud de verificación previa, con un método OPCIÓN, por lo que si escribe su propio código, también debe manejar esas solicitudes. Consulte Mozilla para ver ejemplos .

algunos
fuente
8
Esto debe resaltarse con color rojo, mayúsculas y negrita en todas partes donde AJAX se involucre.
Zoltán Schmidt
5
Como anexo a esta respuesta, tenga en cuenta que NO'Access-Control-Allow-Origin: https://example.com' es equivalente a . Si su sitio es accesible a través de ambos, debe tener ambos en sus encabezados de respuesta. 'Access-Control-Allow-Origin: https://www.example.com'
Rara vez 'Where's Monica' Needy
1
Tenga en cuenta que no se envían solicitudes de verificación previa de forma predeterminada para solicitudes simples como GET, POSTy HEAD. Consulte el artículo de MDN vinculado en la respuesta para obtener detalles adicionales.
Emile Bergeron
@SeldomNeedy no puede tener encabezados duplicados
Mike Flynn
@MikeFlynn Mi redacción fue ciertamente un poco floja, pero no estaba tratando de sugerir eso; el servidor simplemente necesita configurarse para enviar el encabezado apropiado, según la solicitud.
Rara vez se necesita '¿Dónde está Monica?
31

Los números de puerto son diferentes.

Una solicitud se considera de dominio cruzado si alguno de los esquemas, el nombre de host o el puerto no coincide.

jcarpenter2
fuente
1
Excepto 443 y 80.
Joseph Lust
15
incluyendo 443 y 80
code_monk
4
¿Cómo puede una confirmación del problema ser la solución del problema? Publica la respuesta, amigo.
Ritesh