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


88

我正在使用以下代码发出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无法加载文件:/// C:/xampp/htdocs/webname/resources/templates/signup.php。跨源请求仅支持HTTP。

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

我怎么解决这个问题?


5
您是否尝试过使用HTTP URL代替本地路径?
Edward Thomson

1
我建议使用完整的网址
Dominic Green

2
@EdwardThomson奏效了!但是现在我必须allow_url_include = On在服务器配置中进行设置。
siannone 2011年

Answers:


76

您实际上需要运行一个Web服务器,并对该服务器上的URI进行get请求,而不是对文件进行get请求。例如,更改行:

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

阅读类似:

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

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


这就像一个魅力。现在,我必须allow_url_include = On在服务器配置中进行设置。我可以安全地启用它吗,否则会引起一些安全问题?
siannone 2011年

$ .get实际上是在Web浏览器的javascript上下文中发出的,因此该文件需要具有URL引用-用php编写的代码仍可以引用本地文件而不会出现问题
Petesh 2011年

44
或者,也可以使用Python解决方案:(1)将控制台导航到该文件夹​​,(2)输入python -m SimpleHTTPServer 8888,然后(3)将浏览器导航到http://localhost:8888/
geotheory 2013年

+1这对解决我的问题很有帮助。非常感谢:)
Praveen

5
Python 3用户注意事项:使用python -m http.server 8888
Jelle Fresen

113

我很幸运通过以下开关启动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

到“目标”路径的末尾


7
原则上可以在Google Chrome(至少从v24开始)中运行,但是请注意,在OS X上,您必须按以下方式调用它:open -a 'Google Chrome' --args —allow-file-access-from-files。另请注意:如果指定基于file://的URL(而不是文件系统路径),请确保使用file://localhost/...而不是file:///...
mklement0 2013年

6
上次我尝试在Windows中执行此操作时,以上方法无效。我最终不得不从DOS提示符下启动chrome,并进行以下切换...不完美但可行。
prauchfuss 2013年

在Linux上运行良好。
user1205577 2014年

在OS X Yosemite 10.10.2和Chrome版本41.0.2272.89(64位)上正常运行。
花花公子2015年

86

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

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

Chrome和其他现代浏览器已对跨源请求实施了安全限制,这意味着您无法通过file:///加载任何内容,您需要始终使用http://协议,即使是本地本地-由于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服务...现在,您可以返回浏览器,并访问http://0.0.0.0:8000其中提供的所有目录文件。您可以配置端口和其他内容,只需参阅文档即可。但是,当我急于测试新库或提出新想法时,这种简单的技巧对我有用。

祝您编程愉快!

编辑: 在Python 3+中,SimpleHTTPServer已替换为http.server。因此,例如在Python 3.3中,以下命令是等效的:

python -m http.server 8000

5
懒惰的解决方案很棒。非常简单,您无需执行其他任何操作。
Nico 2014年

等效文件也存在于node.js中:simple-http-server
StackHola 2014年

在Windows 8.1上,您仍然需要安装Python吗?
J86

我在Windows上使用Xampp,这很简单,我建议使用node,也不要忘记在skype上解锁80端口以允许服务器运行
Timo Huovinen 17/02/22

10

尝试仅加载使用JSON数据填充页面的HTML文件时遇到了相同的错误,因此我使用了node.js并进行了表述以解决该问题。如果未安装节点,则需要先安装节点

  1. 安装快递 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文件

4

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

npm install -g http-server

将目录从以下位置更改为要提供文件的目录:

$ cd ~/projects/angular/current_project 

运行服务器:

$ http-server 

这将产生消息“正在启动http服务器”,该消息可在以下位置使用:

可用于: http://您的IP:8080http://127.0.0.1:8080

这样您就可以在浏览器中使用网址,例如

http:// your_ip:8080 / index.html


1

这样最好。确保两个文件都在服务器上。调用html页面时,请使用网址,例如:http:://localhost/myhtmlfile.html,而不要使用C::///users/myhtmlfile.html。还请确保传递给json的网址是一个网址,如下所示:

$(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);
                            }
                        });
                    }
                });
            });

0
REM kill all existing instance of chrome 
taskkill /F /IM chrome.exe /T
REM directory path where chrome.exe is located
set chromeLocation="C:\Program Files (x86)\Google\Chrome\Application"
cd %chromeLocation%
cd c:
start chrome.exe --allow-file-access-from-files
  1. 更改chromeLocation路径。

  2. 将上面另存为.bat文件。

  3. 将文件拖放到创建的批处理文件上。(chrome确实提供了“还原页面”选项,因此,如果您打开了页面,只需单击“还原”,它将起作用)。


0

您也可以使用php解释器启动没有python的服务器。

例如:

cd /your/path/to/website/root
php -S localhost:8000

如果您想要npm的替代品,这会很有用,因为php实用程序已预先安装在某些OS(包括Mac)上。


0

对于所有python用户:

只需转到终端中的目标文件夹。

cd projectFoder

然后为Python3 +启动HTTP服务器:

python -m http.server 8000

在::端口8000(http:// [::]:8000 /)上提供HTTP服务...

转到您的链接:http: //0.0.0.0 : 8000/

请享用 :)

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.