XMLHttpRequest Origin null no está permitido Access-Control-Allow-Origin para el archivo: /// al archivo: /// (Sin servidor)

Intento crear un sitio web que se pueda descargar y ejecutar localmente al iniciar su archivo de índice.

Todos los archivos son locales, no se usan recursos en línea.

Cuando trato de usar el complemento AJAXSLT para que jQuery procese un archivo XML con una plantilla XSL (en subdirectorios), recibo los siguientes errores:

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.

El archivo de índice que realiza la solicitud es file:///C:/path/to/XSL%20Website/index.html mientras que los archivos de JavaScript utilizados se almacenan en el file:///C:/path/to/XSL%20Website/assets/js/ .

¿Cómo puedo solucionar este problema?

Para las instancias en las que ejecutar un servidor web local no es una opción, puede permitir el acceso de Chrome a file:// través de un interruptor del navegador. Después de algunas excavaciones, encontré esta discusión , que menciona un interruptor de navegador en el post de apertura. Ejecute su instancia de Chrome con:

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

Esto puede ser aceptable para entornos de desarrollo, pero poco más. Ciertamente no quieres esto todo el tiempo. Esto todavía parece ser un problema abierto (a partir de enero de 2011).

Ver también: Problemas con jQuery getJSON utilizando archivos locales en Chrome

Básicamente, la única forma de lidiar con esto es tener un servidor web ejecutándose en el servidor local y servirlo desde allí.

Es inseguro que un navegador permita que una solicitud ajax acceda a cualquier archivo en su computadora, por lo tanto, la mayoría de los navegadores parecen tratar las solicitudes “file: //” como sin origen a los efectos de la ” Política de Same Origin “.

Iniciar un servidor web puede ser tan trivial como cd en el directorio en el que se encuentran los archivos:

 python -m SimpleHTTPServer 

Aquí hay un AppleScript que lanzará Chrome con el parámetro –allow-file-access-from-files activado, para desarrolladores de 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 &" 

Esta solución le permitirá cargar un script local usando jQuery.getScript (). Esta es una configuración global, pero también puede configurar la opción de CrossDomain para cada solicitud.

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

¿Qué pasa con el uso de la función javascript FileReader para abrir el archivo local, es decir:

   

Ahora haga clic en Choose file botón Choose file y busque el archivo file:///C:/path/to/XSL%20Website/data/home.xml

Inicie Chrome de esta forma para evitar esta restricción: open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files .

Derivado del comentario de Josh Lee, pero necesitaba especificar la ruta completa a Google Chrome para evitar que Google Chrome se abriera desde mi partición de Windows (en Parallels).

Puedes intentar poniendo 'Access-Control-Allow-Origin':'*' en response.writeHead(, {[here]}) .

La forma en que acabo de solucionar esto no es utilizar XMLHTTPRequest, sino incluir los datos necesarios en un archivo javascript por separado. (En mi caso, necesitaba un blob de SQLite binario para usar con https://github.com/kripken/sql.js/ )

btoa() un archivo llamado base64_data.js (y usé btoa() para convertir los datos que necesitaba e insertarlo en un

para poder copiarlo).

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

y luego incluyó los datos en el html como javascript normal:

 

Me imagino que sería trivial modificar esto para leer JSON, tal vez incluso XML; Lo dejo como un ejercicio para el lector;)