Recibo este error usando ngResource para llamar a una API REST en Amazon Web Services:
XMLHttpRequest no puede cargar http://server.apiurl.com:8000/s/login?login=facebook . La respuesta a la solicitud de verificación previa no pasa la verificación de control de acceso: no hay encabezado 'Access-Control-Allow-Origin' en el recurso solicitado. Por lo tanto, el origen ' http: // localhost ' no tiene acceso permitido. Error 405
Servicio:
socialMarkt.factory('loginService', ['$resource', function($resource){
var apiAddress = "http://server.apiurl.com:8000/s/login/";
return $resource(apiAddress, { login:"facebook", access_token: "@access_token" ,facebook_id: "@facebook_id" }, {
getUser: {method:'POST'}
});
}]);
Controlador:
[...]
loginService.getUser(JSON.stringify(fbObj)),
function(data){
console.log(data);
},
function(result) {
console.error('Error', result.status);
}
[...]
Estoy usando Chrome, y no sé qué más hacer para solucionar este problema. Incluso he configurado el servidor para aceptar encabezados de origen localhost
.
javascript
ajax
http
cors
http-status-code-405
Andre Mendes
fuente
fuente
Respuestas:
Estás teniendo problemas con CORS.
Hay varias formas de solucionar / solucionar esto.
De manera más vergonzosa, está intentando acceder a api.serverurl.com desde localhost. Esta es la definición exacta de solicitud de dominio cruzado.
Al apagarlo solo para hacer su trabajo (OK, ponga poca seguridad para usted si visita otros sitios y simplemente tira la lata en el camino) puede usar un proxy que hace que su navegador piense que todas las solicitudes provienen del host local cuando realmente tienes un servidor local que luego llama al servidor remoto.
entonces api.serverurl.com podría convertirse en localhost: 8000 / api y su nginx local u otro proxy se enviarán al destino correcto.
Ahora por demanda popular, 100% más información CORS ... ¡el mismo gran sabor!
Y para los que votan a favor ... pasar por alto CORS es exactamente lo que se muestra para aquellos que simplemente están aprendiendo el front-end. https://codecraft.tv/courses/angular/http/http-with-promises/
fuente
Mi "Servidor API" es una aplicación PHP, así que para resolver este problema encontré la siguiente solución para trabajar:
Coloque las líneas en index.php
fuente
Access-Control-Allow-Headers
.En la API web de AspNetCore, este problema se solucionó agregando "Microsoft.AspNetCore.Cors" (ver 1.1.1) y agregando los siguientes cambios en Startup.cs.
y
y poniéndose
[EnableCors("AllowAllHeaders")]
el controlador.fuente
Hay algunas advertencias cuando se trata de CORS. Primero, no permite comodines,
*
pero no me detenga en este, lo he leído en alguna parte y no puedo encontrar el artículo ahora.Si realiza solicitudes desde un dominio diferente, debe agregar los encabezados de origen permitidos.
Si va a realizar peticiones que afectan a los recursos del servidor como de POST / PUT / PATCH, y si el tipo MIME es diferente del siguiente
application/x-www-form-urlencoded
,multipart/form-data
otext/plain
el navegador automáticamente hará una OPCIONES prevuelos solicitan comprobar con el servidor si lo permitiría .Por lo tanto, su API / servidor debe manejar estas solicitudes de OPCIONES en consecuencia, debe responder con el apropiado
access control headers
y el código de estado de respuesta http debe ser200
.Los encabezados deben ser algo como esto, ajústelos según sus necesidades:
El encabezado max-age es importante, en mi caso, no funcionaría sin él, supongo que el navegador necesita la información durante cuánto tiempo son válidos los "derechos de acceso".
Además, si está haciendo, por ejemplo, una
POST
solicitud conapplication/json
mime desde un dominio diferente, también debe agregar el encabezado de origen de permiso mencionado anteriormente, para que se vea así:Cuando el pre-vuelo tenga éxito y obtenga toda la información necesaria, se realizará su solicitud real.
En términos generales, cualquier
Access-Control
encabezado que se solicite en la solicitud inicial o previa al vuelo, se debe dar en la respuesta para que funcione.Hay un buen ejemplo en los documentos de MDN aquí en este enlace , y también debe consultar esta publicación SO
fuente
.AllowCredentials()
. Después de agregar.AllowCredentials()
todo funcionó.Fuente: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Debe enviar el encabezado HTTP Access-Control-Allow-Origin: * desde el lado del servidor.
Si está utilizando Apache como su servidor HTTP, puede agregarlo a su archivo de configuración de Apache de esta manera:
Mod_headers está habilitado de forma predeterminada en Apache, sin embargo, es posible que desee asegurarse de que esté habilitado ejecutando:
fuente
/etc/apache2/apache2.conf
Si estás escribiendo una extensión de Chrome
Debe agregar
manifest.json
los permisos para sus dominios.fuente
Si está utilizando el servidor IIS por casualidad. puede establecer debajo de los encabezados en la opción de encabezados de solicitud HTTP.
con esto todo post, get etc., funcionará bien.
fuente
Para el servidor de matraz de Python, puede usar el complemento matraz-cors para habilitar las solicitudes de dominio cruzado.
Ver: https://flask-cors.readthedocs.io/en/latest/
fuente
En PHP puedes agregar los encabezados:
fuente
header ("Access-Control-Expose-Headers: Content-Length, X-JSON");
Para solucionar problemas de solicitudes de origen cruzado en una aplicación Node JS:
Y simplemente agregue las líneas de abajo a la
app.js
fuente
En mi archivo de configuración de Apache VirtualHost, he agregado las siguientes líneas:
fuente
Para aquellos que usan Lambda Integrated Proxy con API Gateway . Debe configurar su función lambda como si estuviera enviando sus solicitudes directamente, lo que significa que la función debe configurar los encabezados de respuesta correctamente. (Si está utilizando funciones lambda personalizadas, esto será manejado por API Gateway).
fuente
Creo que deshabilitar CORS de Chrome no es una buena manera , porque si lo está utilizando en iónico, ciertamente en Mobile Build, el problema volverá a surgir.
Así que mejor arreglarlo en tu backend.
En primer lugar, en el encabezado, debe establecer
Y si la API se comporta como GET y POST, ambos también se configuran en el encabezado:
fuente
Una causa muy común de este error podría ser que la API del host había asignado la solicitud a un método http (por ejemplo, PUT) y el cliente API está llamando a la API utilizando un método http diferente (por ejemplo, POST o GET)
fuente
PUT
métodoNuestro equipo ocasionalmente ve esto usando Vue, axios y un C # WebApi. Agregar un atributo de ruta en el punto final que está tratando de alcanzar nos lo arregla.
fuente
Me he enfrentado a este problema cuando el servidor DNS se configuró en 8.8.8.8 (google's). En realidad, el problema estaba en el enrutador, mi aplicación intentó conectarse con el servidor a través de google, no localmente (para mi caso particular). He eliminado 8.8.8.8 y esto resolvió el problema. Sé que estos problemas se resolvieron mediante la configuración de CORS, pero tal vez alguien tenga el mismo problema que yo
fuente
Estoy usando AWS sdk para cargas, después de pasar un tiempo buscando en línea me topé con este hilo. gracias a @lsimoneau 45581857 resulta que exactamente lo mismo estaba sucediendo. Simplemente apunté mi URL de solicitud a la región en mi cubo adjuntando la opción de región y funcionó.
fuente
Las distribuciones independientes de GeoServer incluyen el servidor de aplicaciones Jetty. Habilite el uso compartido de recursos de origen cruzado (CORS) para permitir que las aplicaciones de JavaScript fuera de su propio dominio utilicen GeoServer.
Descomente lo siguiente
<filter>
y<filter-mapping>
de webapps / geoserver / WEB-INF / web.xml:fuente
Es fácil resolver este problema con solo unos pocos pasos fácilmente, sin preocuparse por nada. Amablemente, siga los pasos para resolverlo.
fuente
Algo que es muy fácil pasar por alto ...
En el explorador de soluciones, haga clic con el botón derecho en api-project. En la ventana de propiedades, configure 'Autenticación anónima' en Activado.
fuente
Deshabilite la seguridad de Chrome. Cree un acceso directo de Chrome, haga clic con el botón derecho -> propiedades -> destino, pegue este "C: \ Archivos de programa (x86) \ Google \ Chrome \ Application \ chrome.exe" --disable-web-security --user -data-dir = "c: / chromedev"
fuente