2014-01-11 541 views
15

如何使用jQuery明確製作AJAX HTTPS GET請求?我正在嘗試做以下事情。 在HTTPS頁面中,我與代碼$.get("/resource")一條線,但我得到以下錯誤如何使用jQuery製作AJAX HTTPS GET請求

XMLHttpRequest cannot load http://www.site.com/resource. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://www.site.com' is therefore not allowed access. 

爲什麼AJAX調用試圖通過HTTP協議訪問的網頁,如果相對資源是從HTTPS頁?如果$ .get(url)方法默認執行此操作,那麼如何使用jQuery執行明確的HTTPS GET請求?另一位遇到類似問題的人在http://forum.jquery.com/topic/jquery-get-ajax-call-on-http-page-to-https-on-same-domain無法解決問題。

jQuery的版本是1.7.2

+0

參見:http://stackoverflow.com/questions/15375908/ajax-get-request-over -https – klugerama

+0

@FearlessFuture - 你是否從同一個域獲取GET? – avijendr

+0

另外:http://stackoverflow.com/questions/7311702/will-jquery-ajax-without-full-url-remain-https-if-original-page-load-was-https – klugerama

回答

35

的我固定的問題。事實證明,由於我們的Django站點配置的方式,我需要在AJAX請求中爲資源添加一個尾部斜線。如果沒有跟蹤斜線,Django會使用HTTP請求而不是HTTPS請求,然後重定向到帶有尾部斜槓的URL。

總之,我用$.get("/resource/")替換了$.get("/resource")

謝謝。我非常感謝你的幫助。

+1

這非常有幫助!對於其他人想知道我做過的同樣的事情 - 是的,最後的斜線不會影響任何參數,即。 '/ resource /?param = 1'可以很好地工作。還有一點需要注意:在Chromium上診斷更容易,因爲Chromium會顯示兩個請求(一個https,第二個https),而FireBug只會顯示一個'GET https:// ...'以及一個位置:http://...'標題,這可能會讓人困惑。 – Protagonist

+1

這似乎不是這個問題的通用答案,但只適用於您的祕密配置的django環境?或者是以某種方式爲https添加一個臨時的斜槓。 – Andrew

+0

這個答案的要點是,如果你的網址稍微有點不正確,你的服務器可能會自動重定向......所以仔細檢查你實際請求的網址以及你最終的位置。 – Andrew

8

如果您所在的頁面是HTTPS頁面,頁面不用彷徨試圖訪問是http,則不會因同根同源工作。但是,你可以只寫出來的,而不是AJAX的短移交它不用彷徨:)

$.ajax({ 
    type: "GET", 
    url: "https://someurl" 
}); 

雖然我想說句公道話,這仍然是一個短真實的JavaScript

+0

如果您的域名不同,您的答案無效!見 - http://stackoverflow.com/questions/15375908/ajax-get-request-over-https – avijendr

+0

@avvijender,以及這是一個給定的。 OP沒有說他們正在嘗試提出跨域請求。 – mituw16

+0

如果它不是一個跨域請求它的作品,這個問題不會在這裏我猜。我使用了100個https的ajax get/post,但是來自同一個域! – avijendr

2

嘗試將數據類型設置爲「jsonp」,這對我來說在跨源請求中幫助了我。

$.ajax({ 
      url: "//www.site.com/resource" 
      dataType: "jsonp", 
      success: function(data) { 
       $(".demo-card").html(data); 
      } 
    }); 
+1

'dataType'用於計算響應數據格式,它與請求無關。你正在尋找'crossDomain'。 – jurchiks

0

在.htaccess文件只需使用重寫規則與指定的協議,例如:

RewriteCond %{REQUEST_URI} .+[^/]$ 
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L,QSA]