2

我正在尝试从安全页面发送 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 正确地附加到域根目录,但使用了错误的协议。

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

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

需要明确的是,我并不是在尝试解决相同的原产地政策。我想将 AJAX 请求从安全页面发送到具有相同(安全)来源的资源。我怎样才能完成这个简单的任务?

4

3 回答 3

0

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

最后一篇文章指出“绝对明确;XML HTTP 请求在 https 上的工作与在 http 上的工作完全一样。如果他们不这样做,我们的 QA 部门现在会说些什么,因为他们几乎完全通过 https 进行测试”

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

于 2012-08-14T19:08:43.467 回答
0

这与 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之类的东西来仅包含父文件)。

于 2012-08-14T19:41:12.420 回答
0

这是 WebKit 中的一个错误。它已在 Safari 5 中针对 Lion而非Snow Leopard 进行了修复,并且已在 Chrome 中修复但未在Canary中修复,......真是个错误。

于 2012-08-15T03:17:49.863 回答