Redirect 将EC2弹性负载平衡器从HTTP重定向到HTTPS
我想将所有HTTP请求重定向到上的https请求。我有两个EC2实例。我正在为服务器使用nginx。我尝试过重写nginx conf文件,但没有成功。我希望得到一些建议。ELB设置Redirect 将EC2弹性负载平衡器从HTTP重定向到HTTPS,redirect,nginx,amazon-ec2,https,amazon-elb,Redirect,Nginx,Amazon Ec2,Https,Amazon Elb,我想将所有HTTP请求重定向到上的https请求。我有两个EC2实例。我正在为服务器使用nginx。我尝试过重写nginx conf文件,但没有成功。我希望得到一些建议。ELB设置X-Forwarded-Proto头,您可以使用它来检测原始请求是否是HTTP,然后重定向到HTTPS 您可以在服务器配置中尝试此操作: if ($http_x_forwarded_proto = 'http') { return 301 https://yourdomain.com$request_uri;
X-Forwarded-Proto
头,您可以使用它来检测原始请求是否是HTTP,然后重定向到HTTPS
您可以在服务器
配置中尝试此操作:
if ($http_x_forwarded_proto = 'http') {
return 301 https://yourdomain.com$request_uri;
}
看一看。我也有同样的问题,在我的情况下,HTTPS完全由ELB处理,我事先不知道我的源域,所以我最终做了如下事情:
server {
listen 81;
return 301 https://$host$request_uri;
}
server {
listen 80;
# regular server rules ...
}
然后当然将ELB“https”指向实例端口80,然后将“http”路由指向实例端口81。创建一个文件
。ebextensions/00\u forward\u http\u to\u https.config
,包含以下内容:
files:
/tmp/deployment/http_redirect.sh:
mode: "000755"
content: |
APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf
container_commands:
http_redirect:
command: "/tmp/deployment/http_redirect.sh"
确保事先从AWS管理控制台设置APP_URL环境变量。亚马逊弹性负载平衡器(ELB)支持一个名为X-FORWARDED-PROTO的HTTP头。通过ELB的所有HTTPS请求的X-FORWARDED-PROTO值都将等于“HTTPS”。对于HTTP请求,您可以通过添加以下简单的重写规则来强制HTTPS。对我来说效果很好 Apache 您可以在.htaccess文件中添加以下行:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
或者,如果使用vhost.conf管理同一EC2 web服务器中的多个域,则可以将以下内容添加到vhost.conf(将其添加到要使用https的域):
...
重新启动发动机
重写cond%{HTTP:X-Forwarded-Proto}!https
重写规则^.*$https://%{SERVER_NAME}%{REQUEST_URI}
...
IIS
使用配置GUI安装IIS Url重写模块添加以下设置:
<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>
这可能不是您想要的解决方案,但除了ELB之外,另一种选择可能是使用AWS CloudFront。CloudFront提供了将所有传入HTTP流量重定向到HTTPS的选项 我对nginx和ELB配置有奇怪的问题。我的设置在ELB后面的一个nginx中包含3个不同的服务。我遇到了混合内容问题:当您对ELB的请求是https,但在ELB内部只有http,并且服务器使用http创建到静态的相对路径时,浏览器会因“混合内容”问题而失败。
我必须为http/https创建一个解决方案,并且不需要任何重定向
以下是位于nginx/conf.d/
文件夹中的配置:
# Required for http/https switching
map $http_x_forwarded_port $switch {
default off;
"80" off;
"443" on;
}
这意味着我们将了解什么是真正的客户端协议。如您所见,我们将在$switch
var中使用它。
此时,您可以在所有需要的位置使用此功能:
location ~ /softwareapi/index.php {
fastcgi_param HTTPS $switch;
.. other settings here ..
}
通过HTTPS设置,php应用程序将自动检测正确的协议,并仔细构建相对路径,以防止混合内容问题
致以最良好的祝愿 上述htaccess解决方案导致ELB健康检查失败。我在寻找解决方案时遇到了一些困难,直到我在网上发现一篇文章,其中有人与我有同样的问题。他的解决方案是将其添加到htaccess文件的开头:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
在重定向时允许此请求和其他通过HTTP的本地请求
外部请求通过ELB到HTTPS,调整重写
要在http上匹配的条件,而不是https上的负匹配
来源:AWS应用程序负载平衡器现在支持本机HTTP到HTTPS重定向
要在控制台中启用此功能,请执行以下操作:
转到EC2中的负载平衡器,并选项卡“侦听器”
在HTTP侦听器上选择“查看/编辑规则”
删除除默认规则外的所有规则(底部)
编辑默认规则:选择“重定向到”作为操作,将所有内容保留为默认值,并输入“443”作为端口
如上所述,通过使用CLI也可以实现同样的效果
在Cloudformation中也可以这样做,您需要像这样设置侦听器对象:
HttpListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn: !Ref LoadBalancer
Port: 80
Protocol: HTTP
DefaultActions:
- Type: redirect
RedirectConfig:
Protocol: HTTPS
StatusCode: HTTP_301
Port: 443
如果您仍然使用经典的负载平衡器,请使用其他人描述的NGINX配置之一。根据@Ulli的回答,如果您想使用Terraform对其进行配置,下面是一个示例>
resource "aws_alb_listener" "web" {
load_balancer_arn = "${aws_alb.web.arn}"
port = "80"
protocol = "HTTP"
default_action {
type = "redirect"
redirect {
port = "443"
protocol = "HTTPS"
status_code = "HTTP_301"
}
}
}
我刚刚完成了这个过程,并使用命令测试了重定向(来自ec2实例shell)
curl -Iv [your url]
例:旋度-Iv
要求
在AWS路由53中为DNS和名称服务器设置托管区域
使用AWS证书管理器获取证书
在端口443的负载平衡器上添加侦听器从2中选择证书。还有SSL
我所做的是
重定向-->(步骤2)
重定向-->(步骤2)
重定向-->(步骤3)
台阶
1。转到负载平衡器
2。转到侦听器ID HTTP:80(单击查看/编辑规则)
编辑默认操作:(单击顶部的铅笔图标)
更改然后阻止重定向到https://{host}:443/{path}?{query}
状态代码:HTTP_301
再添加一个操作(单击顶部的+签名)
如果block 主机是yourwebsite.com,请选择
更改然后阻止重定向到https://www.#{host}:443/#{path}?#{query}
状态代码:HTTP_301
3。返回并进入侦听器ID HTTPS:443(单击查看/编辑规则)
再添加一个操作(单击顶部的+签名)
如果block 主机是yourwebsite.com,请选择
更改然后阻止重定向到https://www.#{host}:443/#{path}?#{query}
状态代码:HTTP_301
在何处进行此配置?@ericpeters0n答案中的代码段是针对nginx
config的,但该原则适用于任何web服务器。如果您使用beanstalk和passenger standalone,请按照此链接了解如何更改nginx配置。确保您有HTTP和HTTPS侦听器
curl -Iv [your url]