AJAX调用失败,混合内容HTTP / HTTPS错误,无法强制HTTPS

时间:2016-05-19 05:35:44

标签: ajax amazon-web-services ssl amazon-ec2 amazon-elb

我在ELB后面运行了一个EC2实例,为此我使用了AWS Certificate Manager(ACM)来启用HTTPS。

正如在一些地方所建议的那样,我将HTTP(端口80)和HTTPS(443)映射到我的实例的HTTP(端口80)。

我还通过将这些行添加到.htaccess文件来强制安全连接:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

所有这一切都很美妙。所有页面都按预期显示安全内容,控制台中没有关于混合内容的警告。

仅在我进行AJAX调用的网页上,我收到有关混合内容的错误,仅在Chrome中显示。 FireFox按预期工作,但控制台仍显示错误。

错误(FireFox):

  

内容安全政策:升级不安全的请求“http://example.com/myapi/get_company/?code=abcd&limit=8”以使用“https”

错误(Chrome):

  

混合内容:“https://example.com/mypage”页面是通过HTTPS加载的,但是请求了一个不安全的XMLHttpRequest端点“http://example.com/myapi/get_company/?code=abcd&limit=8”。此请求已被阻止;内容必须通过HTTPS提供。

我打开了chrome://net-internals/,从我可以看到有两个调用,第一个调用HTTP 301 Permanent Redirect,第二个调用失败,因为重定向指向HTTP页面,而不是HTTPS。

AJAX调用如下所示:

$url = "/myapi/get_company?code=" + e;
apiJson = $.ajax({
    url: $url, 
    dataType: 'json',
    data:{
        limit:8
    },
success: function(data) { //Some code here },
error: function(jqXHR, textStatus, errorThrown) { //Some code here }
});

我也尝试过提供包含协议的完整网址,但这并没有什么区别。

3 个答案:

答案 0 :(得分:0)

更新.htaccess配置

RewriteCond %{HTTPS} !=on - >不需要

将.htaccess文件配置更新为

RewriteCond %{HTTP:X-Forwarded-Proto} !https RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301,NE]

除了更改.htaccess文件外,您还需要确保,一旦使用HTTPS方案加载页面,从页面进行的ajax调用不应该在HTTP上。您看到的错误是浏览器错误,与您的elb配置方式隔离。

答案 1 :(得分:0)

我找到了一个解决方案,现在发布了我自己的问题的答案。不要问我是怎么解释这个问题的,因为我不能给你一个明确的答案,但这就是它的作用:

$url = "/myapi/get_company?code=" + e;

更改为:

$url = "/myapi/get_company/?code=" + e;

注意参数前面的尾部斜杠。处理服务器端AJAX调用的实际文件位于:

/myapi/get_company/index.php

答案 2 :(得分:0)

检查问题是否在服务器上,而不是在客户端上。您的AJAX调用是API端点; 该API端点在返回HTTPS重定向时会返回HTTP重定向吗?