【问题标题】:My AJAX request object doesn't properly resolve the protocol portion of the URL我的 AJAX 请求对象没有正确解析 URL 的协议部分
【发布时间】:2012-08-14 18:57:58
【问题描述】:

我正在尝试从安全页面发送 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 请求从安全页面发送到具有相同(安全)来源的资源。我怎样才能完成这个简单的任务?

【问题讨论】:

  • 服务器端发生了什么?你在使用带有 .htaccess 重写规则的 apache 吗?我有一种预感,问题不在于 ajax,而在于服务器。当然,除非您可以证明实际连接没有通过端口 443,或者您的服务器日志显示请求了 http。
  • 在上面的第二个和第三个例子中,浏览器从不发送请求,因为该请求违反了同源策略。这个问题根本不涉及服务器。

标签: javascript ajax https


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    要么将您的索引页面移至域的根目录,要么更改在文件上发送的同源策略标头,或者在服务器上创建一个子目录来处理请求(您可以使用类似 PHP 的 @987654322 @ 只包含父文件)。

    【讨论】:

    • 这是一个有趣的理论。但是,Mozilla 链接清楚地讨论了文件 URI。我正在处理具有不同发送考虑的 HTTP URI,因此可能会有所不同。参见例如MDN JavaScript same origin policy,基于域名、协议、端口号实现了更常规的来源。
    • 即使在您自己的链接中:Mozilla considers two pages to have the same origin if the protocol, port (if one is specified), and host are the same for both pages. 页面是否在 SSL 连接上加载?如果不是,那么这是你的问题
    【解决方案3】:

    这是 WebKit 中的一个错误。它已在 Safari 5 中为 Lion 修复,但没有 Snow Leopard,它已在 Chrome 中修复,但没有 Canary,......真是个错误。

    【讨论】:

    • 你有可以参考这个的链接吗?
    猜你喜欢
    • 2011-11-25
    • 1970-01-01
    • 2016-03-19
    • 2023-03-19
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多