XMLHttpRequest Origin null non è consentito Access-Control-Allow-Origin per il file: /// nel file: /// (Serverless)


209

Sto cercando di creare un sito Web che può essere scaricato ed eseguito localmente avviando il suo file indice.

Tutti i file sono locali, nessuna risorsa viene utilizzata online.

Quando provo a utilizzare il plug-in AJAXSLT per jQuery per elaborare un file XML con un modello XSL (nelle directory secondarie), ricevo i seguenti errori:

XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/data/home.xml. Origin null is not allowed by Access-Control-Allow-Origin.

XMLHttpRequest cannot load file:///C:/path/to/XSL%20Website/assets/xsl/main.xsl. Origin null is not allowed by Access-Control-Allow-Origin.

Il file indice che effettua la richiesta è file:///C:/path/to/XSL%20Website/index.htmlmentre i file JavaScript utilizzati sono memorizzati file:///C:/path/to/XSL%20Website/assets/js/.

Come posso fare per risolvere questo problema?

Risposte:


177

Per i casi in cui l'esecuzione di un server web locale non è un'opzione, puoi consentire a Chrome l'accesso ai file://file tramite uno switch del browser. Dopo alcuni scavi, ho trovato questa discussione , che menziona uno switch del browser nel post di apertura. Esegui la tua istanza di Chrome con:

chrome.exe --allow-file-access-from-files

Questo può essere accettabile per gli ambienti di sviluppo, ma poco altro. Certamente non lo vuoi sempre. Questo sembra ancora essere un problema aperto (da gennaio 2011).

Vedi anche: Problemi con jQuery getJSON utilizzando file locali in Chrome


1
@Rich, felice che ti sia stato d'aiuto! Mi chiedo se ci sarà una maggiore domanda per questo con la spinta di Google verso le app basate su browser. Penso che la domanda crescerà solo.
Courtney Christensen,

4
questo è stato utile per macs OS X cweagans.net/blog/2011/1/24/…
kinet

1
Grazie, mi chiedevo dove avevo sbagliato a scrivere codice, sembra che il problema sia il browser.
Arda,

4
C'è qualche motivo --allow-file-access-from-files non risolve il problema. Sto semplicemente cercando di caricare un file di script come $ .getScript ("application.js"); e ottieni l'errore descritto nella domanda.
Denzo,

1
Questo funziona, tuttavia "Prima di eseguire il comando, assicurati che tutta la finestra di Chrome sia chiusa e che non sia altrimenti in esecuzione. Oppure, il parametro della riga di comando non sarebbe efficace." Chrome.exe --allow-file-access-from- file "" ( stackoverflow.com/a/4208455/1272428 )
rluks

87

In sostanza, l'unico modo per gestirlo è avere un server web in esecuzione su localhost e servirli da lì.

Non è sicuro per un browser consentire a una richiesta Ajax di accedere a qualsiasi file sul tuo computer, pertanto la maggior parte dei browser sembra trattare le richieste "file: //" come non aventi origine ai fini di " Stessa politica di origine "

L'avvio di un server web può essere banale quanto l' cding. Nella directory in cui sono in esecuzione i file:

python -m SimpleHTTPServer

1
Spero di sviluppare una soluzione che non richieda all'utente di utilizzare qualcosa di più del proprio browser web. L'uso di Python, qualsiasi interprete o qualsiasi software agnostico non di sistema non è praticabile.
Kevin Herrera,

5
Bene, l'unica altra soluzione che mi viene in mente è quella di caricare l'intera cosa in una singola pagina in modo da non dover effettuare alcuna richiesta Ajax al file system.
Singletoned

2
Grazie @Singletoned! Sto usando la tua soluzione ed è molto utile!
Hendy Irawan,

4
E se stai usando Python 3, il comando sarebbe python -m http.server.
alextercete,

4

Ecco uno script di Apple che avvierà Chrome con l'opzione --allow-file-access-from-files attivata, per gli sviluppatori OSX / Chrome là fuori:

set chromePath to POSIX path of "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"    
set switch to " --allow-file-access-from-files"
do shell script (quoted form of chromePath) & switch & " > /dev/null 2>&1 &"

14
Si può semplicemente utilizzare aperta (1) per aggiungere le bandiere: open -a 'Google Chrome' --args --allow-file-access-from-files.
Josh Lee,

4

Questa soluzione ti permetterà di caricare uno script locale usando jQuery.getScript (). Questa è un'impostazione globale ma è anche possibile impostare l'opzione crossDomain su una base per richiesta.

$.ajaxPrefilter( "json script", function( options ) {
  options.crossDomain = true;
});

ha funzionato come un incantesimo per caricare un file js locale da un file html locale! grazie, esattamente quello di cui avevo bisogno.
user1577390,

4

Che dire dell'utilizzo della funzione FileReader javascript per aprire il file locale, ovvero:

<input type="file" name="filename" id="filename">
<script>
$("#filename").change(function (e) {
  if (e.target.files != undefined) {
    var reader = new FileReader();
    reader.onload = function (e) {
        // Get all the contents in the file
        var data = e.target.result; 
        // other stuffss................            
    };
    reader.readAsText(e.target.files.item(0));
  }
});
</script>

Ora fai clic sul Choose filepulsante e cerca il filefile:///C:/path/to/XSL%20Website/data/home.xml


3

Cromo lancio in questo modo per aggirare questa limitazione: open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files.

Derivato dal commento di Josh Lee, ma dovevo specificare il percorso completo di Google Chrome in modo da evitare l'apertura di Google Chrome dalla mia partizione di Windows (in Parallels).


2

Il modo in cui ho appena risolto questo problema non è usare XMLHTTPRequest, ma includere invece i dati necessari in un file javascript separato. (Nel mio caso avevo bisogno di un BLOB binario di SQLite da utilizzare con https://github.com/kripken/sql.js/ )

Ho creato un file chiamato base64_data.js(e utilizzato btoa()per convertire i dati di cui avevo bisogno e inserirlo in un <div>modo che potessi copiarlo).

var base64_data = "U1FMaXRlIGZvcm1hdCAzAAQA ...<snip lots of data> AhEHwA==";

e quindi inclusi i dati nell'html come javascript normale:

<div id="test"></div>

<script src="base64_data.js"></script>
<script>
    data = atob(base64_data);
    var sqldb = new SQL.Database(data);
    // Database test code from the sql.js project
    var test = sqldb.exec("SELECT * FROM Genre");
    document.getElementById("test").textContent = JSON.stringify(test);
</script>

Immagino che sarebbe banale modificarlo per leggere JSON, forse anche XML; Lo lascerò come esercizio per il lettore;)


1

Si può provare a mettere 'Access-Control-Allow-Origin':'*'in response.writeHead(, {[here]}).


6
da dove proviene response.writeHead, come lo chiamo e da dove? Puoi fare altri esempi? Tieni presente che si tratta di un file system locale e non di un server. La mia comprensione è che il valore può essere impostato solo da un server?
Joseph Astrahan,

0

utilizza il "web server per l'app Chrome". (lo hai effettivamente sul tuo PC, se lo sai o no. basta cercarlo in cortana!). aprilo e fai clic su 'scegli file' scegli la cartella con il tuo file al suo interno. non selezionare effettivamente il file. seleziona la cartella dei tuoi file quindi fai clic sui link sotto il pulsante "scegli cartella".

se non ti porta al file, quindi aggiungi il nome del file agli urs. come questo:

   https://127.0.0.1:8887/fileName.txt

collegamento al server Web per Chrome: fare clic su di me

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.