跨源请求仅支持HTTP,但不是跨域的

我正在使用此代码发出一个AJAX请求:

$("#userBarSignup").click(function(){ $.get("C:/xampp/htdocs/webname/resources/templates/signup.php", {/*params*/}, function(response){ $("#signup").html("TEST"); $("#signup").html(response); }, "html"); 

但是从Google Chrome JavaScript控制台,我不断收到这个错误:

XMLHttpRequest无法加载file:/// C:/xampp/htdocs/webname/resources/templates/signup.php。 跨源请求仅支持HTTP。

问题是signup.php文件托管在我的本地Web服务器上,这是所有网站运行的地方,所以它不是跨域的。

我该如何解决这个问题?

你需要真正的运行一个web服务器,并且向服务器上的URI发出get请求,而不是向文件发出get请求。 比如改行:

  $.get("C:/xampp/htdocs/webname/resources/templates/signup.php", 

阅读如下内容:

  $.get("http://localhost/resources/templates/signup.php", 

并且最初的请求页面也需要通过http进行。

我有幸运用下面的开关启动Chrome:

 --allow-file-access-from-files 

在os x上尝试(如果复制粘贴,请重新输入破折号):

 open -a 'Google Chrome' --args -allow-file-access-from-files 

在其他* nix运行(未测试)

  google-chrome --allow-file-access-from-files 

或者在windows上编辑chrome快捷方式的属性并添加开关,例如

  C:\ ... \Application\chrome.exe --allow-file-access-from-files 

到“目标”路径的末尾

如果您正在开发一个小型的前端项目,并且希望在本地进行测试,那么您通常会通过将本地目录指向Web浏览器来打开它,例如输入file:/// home / erick / mysuperproject / index .html在您的URL栏中。 但是,如果您的网站正在尝试加载资源,即使它们已放置在本地目录中,也可能会看到如下警告:

XMLHttpRequest无法加载file:///home/erick/mysuperproject/mylibrary.js。 跨源请求仅支持HTTP。

Chrome浏览器和其他现代浏览器对跨源请求实施了安全性限制,这意味着您无法通过file:///加载任何内容,您需要始终使用http://协议,甚至在本地使用相同的来源策略。 就这么简单,你需要挂载一个web服务器来运行你的项目。

这不是世界末日,有很多解决方案,包括好的Apache(如果你正在运行其他几个项目,使用VirtualHosts),使用express的node.js,Ruby服务器等,或者简单地修改浏览器设置。

但是,对于懒惰的解决方案有一个更简单和轻量级的解决方案。 你可以使用Python的SimpleHTTPServer。 它已经捆绑了python,所以你不需要安装或配置任何东西!

所以,cd到你的项目目录,例如

1 cd / home / erick / mysuperproject然后简单地使用

1 python -m SimpleHTTPServer就是这样,你会在终端看到这个消息

1在0.0.0.0端口8000上服务HTTP …所以现在你可以回到你的浏览器并访问http://0.0.0.0:8000 ,所有的目录文件都在这里。 你可以配置端口和其他的东西,只要看文档。 但是当我急于测试一个新的图书馆或者制定一个新的想法时,这个简单的技巧对我来说很有用。

你去,快乐的编码!

编辑:在Python 3 +中,SimpleHTTPServer已被替换为http.server。 所以在Python 3.3中,下面的命令是等价的:

 python -m http.server 8000 

我在尝试加载使用JSON数据填充页面的简单HTML文件时遇到了同样的错误,所以我使用了使用的node.js和express来解决问题。 如果您没有安装节点,则需要先安装节点 。

  1. 安装express npm install express

  2. 在你的项目的根文件夹中创建一个server.js文件,在我的例子中,我想要服务的文件上面有一个文件夹

  3. 在server.js文件中加入如下内容,并在express gihub站点上阅读:

     var express = require('express'); var app = express(); var path = require('path'); // __dirname will use the current path from where you run this file app.use(express.static(__dirname)); app.use(express.static(path.join(__dirname, '/FOLDERTOHTMLFILESTOSERVER'))); app.listen(8000); console.log('Listening on port 8000'); 
  4. 在保存server.js之后,可以使用以下命令运行服务器:

node server.js

  1. 转到http://localhost:8000/FILENAME ,你应该看到你正在加载的HTML文件

它最适合这种方式。 确保这两个文件都在服务器上。 在调用html页面时,请使用以下网址: http:://localhost/myhtmlfile.html ,而不是C::///users/myhtmlfile.html 。 让我们知道传递给JSON的URL是一个网址,如下所示:

 $(function(){ $('#typeahead').typeahead({ source: function(query, process){ $.ajax({ url: 'http://localhost:2222/bootstrap/source.php', type: 'POST', data: 'query=' +query, dataType: 'JSON', async: true, success: function(data){ process(data); } }); } }); }); 

如果安装了nodejs,则可以使用命令行下载和安装服务器:

 npm install -g http-server 

将目录更改为您要从中提供文件的目录:

 $ cd ~/projects/angular/current_project 

运行服务器:

 $ http-server 

这将产生消息启动http服务器,服务于:

可用于: http:// your_ip:8080和http://127.0.0.1:8080

这可以让你在你的浏览器中使用urls

HTTP:// your_ip:8080 / index.html的