"只有HTTP支持跨源请求." 加载本地文件时出错

cor*_*zza 758 javascript 3d http file three.js

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

我收到了"Cross origin requests are only supported for HTTP."错误,但我不知道是什么导致它,也不知道如何解决它.

And*_*ong 766

我的水晶球说,你使用的是加载模型file://或者C:/,这秉承了该错误消息,因为它们不http://

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

  • 想象一下,如果这是允许的,并且一个webapp,页面的作者使用类似`load('file:// C:/users/user/supersecret.doc')的东西,然后使用ajax等将内容上传到他们的服务器. (142认同)
  • 在GitHub wiki中有一个关于此主题的页面:https://github.com/mrdoob/three.js/wiki/How-to-run-things-locally (28认同)
  • 您还可以在chrome中使用--allow-file-access-from-files开关.根据我的回答:http://stackoverflow.com/questions/8449716/cross-origin-requests-are-only-supported-for-http-but-its-not-cross-domain/14490982#14490982 (26认同)
  • 不幸的是,政策适用于所有情况,不仅适用于你的:(,所以你必须忍受它 (10认同)
  • 是的,我正在尝试使用`file://`这样做,但我不明白为什么允许这样做.好吧,我正在安装Lampp我猜... (7认同)
  • 但我正在尝试从我自己的目录中加载一些东西,甚至index.html就在那里! (6认同)
  • 在哪里可以找到像您这样的水晶球?这将对我的日常编程工作大有帮助。 (3认同)
  • @AndreasWong想象一下,如果从file://加载了相关页面,那么您的示例是无关紧要的(就像OP和我自己说的那样),这不是一个跨域问题,因为该域实际上是由于文件而隐含了localhost :// (2认同)

Sco*_*and 584

只是为了明确 - 是的,错误是说你不能直接指向你的浏览器 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
Run Code Online (Sandbox Code Playgroud)

PHP

当然PHP也有它的解决方案.

php -S localhost:8000
Run Code Online (Sandbox Code Playgroud)

  • 这为我节省了大量时间,谢谢.我的Python安装没有SimpleHTTPServer模块,但节点指令就像魅力一样. (3认同)
  • 为了回应LukeP的评论,在python 2.7中,该命令按照`$ python -m SimpleHTTPServer`的指令工作,它产生消息:`在0.0.0.0端口8000上提供HTTP服务......`如果拼写模块名称错误,例如`$ python -m SimpleHttpServer`然后你会得到错误消息`没有名为SimpleHttpServer的模块.如果安装了python3(v.python 2.7),你会收到类似的错误信息.您可以使用以下命令检查您的python版本:`$ python --version`.你也可以像这样指定要监听的端口:`$ python -m SimpleHTTPServer 3333` (3认同)
  • 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` (2认同)
  • 我听说Python简单而强大,就像"X"语言一样,但这太荒谬了!无需安装XAMPP,或设置一个简单的http服务器js与节点来提供静态文件 - 一个命令和繁荣!非常感谢,节省了大量的时间和麻烦. (2认同)
  • 惊人的!- 对于 Windows 上的 Python 使用:python -m http.server 8080 ...或任何你想要的端口,当你想退出它时只需 ctrl-c。 (2认同)
  • 这真的太棒了,我欠你一个! (2认同)

小智 156

在Chrome中,您可以使用此标记:

--allow-file-access-from-files
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多.

  • @ Blairg23,请记住,此解决方案需要重新启动Chrome.exe的所有实例才能使其正常工作 (11认同)
  • 请解释如何在chrome中使用它. (3认同)

Jam*_*ton 61

今天来到这里.

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

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

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

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

唯一的区别是http://第二段代码缺乏.

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


Fin*_*inn 37

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

  • "适用于Chrome的Web服务器"应用链接的+1 - 这是迄今为止最简单,最干净的Chrome IMO临时httpd设置解决方案 (4认同)

Com*_*are 17

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


KAR*_*N.A 13

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

错误localhost:8080

解决方案http://localhost:8080

  • 完全相同的问题。我不知道我在没有http的情况下使用: (3认同)

bry*_*ryc 11

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

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

此外,Z-WAMP是100%便携式WAMP,可在一个文件夹中运行,非常棒.如果你需要一个快速的PHP和MySQL服务器,这是一个选项.


Bla*_*ard 11

我将列出3种不同的方法来解决这个问题:

  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.注意:请不要使用此快捷键来浏览定期.


Yas*_*hah 11

如果您使用Mozilla Firefox,它将按预期工作,没有任何问题;

PS甚至IE_Edge工作正常,令人惊讶!!

  • 不再。firefox 和 ie 都在阻止 cors 对我的请求。 (4认同)

Rid*_*zag 10

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

python -m http.server
Run Code Online (Sandbox Code Playgroud)


Ömü*_*giz 10

使用 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]

希望它会帮助某人:)


Tar*_*aro 7

我怀疑它已经在一些答案中提到了,但我会稍微修改一下以获得完整的工作答案(更容易找到和使用)。

  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

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


the*_*hme 5

当我在使用本地目录中的 json 文件的浏览器上加载 HTML 文件时,我收到了这个确切的错误。就我而言,我能够通过创建一个允许服务器静态内容的简单节点服务器来解决这个问题。我在另一个答案中留下了此代码。