如何在弹性 Beanstalk 上强制使用 HTTPS?
如何在弹性 Beanstalk 上强制使用 HTTPS?
我似乎无法在elastic beanstalk的免费使用层上强制使用https。
我尝试了如何在亚马逊弹性beanstalk上强制使用https而不导致健康检查失败中的建议。
使用以下Apache重写规则:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status$
RewriteCond %{REQUEST_URI} !^/version$
RewriteCond %{REQUEST_URI} !^/_hostmanager/
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
当我尝试这样做时,http请求不会像我希望的那样重定向到https。相反,http页面会正常加载。我还尝试使用X-Forwarded-Port头部,但结果相同。
我还尝试了以下重写规则:
RewriteCond %{SERVER_PORT} 80 RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
这条规则导致了重定向循环。所以看来Apache重写规则没有识别到Elastic Load Balancer的X-Forwarded-Port和X-Forwarded-Proto头部,但重定向循环也不是我想要的结果。
请帮忙。我是AWS和Elastic Beanstalk的新手,对Apache规则也不太熟悉。我不太确定接下来该怎么做。谢谢。
问题的出现原因:用户想在Elastic Beanstalk上强制使用HTTPS,但只成功设置了www域名的重定向,而未能成功设置裸域名的重定向。
解决方法:首先,确保在设置EB环境时使用了Application Load Balancer(默认情况下是经典负载均衡器)。如果未使用ALB,则需要重新创建环境。
然后,进入EC2设置的负载均衡器页面,点击为EB环境创建的负载均衡器。确保已经设置了HTTPS监听器,监听443端口,并使用SSL证书将流量转发到80端口的实例。
接下来,添加一个监听器,监听HTTP协议,并将默认操作设置为“Redirect to:”。确保将协议设置为HTTPS,端口设置为443,选项设置为“Original host, path, query”,最后将HTTP响应代码设置为301。
添加完监听器后,确保更新EC2负载均衡器安全组,以接受HTTPS和HTTP连接。监听器旁边会有一个小警告标志提醒用户。
对于无法成功重定向裸域名的问题,暂无具体解决方法。
如何在Elastic Beanstalk上强制使用HTTPS?
出现原因:
- AWS推出了新的服务,如证书管理器(Certificate Manager),使得部分答案中的内容过时。
- 使用.ebextensions文件夹与Apache一起处理重定向是一种更干净的方法。
解决方法:
1. 使用aws命令将证书上传到AWS。命令结构如下:
aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/
2. 进入Elastic Beanstalk应用程序,转到“配置” -> “网络层” -> “负载均衡”,点击齿轮图标。
3. 将“安全监听端口”设置为443,选择“协议”为HTTPS。选择第2步中的“CERTIFICATE_NAME”作为“SSL证书ID”。保存配置。
4. 进入控制台,点击“EC2实例”,点击“负载均衡器”,点击负载均衡器,点击“实例”,向下滚动以查看分配给该负载均衡器的EC2实例。如果EC2实例的名称与应用程序URL相同(或相似),请记下负载均衡器的“DNS名称”。它应该是以“awseb-e-…”格式。
5. 返回控制台,点击“CloudFront”,点击“创建分发”。选择“Web”分发。
6. 设置分发。将“源域名”设置为在第5步中找到的负载均衡器DNS名称。将“查看器协议策略”设置为“重定向HTTP到HTTPS”。将“转发查询字符串”设置为“是”。将“备用域名(CNAME)”设置为要用于应用程序的URL。将“SSL证书”设置为在第2步中上传的“CERTIFICATE_NAME”。创建分发。
7. 在CloudFront中点击分发名称。点击“源”,选择源,点击“编辑”。确保“源协议策略”为“匹配查看器”。返回上级页面。点击“行为”,选择源,点击“编辑”。将“转发标头”更改为“白名单”,并添加“主机”。保存。
注意:还可以参考更详细的指南。
如何在弹性Beanstalk上强制使用https?
问题原因:
- 需要在负载均衡器安全组中启用https。
- 需要将SSL证书添加到负载均衡器。
- 需要通过负载均衡器转发80和443端口。
- 需要将域名指向弹性Beanstalk环境。
解决方法1:使用Apache进行重定向
- 对于使用Apache的弹性Beanstalk环境,可以在配置中选择Apache作为代理主机。
- 在代码库中添加名为`.platform/httpd/conf.d/ssl_rewrite.conf`的配置文件,内容为:
RewriteEngine On
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
解决方法2:使用ALB进行重定向
- 只有在使用应用程序负载均衡器时才能使用该方法。
- 在代码库中的`.config`文件中添加以下内容,以用重定向替换http监听器:
Resources:
AWSEBV2LoadBalancerListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
LoadBalancerArn:
Ref: AWSEBV2LoadBalancer
Port: 80
Protocol: HTTP
DefaultActions:
- Type: redirect
RedirectConfig:
Host: "#{host}"
Path: "/#{path}"
Port: "443"
Protocol: "HTTPS"
Query: "#{query}"
StatusCode: "HTTP_301"
其他不良解决方法:
- 使用Cloudfront:将Cloudfront用于强制重定向不适合动态内容,且会增加复杂性。
- SSH进入服务器并进行配置:违背了使用弹性Beanstalk的初衷,不可行。
- 覆盖Apache配置文件或动态编辑Apache配置文件:可能导致维护困难或配置丢失的问题。
注意:以上解决方法适用于不同版本的弹性Beanstalk环境,但具体配置可能有所不同。