XMLHttpRequest Origin null não é permitido Access-Control-Allow-Origin para file: /// para file: /// (Serverless)

Eu estou tentando criar um site que pode ser baixado e executado localmente, iniciando seu arquivo de índice.

Todos os arquivos são locais, nenhum recurso é usado online.

Quando eu tento usar o plugin AJAXSLT para jQuery para processar um arquivo XML com um modelo XSL (em sub-diretórios), recebo os seguintes erros:

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.

O arquivo de índice que faz a solicitação é file:///C:/path/to/XSL%20Website/index.html enquanto os arquivos JavaScript usados ​​são armazenados em file:///C:/path/to/XSL%20Website/assets/js/ .

Como posso fazer para corrigir esse problema?

Para instâncias em que a execução de um servidor da Web local não é uma opção, você pode permitir o access do Chrome aos file:// por meio de uma opção de navegador. Depois de algumas escavações, encontrei esta discussão , que menciona um interruptor de navegador na postagem de abertura. Execute sua instância do Chrome com:

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

Isso pode ser aceitável para ambientes de desenvolvimento, mas pouco mais. Você certamente não quer isso o tempo todo. Isso ainda parece ser uma questão em aberto (a partir de janeiro de 2011).

Veja também: Problemas com o getJSON do jQuery usando arquivos locais no Chrome

Essencialmente, a única maneira de lidar com isso é ter um servidor web em execução no host local e servi-los de lá.

É inseguro para um navegador permitir que uma solicitação de ajax acesse qualquer arquivo em seu computador, portanto, a maioria dos navegadores parece tratar as solicitações “file: //” como não tendo origem para o propósito de ” Política de mesma origem ”

A boot de um servidor da Web pode ser tão trivial quanto cd o diretório em que os arquivos estão em execução:

 python -m SimpleHTTPServer 

Aqui está um applescript que lançará o Chrome com a opção –allow-file-access-from-files ativada, para os desenvolvedores do 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 solução permitirá que você carregue um script local usando jQuery.getScript (). Essa é uma configuração global, mas você também pode definir a opção crossDomain por solicitação.

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

Que tal usar a function javascript FileReader para abrir o arquivo local, ou seja:

   

Agora clique no botão Choose file e navegue até o arquivo file:///C:/path/to/XSL%20Website/data/home.xml

Inicie o chrome para contornar essa restrição: open -a "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" --args --allow-file-access-from-files .

Derivado do comentário de Josh Lee, mas precisei especificar o caminho completo para o Google Chrome, para evitar que o Google Chrome fosse aberto a partir da minha partição do Windows (no Parallels).

Você pode tentar colocar 'Access-Control-Allow-Origin':'*' em response.writeHead(, {[here]}) .

A maneira que eu trabalhei em torno disso não é usar XMLHTTPRequest, mas include os dados necessários em um arquivo javascript separado. (No meu caso, eu precisava de um blob SQLite binário para usar com https://github.com/kripken/sql.js/ )

Eu criei um arquivo chamado base64_data.js (e usei o btoa() para converter os dados que eu precisava e inseri-lo em um

para que eu pudesse copiá-lo).

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

e, em seguida, incluiu os dados no html como javascript normal:

 

Eu imagino que seria trivial modificar isso para ler JSON, talvez até XML; Vou deixar isso como um exercício para o leitor;)