"Solicitações de origem cruzada são suportadas apenas para HTTP". erro ao carregar um arquivo local

796

Estou tentando carregar um modelo 3D no Three.js JSONLoadere esse modelo 3D está no mesmo diretório que o site inteiro.

Estou recebendo o "Cross origin requests are only supported for HTTP."erro, mas não sei o que está causando nem como corrigi-lo.

corazza
fonte
23
Você está tentando fazer isso localmente?
WojtekT 25/05
11
Você precisa usar localhost, mesmo se o seu arquivo local
Neil
22
Mas não é um domínio cruzado!
Corazza 25/05
21
Se você estiver usando o Chrome, iniciá-lo no terminal com a opção - Permitir acesso a arquivos a partir de arquivos pode ajudá-lo.
Nickiaconis
12
Sim, não é realmente um domínio cruzado quando o arquivo está na mesma pasta da página da Web, agora é ... Descobri que se você usa o Firefox em vez do Chrome, o problema desaparece.
Sphinxxx 09/04

Respostas:

790

Minha bola de cristal diz que você está carregando o modelo usando file://ou C:/, o que permanece fiel à mensagem de erro, pois não estáhttp://

Portanto, você pode instalar um servidor da Web no PC local ou fazer upload do modelo em outro lugar e usar jsonpe alterar o URL parahttp://example.com/path/to/model

A origem é definida no RFC-6454 como

   ...they have the same
   scheme, host, and port.  (See Section 4 for full details.)

Portanto, mesmo que seu arquivo seja originário do mesmo host ( localhost), mas contanto que o esquema seja diferente ( http/ file), eles serão tratados como origem diferente.

Andreas Wong
fonte
7
Sim, estou tentando fazer isso usando file://, mas não entendo por que isso é permitido. Bem, eu estou instalando LAMPP eu acho ...
CORAZZA
150
Imagine se isso é permitido e um webapp em que o autor da página usa algo como load('file://C:/users/user/supersecret.doc')e, em seguida, fazer o upload do conteúdo para o seu servidor usando ajax etc
Andreas Wong
11
Infelizmente, a política é feita para todos os casos, não só para o seu :(, então Ya conseguiu ter com ele
Andreas Wong
28
Há uma página para este tópico no wiki do GitHub: github.com/mrdoob/three.js/wiki/How-to-run-things-locally
Felipe Lima
29
Você também pode usar a opção --allow-file-access-from-files no chrome. Por minha resposta aqui: stackoverflow.com/questions/8449716/…
prauchfuss
609

Apenas para ser explícito - Sim, o erro está dizendo que você não pode apontar seu navegador diretamente para file://some/path/some.html

Aqui estão algumas opções para ativar rapidamente um servidor da Web local e permitir que o navegador renderize arquivos locais

Python 2

Se você tem o Python instalado ...

  1. Mude o diretório para a pasta em que seu arquivo some.htmlou arquivos existe usando o comandocd /path/to/your/folder

  2. Inicie um servidor da Web Python usando o comando python -m SimpleHTTPServer

Isso iniciará um servidor da web para hospedar toda a sua lista de diretórios em http://localhost:8000

  1. Você pode usar uma porta personalizada, python -m SimpleHTTPServer 9000fornecendo o link:http://localhost:9000

Essa abordagem está embutida em qualquer instalação do Python.

Python 3

Execute as mesmas etapas, mas use o seguinte comando python3 -m http.server

Node.js

Como alternativa, se você exige uma configuração mais responsiva e já usa o nodejs ...

  1. Instalar http-serverdigitandonpm install -g http-server

  2. Mude para o seu diretório de trabalho, onde suas some.htmlvidas

  3. Inicie seu servidor http emitindo http-server -c-1

Isso gera um httpd do Node.js. que serve os arquivos em seu diretório como arquivos estáticos acessíveis em http://localhost:8080

Rubi

Se o seu idioma preferido é Ruby ... os Deuses Ruby dizem que isso também funciona:

ruby -run -e httpd . -p 8080

PHP

Claro que o PHP também tem sua solução.

php -S localhost:8000
Scott Stensland
fonte
3
Isso me salvou muito tempo, obrigado. Minha instalação do Python não tinha o módulo SimpleHTTPServer, mas as instruções do nó funcionaram como um encanto.
LukeP
3
Em resposta ao comentário de LukeP, no python 2.7, o comando funciona de acordo com as instruções $ python -m SimpleHTTPServer, que produzem a mensagem: Serving HTTP on 0.0.0.0 port 8000 ...Se você digitar o nome do módulo errado, por exemplo $ python -m SimpleHttpServer, você receberá a mensagem de erro No module named SimpleHttpServerVocê receberá uma mensagem de erro semelhante se tiver o python3 instalado (v. python 2.7). Você pode verificar a versão do python usando o comando: $ python --version. Você também pode especificar a porta para escutar assim:$ python -m SimpleHTTPServer 3333
7stud
1
O servidor python exibe arquivos do diretório em que você inicia o servidor. Portanto, se os arquivos que você deseja exibir estiverem localizados em / Users / 7stud / angular_projects / 1app, inicie o servidor nesse diretório, por exemplo $ cd ~/angular_projects/1app, então $ python -m SimpleHTTPServer. No seu navegador, digite o URL http://localhost:8000/index.html. Você também pode solicitar arquivos em subdiretórios do diretório em que você iniciou o servidor, por exemplo:http://localhost:8000/subdir/hello.html
7stud
2
Ouvi dizer que o Python é simples e poderoso, assim como a linguagem "X", mas isso é ridículo! Não é necessário instalar o XAMPP ou configurar um servidor http simples js com nó para servir arquivos estáticos - um comando e boom! Muito obrigado, economiza muito tempo e aborrecimentos.
RD
2
IMPRESSIONANTE! - para Python no Windows, use: python -m http.server 8080 ... ou qualquer porta que você quiser e quando quiser sair, basta pressionar ctrl-c.
Kristopher
162

No Chrome, você pode usar este sinalizador:

--allow-file-access-from-files

Leia mais aqui.

Comunidade
fonte
11
@ Blairg23, tenha em mente que esta solução requer reiniciar todas as instâncias do chrome.exe para que ele funcione
Alex Klaus
4
Por favor, explique como usá-lo no chrome.
Rishabh Agrahari
@Priya não deve fazer isso embora
Suraj Jain
Eu sugeriria usar o Chromium apenas para depuração local (iniciando-o com sinalizador --allow-file-access-from-files). Significa usar o Chrome para navegação comum na Web e usar o Chromium como aplicativo padrão para arquivos HTML.
Alan Zhiliang Feng
Observe que fetch()ainda assim nega isso de qualquer maneira. Você deve usar XMLHttpRequestde alguma maneira
Hashbrown
63

Corri para isso hoje.

Eu escrevi um código que se parecia com isso:

app.controller('ctrlr', function($scope, $http){
    $http.get('localhost:3000').success(function(data) {
        $scope.stuff = data;
    });
});

... mas deveria ter ficado assim:

app.controller('ctrlr', function($scope, $http){
    $http.get('http://localhost:3000').success(function(data) {
        $scope.stuff = data;
    });
});

A única diferença foi a falta http://no segundo trecho de código.

Só queria divulgar isso no caso de outras pessoas com problemas semelhantes.

James Harrington
fonte
41

Basta alterar o URL para em http://localhostvez de localhost. Se você abrir o arquivo html a partir de local, crie um servidor local para veicular esse arquivo html, a maneira mais simples é usá-lo Web Server for Chrome. Isso resolverá o problema.

Finlandês
fonte
5
+1 para Web Server for Chromeligação app - é de longe a solução mais simples e mais limpa para a configuração do httpd temporário para Chrome IMO
Isso me salvou. A solução exata
Surya
18

Em um aplicativo Android - por exemplo, para permitir que o JavaScript tenha acesso a ativos via file:///android_asset/- use setAllowFileAccessFromFileURLs(true)o WebSettingsque você obtém ao acessar getSettings()o WebView.

CommonsWare
fonte
Brilhante! Estávamos prestes a reescrever métodos para injetar JSON em variáveis ​​.. mas isso funciona! webView.getSettings (). setAllowFileAccessFromFileURLs (true);
WallyHale
15

Use http://ou https://para criar URL

erro :localhost:8080

solução :http://localhost:8080

KARTHIKEYAN.A
fonte
14

A maneira mais rápida para mim foi: para usuários do Windows, executar o seu arquivo no Firefox resolvido o problema, ou se você quiser usar o chrome, a maneira mais fácil para mim era instalar o Python 3 e, a partir do prompt de comando run command python -m http.server , vá para http: // localhost: 8000 / depois navegue até seus arquivos

python -m http.server
Ridha Rezzag
fonte
13

Vou listar três abordagens diferentes para resolver esse problema:

  1. Usando um npmpacote muito leve : Instale o servidor ao vivo usando npm install -g live-server. Em seguida, vá para esse diretório, abra o terminal e digite live-servere pressione Enter, a página será veiculada em localhost:8080. BÔNUS: Ele também suporta recarga a quente por padrão.
  2. Usando um aplicativo leve do Google Chrome desenvolvido pelo Google : instale o aplicativo, vá para a guia Aplicativos no Chrome e abra o aplicativo. No aplicativo, aponte para a pasta correta. Sua página será exibida!
  3. Modificando o atalho do Chrome no Windows : Crie um atalho do navegador Chrome. Clique com o botão direito do mouse no ícone e abra propriedades. Nas propriedades, editar targeta "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:/ChromeDevSession"e salve. Em seguida, usando o Chrome, abra a página usando ctrl+o. NOTA: NÃO use este atalho para navegar regularmente.
Barba Negra
fonte
12

Para aqueles no Windows sem Python ou Node.js, ainda existe uma solução leve: Mongoose .

Tudo o que você faz é arrastar o executável para onde quer que a raiz do servidor esteja e executá-lo. Um ícone aparecerá na barra de tarefas e ele navegará para o servidor no navegador padrão.

Além disso, o Z-WAMP é um WAMP 100% portátil que roda em uma única pasta, é incrível. Essa é uma opção se você precisar de um servidor PHP e MySQL rápido.

bryc
fonte
Se você instalar o php ou você tem instalado, você pode iniciar um servidor na sua pasta: php.net/manual/es/features.commandline.webserver.php
jechaviz
12

Se você usa o Mozilla Firefox, funcionará como esperado, sem problemas;

PS Surpreendentemente, o IntenetExplorer_Edge funciona absolutamente bem !!!

Yash P Shah
fonte
1
não mais. firefox e ie ambos estão bloqueando o pedido de cors para mim.
Baahubali 15/06/19
também isso não é uma coisa boa para acessar páginas não seguras: D
csomakk
6

Solução fácil para quem usa o VS Code

Estou recebendo esse erro há algum tempo. A maioria das respostas funciona. Mas eu encontrei uma solução diferente. Se você não quiser lidar com node.jsou qualquer outra solução aqui e estiver trabalhando com um arquivo HTML (chamando funções de outro arquivo js ou buscar json api's), tente usar a extensão do Live Server .

Ele permite que você abra um servidor ativo facilmente. E por causa disso cria localhostservidor, o problema está resolvendo. Você pode simplesmente iniciar o localhostarquivo, abra um arquivo HTML, clique com o botão direito do mouse no editor e clique em Open with Live Server.

Basicamente, carrega os arquivos usando em http://localhost/index.htmlvez de usar file://....

EDITAR

Não é necessário ter um .htmlarquivo. Você pode iniciar o Live Server com atalhos.

Clique (alt+L, alt+O)para abrir o servidor e (alt+L, alt+C)parar o servidor. [No MAC cmd+L, cmd+Oe cmd+L, cmd+C]

Espero que ajude alguém :)

Ömürcan Cengiz
fonte
4

Eu estava recebendo esse erro exato ao carregar um arquivo HTML no navegador que estava usando um arquivo json no diretório local. No meu caso, consegui resolver isso criando um servidor de nó simples que permitia o servidor de conteúdo estático. Deixei o código para esta outra resposta .

thehme
fonte
4

Eu sugiro que você use um mini-servidor para executar esse tipo de aplicativo no host local (se você não estiver usando algum servidor embutido).

Aqui está um que é muito simples de configurar e executar:

https://www.npmjs.com/package/tiny-server
Deniss M.
fonte
4

Suspeito que já tenha sido mencionado em algumas respostas, mas modificarei um pouco para ter uma resposta completa (mais fácil de encontrar e usar).

  1. Acesse: https://nodejs.org/en/download/ . Instale o nodejs.

  2. Instale o servidor http executando o comando no prompt de comando npm install -g http-server.

  3. Mude para o diretório de trabalho, onde index.html/ yoursome.htmlreside.

  4. Inicie seu servidor http executando o comando http-server -c-1

Abra o navegador da Web para http://localhost:8080 ou http://localhost:8080/yoursome.html - dependendo do seu nome de arquivo html.

TarmoPikaro
fonte
3

Simplesmente diz que o aplicativo deve ser executado em um servidor web. Eu tive o mesmo problema com o chrome, iniciei o tomcat e movi meu aplicativo para lá, e funcionou.

Enayat
fonte
1

er. Acabei de encontrar algumas palavras oficiais "A tentativa de carregar módulos AMD remotos não construídos que usam o plug-in dojo / text falhará devido a restrições de segurança de origem cruzada. (As versões construídas dos módulos AMD não são afetadas porque as chamadas ao dojo / text são eliminadas por o sistema de compilação.) " https://dojotoolkit.org/documentation/tutorials/1.10/cdn/

YUIOP QWERT
fonte
1

Uma maneira de trabalhar com o carregamento de arquivos locais é usá-los na pasta do projeto, em vez de fora da pasta do projeto. Crie uma pasta nos arquivos de exemplo do seu projeto, semelhante à maneira como criamos para imagens e substitua a seção em que use o caminho local completo que não seja o caminho do projeto e use o URL relativo do arquivo na pasta do projeto. Funcionou para mim

Naga Sai A
fonte
1

Para todos vocês MacOS... configure um LaunchAgent simples para ativar esses recursos fascinantes em sua própria cópia do Chrome ...

Salve a plist, nomeado o que for ( launch.chrome.dev.mode.plistpor exemplo), ~/Library/LaunchAgentscom conteúdo semelhante a ...

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>launch.chrome.dev.mode</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Applications/Google Chrome.app/Contents/MacOS/Google Chrome</string>
        <string>-allow-file-access-from-files</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

Ele deve ser iniciado na inicialização. Mas você pode forçá-lo a fazê-lo a qualquer momento com o comando terminal

launchctl load -w ~/Library/LaunchAgents/launch.chrome.dev.mode.plist

TADA! 😎 💁🏻 🙊 🙏🏾

Alex Gray
fonte
1
  • Instale o servidor web local para java, por exemplo, Tomcat, para php, você pode usar a lâmpada etc.
  • Solte o arquivo json no diretório público do servidor de aplicativos acessível
  • Item da lista

  • Inicie o servidor de aplicativos e você poderá acessar o arquivo no localhost

Fred Ondieki
fonte
1

Não é possível carregar arquivos locais estáticos (por exemplo: svg) sem servidor. Se você possui o NPM / YARN instalado em sua máquina, pode configurar um servidor http simples usando " http-server "

npm install http-server -g
http-server [path] [options]

Ou abra o terminal nessa pasta do projeto e digite "hs". Ele iniciará automaticamente o servidor HTTP ativo.

Sujith S
fonte
resposta duplicada
Scott Stensland
0

Também pude recriar essa mensagem de erro ao usar uma marca de âncora com o seguinte href:

<a href="javascript:">Example a tag</a>

No meu caso, uma tag estava sendo usada para obter o 'Cursor do Ponteiro' e o evento foi realmente controlado por algum evento jQuery on click. Eu removi o href e adicionei uma classe que se aplica:

cursor:pointer;

mgilberties
fonte
0

Para usuários do Linux Python:

import webbrowser
browser = webbrowser.get('google-chrome --allow-file-access-from-files %s')
browser.open(url)
Daniel Braun
fonte
Não há motivo para google-chrome --allow-file-access-from-files <url>não funcionar e ser mais conciso?
agupta231
@ agupta231 O módulo navegador de web possui argumentos que permitem diferentes tipos de "abertura", por exemplo. aberto na guia atual, nova guia, nova janela etc.
Daniel Braun
0

Se você insistir em executar o .htmlarquivo localmente e não servi-lo com um servidor da web, poderá impedir que essas solicitações entre origens ocorram em primeiro lugar, disponibilizando os recursos problemáticos em linha.

Eu tive esse problema ao tentar atender .jsarquivos file://. Minha solução foi atualizar meu script de construção para substituir as <script src="...">tags <script>...</script>. Aqui está uma gulpabordagem para fazer isso:

1. corra npm install --save-devpara pacotes gulp, gulp-inlinee del.

2. Depois de criar um gulpfile.jsno diretório raiz, adicione o seguinte código (basta alterar os caminhos do arquivo para o que mais lhe convier):

let gulp = require('gulp');
let inline = require('gulp-inline');
let del = require('del');

gulp.task('inline', function (done) {
    gulp.src('dist/index.html')
    .pipe(inline({
        base: 'dist/',
        disabledTypes: 'css, svg, img'
    }))
    .pipe(gulp.dest('dist/').on('finish', function(){
        done()
    }));
});

gulp.task('clean', function (done) {
    del(['dist/*.js'])
    done()
});

gulp.task('bundle-for-local', gulp.series('inline', 'clean'))
  1. Execute gulp bundle-for-localou atualize seu script de construção para executá-lo automaticamente.

Você pode ver o problema e a solução detalhados do meu caso aqui .

noamyg
fonte
-1

Cordova conseguir isso. Ainda não consigo descobrir como foi a cordova. Ele nem passa pelo shouldInterceptRequest.

Mais tarde, descobri que a chave para carregar qualquer arquivo do local é: myWebView.getSettings (). SetAllowUniversalAccessFromFileURLs (true);

E quando você deseja acessar qualquer recurso http, a visualização na Web faz a verificação com o método OPTIONS, que você pode conceder através do WebViewClient.shouldInterceptRequest retornando uma resposta e, para o método GET / POST a seguir, basta retornar nulo.

user1462586
fonte
-1

Experimentei isso quando baixei uma página para visualização offline.

Eu só tinha que remover o integrity="*****"e crossorigin="anonymous"atributos de todo <link>e <script>etiquetas

aphoe
fonte