我在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 }
});
我也尝试过提供包含协议的完整网址,但这并没有什么区别。
答案 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重定向吗?