XMLHttpRequest Origine null non è consentito Access-Control-Allow-Origin per il file: /// al file: /// (Senza server)

Sto provando a 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 plugin AJAXSLT per jQuery per elaborare un file XML con un modello XSL (nelle sottodirectory), 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 di indice che effettua la richiesta è il file:///C:/path/to/XSL%20Website/index.html mentre i file JavaScript utilizzati sono memorizzati nel file:///C:/path/to/XSL%20Website/assets/js/ .

Come posso fare per risolvere questo problema?

Per i casi in cui l’esecuzione di un server web locale non è un’opzione, è ansible consentire a Chrome l’accesso ai file:// file tramite uno switch del browser. Dopo alcuni scavi, ho trovato questa discussione , che menziona un cambio di 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. Di certo non lo vuoi su tutto il tempo. Questo sembra essere ancora un problema aperto (a partire da gennaio 2011).

Vedi anche: Problemi con jQuery getJSON usando i file locali in Chrome

Essenzialmente l’unico modo per gestire questo è avere un server web in esecuzione su localhost e servirli da lì.

Non è sicuro che un browser consenta una richiesta Ajax di accedere a qualsiasi file sul tuo computer, pertanto la maggior parte dei browser considera le richieste “file: //” come prive di origine ai fini della ” Same Origin Policy ”

L’avvio di un server web può essere banale come fare un cd nella directory in cui si trovano i file:

 python -m SimpleHTTPServer 

Ecco un applescript che avvierà Chrome con l’opzione –allow-file-access-from-files triggersta, per gli sviluppatori OSX / Chrome:

 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 &" 

Questa soluzione ti permetterà di caricare uno script locale usando jQuery.getScript (). Questa è un’impostazione globale, ma puoi anche impostare l’opzione crossDomain in base alle richieste.

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

Che ne pensi di utilizzare la funzione FileReader javascript per aprire il file locale, ad esempio:

   

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

Avvia Chrome in questo modo per ignorare questa restrizione: open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files .

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

Puoi provare a inserire 'Access-Control-Allow-Origin':'*' in response.writeHead(, {[here]}) .

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

Ho creato un file chiamato base64_data.js (e usato btoa() per convertire i dati di cui avevo bisogno e inserirlo in un

modo che potessi copiarlo).

 var base64_data = "U1FMaXRlIGZvcm1hdCAzAAQA ... AhEHwA=="; 

e quindi ha incluso i dati nel codice HTML come javascript normale:

 

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