“仅HTTP支持跨源请求。” 加载本地文件时出错


796

我正在尝试使用将3D模型加载到Three.js中JSONLoader,并且该3D模型与整个网站位于同一目录中。

我遇到了"Cross origin requests are only supported for HTTP."错误,但是我不知道是什么原因引起的,也不知道如何解决。


23
您是否要在本地执行此操作?
WojtekT 2012年

10
即使本地文件是本地文件,您也需要使用localhost
Neil

22
但这不是跨域的!
2012年

21
如果您使用的是Chrome,则从终端使用--allow-file-access-from-files选项启动它可能会帮助您。
nickiaconis

12
是的,当文件与网页位于同一文件夹中时,它实际上不是跨域的,现在是...我发现,如果您使用Firefox而不是Chrome,问题就消失了。
Sphinxxx '16

Answers:


790

我的水晶球说您正在使用file://或加载模型C:/,这对于错误消息是正确的,因为它们不是http://

因此,您既可以在本地PC上安装Web服务器,也可以将模型上传到其他地方,然后使用jsonp并将URL更改为http://example.com/path/to/model

RFC-6454中将原点定义为

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

因此,即使您的文件来自同一主机(localhost),但只要方案不同(http/ file),它们都将被视为不同的来源。


7
是的,我正在尝试使用进行此操作file://,但我不明白为什么允许这样做。好吧,我正在安装兰普,我想...
corazza,2012年

150
试想一下,如果这是允许的,web应用程序,其中网页的作者使用像load('file://C:/users/user/supersecret.doc'),然后使用将内容上传至自己的服务器AJAX等
安德烈亚斯皇

11
不幸的是,我们为所有情况制定了政策,不仅针对您的情况:(,所以您必须忍受
Andreas Wong

28
GitHub Wiki上有一个有关此主题的页面:github.com/mrdoob/three.js/wiki/How-to-run-things-locally
Felipe Lima

29
您也可以在Chrome中使用--allow-file-access-from-files开关。每我的答案在这里:stackoverflow.com/questions/8449716/...
prauchfuss

609

明确地说-是的,错误是说您不能直接将浏览器指向 file://some/path/some.html

这里有一些选项可以快速启动本地Web服务器,让您的浏览器呈现本地文件

Python 2

如果您安装了Python ...

  1. some.html使用以下命令将目录更改为文件所在的文件夹cd /path/to/your/folder

  2. 使用以下命令启动Python Web服务器 python -m SimpleHTTPServer

这将启动一个Web服务器来托管您的整个目录列表,网址为 http://localhost:8000

  1. 您可以使用自定义端口 python -m SimpleHTTPServer 9000为您提供链接:http://localhost:9000

此方法内置于任何Python安装中。

Python 3

执行相同的步骤,但改用以下命令 python3 -m http.server

Node.js

或者,如果您需要更敏感的设置并已使用nodejs ...

  1. http-server通过键入安装npm install -g http-server

  2. 更改到您的工作目录,你的some.html生活

  3. 通过发出启动HTTP服务器 http-server -c-1

这会启动一个Node.js httpd,它将您目录中的文件作为静态文件提供,可从以下位置访问 http://localhost:8080

红宝石

如果您首选的语言是Ruby ... Ruby Gods表示这也可以:

ruby -run -e httpd . -p 8080

的PHP

当然,PHP也有其解决方案。

php -S localhost:8000

3
这节省了我很多时间,谢谢。我的Python安装程序没有SimpleHTTPServer模块,但是节点指令的工作原理很吸引人。
LukeP 2014年

3
为了响应LukeP的评论,在Python 2.7的命令会按照工作的指示$ python -m SimpleHTTPServer,其产生的消息:Serving HTTP on 0.0.0.0 port 8000 ...如果你拼模块名称错误,比如$ python -m SimpleHttpServer那么你会得到错误信息No module named SimpleHttpServer,如果您有python3你会得到一个类似的错误信息已安装(v。python 2.7)。您可以使用以下命令检查python版本:$ python --version。您还可以指定要监听的端口,如下所示:$ python -m SimpleHTTPServer 3333
2011年

1
python服务器从启动服务器的目录中提供文件。因此,如果您要提供的文件位于/ Users / 7stud / angular_projects / 1app中,请在该目录中启动服务器,例如$ cd ~/angular_projects/1app,然后$ python -m SimpleHTTPServer。在浏览器中输入url http://localhost:8000/index.html。您还可以在启动服务器的目录的子目录中请求文件,例如http://localhost:8000/subdir/hello.html
7stud 2014年

2
我听说Python很简单且功能强大,就像“ X”语言一样,但这太荒谬了!无需安装XAMPP,也无需设置带有节点的简单http服务器js来提供静态文件-一个命令就可以了!非常感谢您,节省了很多时间和麻烦。
RD

2
真棒!-对于Windows上的Python,请使用:python -m http.server 8080 ...或您想要的任何端口以及要退出它的端口,只需ctrl-c。
克里斯托弗

161

在Chrome中,您可以使用以下标志:

--allow-file-access-from-files

在这里阅读更多。


11
@ Blairg23,请记住,此解决方案需要重新启动所有Chrome.exe实例才能正常工作
Alex Klaus

3
请说明如何在chrome中使用它。
利沙伯·阿格拉哈里(Rishabh Agrahari),

@Priya不过不应该这样做
Suraj Jain

我建议仅在本地调试中使用Chromium(以flag开头--allow-file-access-from-files)。这意味着使用Chrome浏览器进行常见的Web浏览,并将Chromium用作HTML文件的默认应用程序。
冯志良

请注意,fetch()无论如何仍然否认这一点。您必须XMLHttpRequest以某种方式使用
Hashbrown

63

今天就参加这个。

我写了一些看起来像这样的代码:

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

...但是应该看起来像这样:

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

唯一的区别是http://第二段代码中缺少。

只是想把它放在那里,以防其他人遇到类似的问题。


40

只要将URL更改为http://localhost代替localhost。如果您从本地打开html文件,则应创建一个本地服务器来提供该html文件,最简单的方法是使用Web Server for Chrome。这样可以解决问题。


5
Web Server for Chrome应用程序链接+

它救了我。确切的解决方案
Surya

18

在一个Android应用程序-例如,允许JavaScript必须通过获得资产file:///android_asset/-使用setAllowFileAccessFromFileURLs(true)WebSettings,你从调用获得getSettings()WebView


辉煌!我们将要重写将JSON注入变量的方法..但是这可行!webView.getSettings()。setAllowFileAccessFromFileURLs(true);
WallyHale

15

使用http://https://创建网址

错误localhost:8080

解决方案http://localhost:8080


14

对我来说最快的方法是:对于Windows用户,在Firefox上运行文件已解决了问题,或者如果您要使用chrome,对我来说最简单的方法是安装Python 3,然后从命令提示符处运行命令,python -m http.server 然后转到http:// localhost:8000 / 然后导航到您的文件

python -m http.server

13

我将列出三种解决此问题的方法:

  1. 使用非常轻便npm:安装实时服务器使用npm install -g live-server。然后,转到该目录,打开终端并键入,live-server然后按Enter,将在处提供页面localhost:8080。奖励:默认情况下,它还支持热重装。
  2. 使用Google 开发的轻量级Google Chrome 应用:安装该应用,然后转到Chrome中的“应用”标签,然后打开该应用。在应用程序中,将其指向正确的文件夹。您的页面将被投放!
  3. 在Windows中修改Chrome快捷方式:创建Chrome浏览器的快捷方式。右键单击图标,然后打开属性。在性能,编辑target"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:/ChromeDevSession"和保存。然后使用Chrome使用打开页面ctrl+o。注意:请不要使用此快捷方式定期浏览。

12

对于Windows上没有Python或Node.js的用户,仍然有一个轻量级的解决方案:Mongoose

您要做的就是将可执行文件拖到服务器根目录下的任意位置,然后运行它。一个图标将出现在任务栏中,它将在默认浏览器中导航到服务器。

另外,Z-WAMP是100%便携式WAMP,可在单个文件夹中运行,真棒。如果您需要快速的PHP和MySQL服务器,这是一个选择。


如果您安装了php或已经安装了php,则可以在以下文件夹中启动服务器: php.net/manual/es/features.commandline.webserver.php
jechaviz

12

如果您使用Mozilla Firefox,它将按预期运行,没有任何问题。

PS令人惊讶的是,IntenetExplorer_Edge绝对可以正常工作!!!


1
不再。firefox和ie都阻止了cors对我的请求。
Baahubali

也多数民众赞成在访问不安全的页面不是一件好事:D
csomakk

6

使用VS Code的人的简单解决方案

我已经有一段时间了这个错误。大多数答案有效。但是我找到了另一种解决方案。如果您不想node.js在此处处理任何其他解决方案,并且正在使用HTML文件(从另一个js文件调用函数或获取json api的功能),请尝试使用Live Server扩展。

它使您可以轻松打开实时服务器。并且由于它创建了localhost服务器,因此问题得以解决。您只需localhost打开HTML文件并在编辑器上单击鼠标右键,然后单击即可开始Open with Live Server

它基本上使用http://localhost/index.html而不是使用加载文件file://...

编辑

不需要.html文件。您可以使用快捷方式启动Live Server。

点击(alt+L, alt+O)打开服务器,然后(alt+L, alt+C)停止服务器。[在MAC上,cmd+L, cmd+Ocmd+L, cmd+C]

希望它可以帮助某人:)


4

在使用本地目录中的json文件的浏览器中加载HTML文件时,出现了确切的错误。就我而言,我能够通过创建一个简单的节点服务器来解决此问题,该服务器可以处理静态内容。我在另一个答案中为此保留了代码。


4

我建议您使用小型服务器在本地主机上运行此类应用程序(如果您未使用某些内置服务器)。

这是一个非常简单的设置和运行方法:

https://www.npmjs.com/package/tiny-server

4

我怀疑在某些答案中已经提到了它,但是我将对其稍作修改以得到完整的工作答案(更易于查找和使用)。

  1. 转到:https : //nodejs.org/en/download/。安装nodejs。

  2. 通过从命令提示符运行命令来安装http-server npm install -g http-server

  3. 切换到index.html/ yoursome.html所在的工作目录。

  4. 通过运行命令启动您的http服务器 http-server -c-1

将Web浏览器打开到http://localhost:8080http://localhost:8080/yoursome.html -根据您的html文件名。


3

它只是说该应用程序应该在Web服务器上运行。我在chrome上遇到了同样的问题,我启动了tomcat并将我的应用程序移到那里,并且它可以正常工作。



1

它加载本地文件的一种方法是在项目文件夹中而不是在项目文件夹外部使用它们。在您的项目示例文件下创建一个文件夹,类似于我们为图像创建的方式,并替换其中使用项目路径以外的完整本地路径并在项目文件夹下使用文件的相对URL的部分。对我有用


1

所有人MacOS...设置一个简单的LaunchAgent以在您自己的Chrome副本中启用这些迷人的功能...

保存plist,命名什么launch.chrome.dev.mode.plist在,例如)~/Library/LaunchAgents具有相似的内容...

<?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>

应该在启动时启动..但是您可以随时使用terminal命令强制它启动。

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

TADA!😎💁🏻🙊🙏🏾


1
  • 为Java安装本地Web服务器,例如Tomcat,对于php,您可以使用lamp等
  • 将json文件拖放到公共可访问的应用服务器目录中
  • 项目清单

  • 启动应用服务器,您应该能够从本地主机访问文件


1

没有服务器就无法加载静态本地文件(例如:svg)。如果您的计算机中安装了NPM / YARN,则可以使用“ http-server ” 设置简单的http服务器

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

或在该项目文件夹中打开终端,然后键入“ hs”。它将自动启动HTTP活动服务器。


重复的答案
Scott Stensland


0

使用带有以下href的锚标记时,我也能够重新创建此错误消息:

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

在我的情况下,一个标签被用于获取“指针光标”,并且该事件实际上是由一些jQuery on click事件控制的。我删除了href并添加了一个适用的类:

cursor:pointer;


0

对于Linux Python用户:

import webbrowser
browser = webbrowser.get('google-chrome --allow-file-access-from-files %s')
browser.open(url)

没有理由为什么google-chrome --allow-file-access-from-files <url>不起作用并且更加简洁?
agupta231

@ agupta231 webbrowser模块具有可让您进行各种“打开”的参数,例如。在当前标签,新标签,新窗口等方式公开
丹尼尔·布劳恩

0

如果您坚持要在.html本地运行该文件而不是通过Web服务器提供该文件,则可以通过使有问题的资源内联使用来首先防止那些跨源请求发生。

尝试.js通过提供文件时遇到了这个问题file://。我的解决方案是更新构建脚本,以将<script src="...">标签替换为<script>...</script>。这是一种gulp这样做的方法:

1.运行npm install --save-dev到程序包gulpgulp-inline然后del

2.在gulpfile.js根目录中创建一个之后,添加以下代码(只需更改文件路径即可):

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. 运行gulp bundle-for-local或更新您的构建脚本以自动运行它。

您可以在此处查看针对我的案例的详细问题和解决方案。


-1

科尔多瓦实现了这一目标。我仍然不知道科尔多瓦的表现。它甚至不通过shouldInterceptRequest。

后来我发现从本地加载任何文件的关键是:myWebView.getSettings()。setAllowUniversalAccessFromFileURLs(true);

而且,当您要访问任何http资源时,Web视图将使用OPTIONS方法进行检查,您可以通过返回响应通过WebViewClient.shouldInterceptRequest授予访问权限,对于以下GET / POST方法,您可以仅返回null。



-1

当我下载页面以供离线查看时遇到了这种情况。

我只需要从所有和标签中删除integrity="*****"crossorigin="anonymous"属性<link><script>

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.