我的 AJAX 请求对象无法正确解析 URL 的协议部分

My AJAX request object doesn't properly resolve the protocol portion of the URL

本文关键字:URL 协议部 请求 AJAX 对象 我的      更新时间:2023-09-26

>我正在尝试从安全页面发送 AJAX 请求,但 XMLHttpRequest 对象无法正确解析 URL 的协议部分。此行为在 Safari、Chrome 和 Canary 中是相同的。

这是我的JavaScript:

function sendGETRequest(url, params, callback) {
    "use strict";
    var req = new XMLHttpRequest();
    req.onreadystatechange = function () {
        if (req.readyState === 4) {
            if (req.status !== 200) {
                callback({ajaxError: true, status: req.status});
            } else {
                callback(req);
            }
        }
    };
    req.open("GET", url + "?" + params, true);
    req.setRequestHeader("X-Requested-With", "XMLHttpRequest");
    req.send();
}

以下是传递给sendGETRequest()的一些不同URL,以及它们的结果:

url = "ajax/";
GET https://mydomain/mypage/ajax/?params 404 (NOT FOUND)

以上是预期的行为:在协议完好无损的情况下正确解析相对 url。

url = "/ajax/";
The page at https://mydomain/mypage/ displayed insecure content from http://mydomain/ajax/?params.

在这里,真实网址被正确地附加到域根,但协议错误。

url = "https://mydomain/ajax/";
The page at https://mydomain/mypage/ displayed insecure content from http://mydomain/ajax/?params.

在这里,协议只是被忽略。

需要明确的是,我并不是要围绕同源政策工作;我想将 AJAX 请求从安全页面发送到具有相同(安全)源的资源。我怎样才能完成这个简单的任务?

这里有

一个关于这个话题的对话:http://bytes.com/topic/javascript/answers/459071-ajax-https

最后一篇文章说:"只是为了绝对明确;XML HTTP 请求通过 https 工作就像他们通过HTTP所做的那样。如果他们不这样做,我们的质量保证部门会现在已经说了一些话,因为他们几乎完全通过HTTPS进行测试"

也许服务器在发出请求时未使用 Https (ssl):mydomain/ajax/ .

这与HTTP和HTTPS无关。 正如您在评论中提到的,由于同源策略,该请求永远不会发送。 如果请求从未发送,请求怎么会使用错误的策略? 让您感到困惑的是,生成错误消息的任何程序/附加组件/工具/等都显示"HTTP"而不是"HTTPS"。 设置 HTTPS 时,请求是并且始终遵循 HTTPS。

您的真正问题很简单,您违反了跨源策略。看到这个:https://developer.mozilla.org/en-US/docs/Same-origin_policy_for_file:_URIs

您不能向上进入目录树,只能向下。 在第一个示例中,您正在请求子文件夹。没关系。 在第二个和第三个示例中,您正在从父目录请求页面(即,而不是https://mydomain/mypage/ajax/您请求https://mydomain/ajax/。 您不能像这样向目录树发出请求。

要么将索引页向上移动到域的根目录,要么更改在文件上发送的同源策略标头,或者使服务器上的子目录处理请求(您可以使用类似 PHP 的 include 来仅包含父文件)。

这是 WebKit 中的一个错误。它已在Safari 5中修复了Lion而不是Snow Leopard,并且在Chrome中修复了它,但不是Canary,...嘎��