【发布时间】: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