2012-08-14 57 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