CORS mortali quando http: // localhost è l'origine


186

Sono bloccato con questo problema CORS, anche se ho impostato il server (nginx / node.js) con le intestazioni appropriate.

Posso vedere nel riquadro Rete Chrome -> Intestazioni di risposta:

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

che dovrebbe fare il trucco.

Ecco il codice che ora uso per testare:

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

ottengo

XMLHttpRequest non può caricare http://stackoverflow.com/ . Origin http: // localhost non è consentito da Access-Control-Allow-Origin.

Sospetto che sia un problema nello script client e non nella configurazione del server ...


44
No, stackoverflow.com deve impostare questa intestazione, non tu. :X. Quale sarebbe il punto della stessa politica di origine altrimenti.
Esailija,

3
Prova ad accedere al server che hai impostato non sovrapporre lo stack. ;)
Nek,

DOH! C'è un modo per dire a Chrome (o altro browser) di ottenere la risorsa anche se manca l'intestazione quando la mia origine è localhost?
whadar,

Esegui i tuoi codici in Chrome (20.0.1132.57, Windows 7), funziona bene.
imwilsonxu,

1
Se stai usando localhost con una porta questa risposta ha funzionato per me serverfault.com/a/673551/238261 .
Nelu,

Risposte:


230

Chrome non supporta localhost per richieste CORS (un bug aperto nel 2010, contrassegnato WontFix nel 2014).

Per ovviare a questo, puoi usare un dominio come lvh.me(che punta a 127.0.0.1 proprio come localhost) o avviare Chrome con il --disable-web-securityflag (supponendo che stai solo testando).


24
@greensuisse - non sta postando su localhost. È la pubblicazione da localhost che è il problema.
Cheeso

9
Quel bug non è valido (ed è stato contrassegnato come tale - crbug.com/67743#c17 ). Il commento di Esailija è corretto, l'aggiunta di queste intestazioni a localhost non ti darà magicamente accesso a tutti gli altri siti. È il sito remoto che deve essere servito con queste intestazioni.
Rob W,

22
Ho appena trascorso 2 ore di test su Chrome per rendermi conto che funziona perfettamente su Firefox ..Grrrr...
FloatingRock

11
Altra opzione: modifica il file hosts in modo che local. [Mysite] .com punti a 127.0.0.1, quindi consenti il ​​tuo file CORS *. [Mysite] .com
tom

6
Ho affrontato lo stesso problema con FireFox. Potrei farlo solo su Edge! Bel post però, fantastico! :)
Luis Gouveia,

54

Secondo la risposta di @ Beau, Chrome non supporta le richieste CORS di localhost e è improbabile che si verifichino cambiamenti in questa direzione.

Uso l' estensione Allow-Control-Allow-Origin: * Chrome per risolvere questo problema. L'estensione aggiungerà le intestazioni HTTP necessarie per CORS:

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

Il codice sorgente è pubblicato su Github .

Si noti che l'estensione filtra tutti gli URL per impostazione predefinita. Ciò potrebbe interrompere alcuni siti Web (ad esempio: Dropbox). L'ho modificato per filtrare solo gli URL localhost con il seguente filtro URL

*://localhost:*/*

14
Se leggi il problema dei link @beau, vedrai che Chrome 100% supporta le richieste di origine incrociata da e verso localhost. Il problema è stato chiuso nel 2014 perché non è stato possibile riprodurlo. Il resto del rumore in quel thread è costituito da persone con server non di origine non configurati correttamente (come nella domanda originale qui).
Molomby

1
Ha funzionato come un incanto per me su Chrome
Aakash Sahai,


3
Questa estensione non funziona Access-Control-Allow-Credentials: trueperché è impostata Access-Control-Allow-Originsu *e avendo entrambi trueed *è bloccata dai browser. Se si utilizzano le credenziali true, è necessario utilizzare l'origine non jolly. Consiglio Moesif Origins e l'estensione CORS Changer che consente di modificare le intestazioni nel modo desiderato.
Samuel,

Forse sto facendo qualcosa di sbagliato, ma questa estensione sembra non funzionare più per me.
James Parker

19

Il vero problema è che se impostiamo -Allow-tutte le richieste ( OPTIONS& POST), Chrome lo annullerà. Il seguente codice funziona per me con POSTLocalHost 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);
} 
?>

15
OP utilizza nginx / node.js. Non PHP
code_monk il

4

Chrome invierà richieste con CORS da a localhost un'origine bene. Questo non è un problema con Chrome.

Il motivo per cui non puoi caricare http://stackoverflow.comè che le Access-Control-Allow-Originintestazioni non consentivano la tua localhostorigine.


2

Correzione rapida e sporca dell'estensione di Chrome:

Moesif Orign & CORS Changer

Tuttavia, Chrome supporta le richieste di origine incrociata da localhost. Assicurati di aggiungere un'intestazione Access-Control-Allow-Originper localhost.


ho aggiunto questa estensione alla mia Opera e ora è pronta. non so mai quando è acceso e spento, quindi uso Firefox per lavoro. e opera per lo sviluppo. a Google Suit non piace, e nemmeno altre cose.
Maddocks,

1

Nessuna delle estensioni ha funzionato per me, quindi ho installato un semplice proxy locale. Nel mio caso https://www.npmjs.com/package/local-cors-proxy È una configurazione di 2 minuti:

(dal loro sito)

npm install -g local-cors-proxy

Endpoint API che vogliamo richiedere con problemi CORS: https://www.yourdomain.ie/movies/list

Avvia proxy: lcp --proxyUrl https://www.yourdomain.ie

Quindi nel tuo codice client, nuovo endpoint API: http://localhost:8010/proxy/movies/list

Ha funzionato come per me: la tua app chiama il proxy, che chiama il server. Zero problemi CORS.


0

Ho deciso di non toccare le intestazioni e fare invece un reindirizzamento sul lato server e si sveglia come un fascino.

L'esempio che segue è per l'attuale versione di Angular (attualmente 9) e probabilmente qualsiasi altro framework che utilizza i webpack DevServer. Ma penso che lo stesso principio funzionerà su altri backend.

Quindi uso la seguente configurazione nel file proxy.conf.json :

{
  "/api": {
    "target": "http://localhost:3000",
    "pathRewrite": {"^/api" : ""},
   "secure": false
 }
}

In caso di Angular servo con quella configurazione:

$ ng serve -o --proxy-config=proxy.conf.json

Preferisco usare il proxy nel comando serve, ma puoi anche mettere questa configurazione su angular.json in questo modo:

"architect": {
  "serve": {
    "builder": "@angular-devkit/build-angular:dev-server",
    "options": {
      "browserTarget": "your-application-name:build",
      "proxyConfig": "src/proxy.conf.json"
    },

Guarda anche:

https://www.techiediaries.com/fix-cors-with-angular-cli-proxy-configuration/

https://webpack.js.org/configuration/dev-server/#devserverproxy

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.