2012-08-14 56 views
2

我试图从安全页面发送AJAX请求,但XMLHttpRequest对象没有正确解析URL的协议部分。这种行为在Safari,Chrome和Canary中是相同的。我的AJAX请求对象没有正确解析URL的协议部分

这里是我的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请求。我怎样才能完成这个简单的任务?

+1

服务器端发生了什么?你使用Apache与.htaccess重写规则?我有一个预感,问题不是ajax,而是服务器。当然,除非你能证明实际的连接是*不是通过端口443,或者你的服务器日志显示请求了http。 – cegfault 2012-08-14 19:14:53

+0

在上面的第二个和第三个示例中,浏览器从不发送请求,因为请求违反了同一个源策略。这个问题根本不涉及服务器。 – Slothrop 2012-08-14 19:29:41

回答

0

这是WebKit中的一个bug,已在Safari 5中为Lion修复,但不是 Snow Leopard,它已在Chrome中修复,但不是金丝雀,... helluva一个错误。

+0

你有任何可以引用此链接的链接? – Spudley 2012-08-15 17:52:06

0

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

一个最后的帖子指出,“只要是绝对不含糊; XML HTTP请求工作在HTTPS 正是因为他们做了HTTP如果他们没有我们的。质量保证部门 已经说了些什么,因为他们几乎完全通过https进行测试“

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

0

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

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

你不能去目录树,只能下来。在第一个示例中,您正在请求子文件夹。没关系。在第二个和第三个示例中,您正在从父目录请求一个页面(即,而不是https://mydomain/mypage/ajax/,您要求的是https://mydomain/ajax/。您无法向此目录树发出请求

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

+0

这是一个有趣的理论。但是,Mozilla链接明确讨论了文件URI。我正在处理HTTP URI,这些HTTP URI有不同的注意事项,因此可能会有所不同。见例如[MDN JavaScript同源策略](https://developer.mozilla.org/en-US/docs/Same_origin_policy_for_JavaScript),它基于域名,协议和端口号实现更传统的源。 – Slothrop 2012-08-14 20:22:30

+0

即使在您自己的链接中:如果协议,端口(如果指定了某个端口)和主机在两个页面上都相同,则Mozilla会认为两个页面具有相同的来源。“该页面是否在SSL连接上加载?如果没有,那么这是你的问题 – cegfault 2012-08-14 23:14:40

相关问题