Cross origin requests are only supported for HTTP but it's not cross-domain
我正在使用此代码发出AJAX请求:
1 2 3 4 5 6 7 8 | $("#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 cannot load
file:///C:/xampp/htdocs/webname/resources/templates/signup.php. Cross
origin requests are only supported for HTTP.
问题是signup.php文件托管在我的本地Web服务器上,这是所有网站运行的地方,因此它不是跨域的。
我怎么解决这个问题?
我有幸用以下开关启动chrome:
1 | --allow-file-access-from-files |
在os x上尝试(如果复制粘贴,则重新键入破折号):
1 | open -a 'Google Chrome' --args -allow-file-access-from-files |
在其他* nix运行(未测试)
1 | google-chrome --allow-file-access-from-files |
或者在Windows上编辑Chrome快捷方式的属性并添加开关,例如
1 | C:\ ... \Application\chrome.exe --allow-file-access-from-files |
到"目标"路径的末尾
如果您正在处理一个小型前端项目并想在本地测试它,您通常会通过将本地目录指向Web浏览器来打开它,例如输入file:/// home / erick / mysuperproject / index您的网址栏中的.html。但是,如果您的站点正在尝试加载资源,即使它们已放置在您的本地目录中,您可能会看到如下警告:
XMLHttpRequest无法加载file:///home/erick/mysuperproject/mylibrary.js。仅支持HTTP的跨源请求。
Chrome和其他现代浏览器已经对Cross Origin Requests实施了安全限制,这意味着您无法通过file:///加载任何内容,您需要始终使用http://协议,甚至是本地-due Same Origin策略。就这么简单,您需要安装一个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服务...
现在,您可以返回浏览器并访问
你去,快乐编码!
编辑:
在Python 3+中,SimpleHTTPServer已被http.server取代。因此,在Python 3.3中,以下命令是等效的:
1 | python -m http.server 8000 |
您需要实际运行Web服务器,并对该服务器上的URI发出get请求,而不是向文件发出get请求;例如换行:
1 | $.get("C:/xampp/htdocs/webname/resources/templates/signup.php", |
阅读类似的东西:
1 | $.get("http://localhost/resources/templates/signup.php", |
并且初始请求页面也需要通过http进行。
我在尝试加载使用JSON数据填充页面的HTML文件时遇到了同样的错误,因此我使用了node.js和express来解决问题。如果未安装节点,则需要先安装节点。
安装快递
在项目的根文件夹中创建一个server.js文件,在我的情况下,在我想要服务的文件上面的一个文件夹中
在server.js文件中添加如下内容,并在express gihub网站上阅读:
1 2 3 4 5 6 7 8 9 10 | 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'); |
保存server.js后,可以使用以下命令运行服务器:
如果安装了nodejs,则可以使用命令行下载并安装服务器:
1 | npm install -g http-server |
将目录更改为要从中提供文件的目录:
1 | $ cd ~/projects/angular/current_project |
运行服务器:
1 | $ http-server |
这将产生消息启动http-server,服务于:
适用于:
http:// your_ip:8080和
http://127.0.0.1:8080
这允许您在浏览器中使用网址
http://your_ip:8080/index.html
它以这种方式效果最好。确保两个文件都在服务器上。在调用html页面时,请使用以下网址:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $(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); } }); } }); }); |