2014-01-11 512 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]