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

Posted

技术标签:

【中文标题】跨域请求仅支持 HTTP,但不支持跨域【英文标题】:Cross origin requests are only supported for HTTP but it's not cross-domain 【发布时间】:2012-01-16 23:52:39 【问题描述】:

我正在使用此代码发出 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 服务器上,所有网站都在该服务器上运行,因此它不是跨域的。

我该如何解决这个问题?

【问题讨论】:

您是否尝试过使用 HTTP URL 而不是本地路径? 我建议使用完整的网址 @EdwardThomson 成功了!但是现在我必须在我的服务器配置中设置allow_url_include = On "Cross origin requests are only supported for HTTP." error when loading a local file的可能重复 【参考方案1】:

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

到“目标”路径的末尾

【讨论】:

原则上适用于 Google Chrome(至少从 v24 开始),但请注意,在 OS X 上,您必须按如下方式调用它:open -a 'Google Chrome' --args —allow-file-access-from-files。另请注意:如果您指定基于 file:// 的 URL(而不是文件系统路径),请务必使用 file://localhost/... 而不是 file:///... 上次我尝试在 Windows 中执行此操作时,上述方法不起作用。我最终不得不从 DOS 提示符下启动 chrome,开关如下...不完美但可行。 在 Linux 上运行良好。 在 OS X Yosemite 10.10.2 和 Chrome 版本 41.0.2272.89(64 位)上运行良好。【参考方案2】:

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

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

Chrome 和其他现代浏览器已经对跨域请求实施了安全限制,这意味着你不能通过 file:/// 加载任何东西,你需要始终使用 http:// 协议,即使是在本地 -due 同源政策。就这么简单,您需要安装一个网络服务器来在那里运行您的项目。

这不是世界末日,有很多解决方案,包括老式的 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

【讨论】:

惰性解决方案很棒。非常简单,您无需执行任何其他操作。 等价物也存在于 node.js 中:simple-http-server 在 Windows 8.1 上,你还需要安装 Python 吗? 我在windows上使用Xampp,很简单,虽然我推荐使用node,也不要忘记在skype上解锁端口80以允许服务器运行【参考方案3】:

您需要实际运行一个网络服务器,然后向该服务器上的 URI 发出 get 请求,而不是向文件发出 get 请求;例如换行:

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

阅读类似:

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

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

【讨论】:

这就像一个魅力。现在我必须在我的服务器配置中设置allow_url_include = On。我可以安全地启用它,否则会导致一些安全问题? $.get实际上是在web浏览器的javascript上下文中发出的,所以该文件需要有URL引用——用php编写的代码仍然可以毫无问题地引用本地文件 另外还有 Python 解决方案:(1) 将控制台导航到文件夹,(2) 输入 python -m SimpleHTTPServer 8888,然后 (3) 将浏览器导航到 http://localhost:8888/ +1 这对resolve 我的问题有很大帮助。非常感谢:) Python 3 用户注意事项:使用python -m http.server 8888【参考方案4】:

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

    安装 express npm install express

    在项目的根文件夹中创建一个 server.js 文件,在我的例子中是我想要服务器的文件上方的一个文件夹

    在 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');
    

    保存 server.js 后,您可以使用以下命令运行服务器:

node server.js

    转到http://localhost:8000/FILENAME,您应该会看到您尝试加载的 HTML 文件

【讨论】:

【参考方案5】:

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

npm install -g http-server

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

$ cd ~/projects/angular/current_project 

运行服务器:

$ http-server 

这将产生消息正在启动 http-server, serving on:

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

这允许您在浏览器中使用 url,例如

http://your_ip:8080/index.html

【讨论】:

【参考方案6】:

这种方式效果最好。确保这两个文件都在服务器上。调用 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);
                            
                        );
                    
                );
            );

【讨论】:

【参考方案7】:
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

    用你的更改 chromeLocation 路径。

    将以上内容另存为 .bat 文件。

    将文件拖放到您创建的批处理文件上。 (chrome确实提供了恢复页面 选项虽然如此,如果您打开页面,只需点击恢复即可)。

【讨论】:

【参考方案8】:

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

例如:

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

如果您想要 npm 的替代品,这可能很有用,因为 php 实用程序预装在某些操作系统(包括 Mac)上。

【讨论】:

【参考方案9】:

对于所有 python 用户:

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

cd projectFoder

然后启动 HTTP 服务器 对于 Python3+:

python -m http.server 8000

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

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

享受:)

【讨论】:

以上是关于跨域请求仅支持 HTTP,但不支持跨域的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Cordova 抛出异常 跨域请求仅支持协议方案

跨域问题 跨域请求问题

跨域问题 跨域请求问题

跨域问题 跨域请求问题