Am'm a obține această eroare folosind ngResource pentru a apela un REST API de pe Amazon Web Services:
nu se poate încărca XMLHttpRequest http://server.apiurl.com:8000/s/login?login=facebook. Ca răspuns la verificare cerere nu't pass control acces: Nr. 'Access-Control-Allow-Origin' antet este prezent pe solicitată resurse. Originea 'http://localhost' este, prin urmare, nu este permis accesul. Eroare 405
Servicii:
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'}
});
}]);
Controller:
[...]
loginService.getUser(JSON.stringify(fbObj)),
function(data){
console.log(data);
},
function(result) {
console.error('Error', result.status);
}
[...]
Am'm folosind Chrome, și nu știu ce altceva să facă, în scopul de a rezolva această problemă. Am'am chiar și configurat serverul să accepte anteturile de origine "localhost".
Se execută în COR probleme.
Există mai multe moduri de a repara/rezolva aceasta.
Mai verbosely, sunteți încercarea de a accesa api.serverurl.com de la localhost. Aceasta este definiția exactă a cross domain cerere.
Fie prin opriti-l doar pentru a obține locul de muncă făcut (OK, pus de securitate săraci pentru tine, dacă vizitați alte site-uri și lovituri de pământ), puteți utiliza un server proxy care face browser-ul dvs. cred că toate cererile vin de la gazdă locale, atunci când într-adevăr trebuie server local pe care apoi solicită serverul de la distanță.
deci api.serverurl.com ar putea deveni localhost:8000/api și locale nginx sau alte proxy-ul va trimite la destinația corectă.
Acum, la cererea publicului, 100% mai mult CORS info....același gust grozav!
Și pentru downvoters.... ocolind CORS este exact ceea ce este prezentat pentru cei care pur și simplu de învățare front-end. https://codecraft.tv/courses/angular/http/http-with-promises/
Meu "API Server" este o Aplicație PHP deci, pentru a rezolva această problemă am găsit de mai jos soluție la locul de muncă:
Loc de linii în index.php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token');
În AspNetCore api web, această problemă s-a fixat prin adăugarea "Microsoft.AspNetCore.Cor" (ver 1.1.1) și adăugarea de mai jos modificări la Pornire.cs.
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowAllHeaders",
builder =>
{
builder.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod();
});
});
.
.
.
}
și
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
// Shows UseCors with named policy.
app.UseCors("AllowAllHeaders");
.
.
.
}
si pune [EnableCors("AllowAllHeaders")]
de pe controller.
Există unele limitări când vine vorba de CORS. În primul rând, aceasta nu permite metacaractere *
dar nu't ține-mă la asta m-am'am citit-o undeva și nu pot't găsi articolul acum.
Dacă sunteți de a face cereri de la un domeniu diferit aveți nevoie pentru a adăuga permite origine antete.
Access-Control-Allow-Origin: www.other.com
Dacă faci cereri care afectează resursele de server ca POST/PUS/PATCH-uri, și dacă tipul mime este diferit decât următoarele application/x-www-form-urlencoded
, multipart/form-data", sau " text/plain
browser-ul va face automat o pre-OPȚIUNI de zbor cerere pentru a verifica cu serverul dacă s-ar permite.
Deci API/server trebuie să se ocupe de aceste OPȚIUNI de cereri în mod corespunzător, aveți nevoie pentru a răspunde corespunzător controlul accesului anteturile și de răspuns http cod de stare trebuie să fie 200
.
Antetele ar trebui să fie ceva de genul asta, reglați-le pentru nevoile tale:
Access-Control-Allow-Metode: GET, POST, put, PATCH-uri, POST, DELETE, OPȚIUNI Access-Control-Allow-Headers: Content-Type Acces-Control-Max-Vârsta: 86400
Max-vârstă antet este important, în cazul meu, ar't funcționa fără ea, cred că browser-ul are nevoie de informații pentru cât de mult timp "drepturile de acces" sunt valabile.
În plus, dacă faci de exemplu un POST
cerere application/json
mime dintr-un domeniu diferit, de asemenea, nevoie pentru a adăuga menționate anterior permit origine antet, astfel încât acesta ar arata astfel:
Access-Control-Allow-Origin: www.other.com Access-Control-Allow-Metode: GET, POST, put, PATCH-uri, POST, DELETE, OPȚIUNI Access-Control-Allow-Headers: Content-Type Acces-Control-Max-Vârsta: 86400
Atunci când pre-zbor reușește și primește toate informațiile necesare solicitarea ta reală va fi făcut.
În general vorbind, orice Acces-Control` cap sunt solicitate în cea inițială sau pre-cererea de zbor, ar trebui să fie prezentate în răspuns, în scopul de a funcționa.
Acolo este un bun exemplu în MDN docs aici pe acest link, și ar trebui, de asemenea, a verifica afară DECI acest post
JavaScript XMLHttpRequest și Aduce urmați aceeași origine politica. Deci, o aplicație web folosind XMLHttpRequest sau Adu-ar putea face doar HTTP cereri pentru propriul domeniu.
Sursa: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Trebuie să trimiteți **Access-Control-Allow-Origin: *** antet HTTP de pe partea de server.
Dacă sunteți folosind Apache ca server HTTP, atunci puteți adăuga la fișierul de configurare Apache astfel:
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
Mod_headers este activată în mod implicit în Apache, cu toate acestea, poate doriți să se asigure că's activat de funcționare:
a2enmod headers
Dacă utilizați IIS server de șansă. puteți seta mai jos antete în cererea HTTP anteturile de opțiune.
Access-Control-Allow-Origin:*
Access-Control-Allow-Methods: 'HEAD, GET, POST, PUT, PATCH, DELETE'
Access-Control-Allow-Headers: 'Origin, Content-Type, X-Auth-Token';
cu acest post, get, etc., va funcționa bine.
În PHP puteți adăuga anteturi:
<?php
header ("Access-Control-Allow-Origin: *");
header ("Access-Control-Expose-Headers: Content-Length, X-JSON");
header ("Access-Control-Allow-Methods: GET, POST, PATCH, PUT, DELETE, OPTIONS");
header ("Access-Control-Allow-Headers: *");
...
Pentru a repara erorile de cross-origin-cereri probleme într-un Nod de aplicare JS:
npm i cors
Și pur și simplu adăugați liniile de mai jos pentru a app.js
let cors = require('cors')
app.use(cors())
Pentru python flask server, puteți folosi sticla-cors plugin pentru a permite cross domain cereri.
A se vedea : https://flask-cors.readthedocs.io/en/latest/
Pentru cei care folosesc Lambda Integrate Proxy cu API Gateway. Ai nevoie de a configura funcția lambda ca dacă trimiteți cererile dvs. pentru a-l direct, adică funcția ar trebui să înființeze anteturile de răspuns în mod corespunzător. (Dacă utilizați personalizat lambda funcții, acesta va fi manipulat de către API Gateway.)
//In your lambda's index.handler():
exports.handler = (event, context, callback) => {
//on success:
callback(null, {
statusCode: 200,
headers: {
"Access-Control-Allow-Origin" : "*"
}
}
}
În Apache VirtualHost config, am adăugat următoarele linii :
Header always set Access-Control-Allow-Origin "*"
Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"
Header always set Access-Control-Max-Age "1000"
Header always set Access-Control-Allow-Headers "x-requested-with, Content-Type, origin, authorization, accept, client-security-token"
RewriteEngine On
RewriteCond %{REQUEST_METHOD} OPTIONS
RewriteRule ^(.*)$ $1 [R=200,L]
Cred ca dezactivarea CORS de la Chrome nu este modalitate buna de, pentru că dacă îl utilizați în ionic, cu siguranță, în Build Mobile Problema va ridica din Nou.
Deci, mai bine pentru a Repara în Backend.
Mai întâi de toate, În antet, aveți nevoie pentru a seta-
Și dacă API se comportă ca GET și POST atât atunci Seta, de asemenea, în antet-
if ($_SERVER['REQUEST_METHOD'] == 'OPȚIUNI') { dacă (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_METHOD'])) header("Access-Control-Allow-Metode: GET, POST, OPȚIUNI"); if (isset($_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS'])) header("Access-Control-Allow-Headers: {$_SERVER['HTTP_ACCESS_CONTROL_REQUEST_HEADERS']}"); exit(0); }
Echipa noastră ocazional vede acest lucru, folosind Vue, axios și un C# WebApi. Adăugarea unui traseu atribut pe final te're încercarea de a lovi fixat-o pentru noi.
[Route("ControllerName/Endpoint")]
[HttpOptions, HttpPost]
public IHttpActionResult Endpoint() { }
Eu sunt, folosind AWS sdk pentru încărcări, după ce a petrecut ceva timp în căutarea on-line am dat peste acest thread. datorită @lsimoneau 45581857 se pare că exact același lucru s-a întâmplat. Am arătat pur și simplu cererea mea Url-ul în regiune pe găleată prin atașarea opțiunea regiune și a funcționat.
const s3 = new AWS.S3({
accessKeyId: config.awsAccessKeyID,
secretAccessKey: config.awsSecretAccessKey,
region: 'eu-west-2' // add region here });
M-am confruntat cu această problemă când serverul DNS a fost stabilit la 8.8.8.8 (google's). De fapt, problema a fost la router, cererea mea a încercat să se conecteze cu serverul prin intermediul google, nu la nivel local (pentru cazul meu particular). Am scos 8.8.8.8 si asta a rezolvat problema. Știu că problemele rezolvate prin CORS setări, dar poate cineva va avea aceleași probleme ca mine
Independent distribuții de GeoServer include Debarcader application server. Permite Cross-Origin Resource Sharing (CORS) pentru a permite JavaScript aplicații în afara de propriul domeniu pentru a utiliza GeoServer.
Comentați următoarele `
<web-app>
<filter>
<filter-name>cross-origin</filter-name>
<filter-class>org.eclipse.jetty.servlets.CrossOriginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cross-origin</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
L's ușor pentru a rezolva această problemă doar cu câțiva pași ușor,fără griji despre nimic. Vă rugăm,Urmați pașii să-l rezolve .