lan*_*and 68 apache mod-rewrite https amazon-web-services amazon-elastic-beanstalk
我似乎无法在弹性beanstalk的免费使用层上强制使用https.
我在如何强制https on amazon elastic beanstalk上尝试了以下建议而不会失败健康检查
使用此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]
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时,http请求不会像我想的那样被重定向到https.相反,http页面正常加载.我也尝试使用X-Forwarded-Port标头,结果相同.
我也尝试了以下重写规则
RewriteCond %{SERVER_PORT} 80
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
Run Code Online (Sandbox Code Playgroud)
此规则会导致重定向循环.因此,似乎apache重写规则不会获取Elastic Load Balancer标头X-Forwarded-Port和X-Forwarded-Proto,但重定向循环也不是我想要的.
请帮忙.我是AWS,Elastic Beanstalk的新手,并且不熟悉Apache规则.我不太确定从哪里开始.谢谢.
Zag*_*ags 161
此答案假定您已在负载均衡器安全组中启用了https,将SSL证书添加到负载均衡器,将443添加到负载均衡器转发的端口,并使用Route 53将您的域名指向Elastic Beanstalk环境(或等效的DNS服务).
注意:此答案适用于使用Apache的Elastic Beanstalk环境.它也可能不适用于基于docker的部署.
您需要做的就是将以下内容添加到项目目录中的一个.config文件中.ebextensions:
files:
"/etc/httpd/conf.d/ssl_rewrite.conf":
mode: "000644"
owner: root
group: root
content: |
RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>
Run Code Online (Sandbox Code Playgroud)
这在Elastic Beanstalk之外是适度的直接向前.通常会添加一个Apache重写规则,如下所示:
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
Run Code Online (Sandbox Code Playgroud)
或者,如果在负载均衡器后面,就像我们在这种情况下:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
Run Code Online (Sandbox Code Playgroud)
但是,这些配置仅在<VirtualHost>块内工作.更改RewriteCond为<If>块允许它在块外部正常工作<VirtualHost>,允许我们放入独立的Apache配置文件.请注意,CentOS上的标准Apache设置(包括ElasticBeanstalk上的设置)包含所有/etc/httpd/conf.d/*.conf匹配的文件,这与我们存储此文件的文件路径相匹配.
-n '%{HTTP:X-Forwarded-Proto}'如果您不在负载均衡器之后,条件的一部分可以防止它重定向,允许您在生产环境与负载均衡器和https之间进行共享配置,以及作为单实例且没有https的分段环境.如果您在所有环境中使用负载平衡器和https,则不需要这样做,但拥有它并没有什么坏处.
我已经看到了很多关于这个问题的糟糕解决方案,值得深入了解为什么这个解决方案是必要的.
使用Cloudfront: 有些人建议在Elastic Beanstalk前面使用非缓存Cloudfront设置来执行HTTP到HTTPS重定向.这增加了一个全新的服务(因此增加了复杂性),这不是完全合适的(Cloudfront是一个CDN;它不是强制HTTPS在非常动态内容上的正确工具).Apache配置是这个问题的正常解决方案,Elastic Beanstalk使用Apache,所以这就是我们应该采用的方式.
SSH进入服务器和......:这与Elastic Beanstalk完全相反,并且存在很多问题.由自动缩放创建的任何新实例都不具有已修改的配置.任何克隆环境都没有配置.任何数量的合理环境更改都将消除配置.这真是个坏主意.
使用新文件覆盖Apache配置:如果Elastic Beanstalk更改了服务器设置的各个方面(他们很可能会这样做),这将进入正确的解决方案领域,但会让您遇到维护噩梦.另请参阅下一个项目中的问题.
动态编辑Apache配置文件以添加几行:这是一个不错的主意.这样做的问题是,如果Elastic Beanstalk更改了默认Apache配置文件的名称,它将无法工作,并且当您最不期望时,此文件可能会被覆盖:https://forums.aws.amazon.com/thread .jspa?线程ID = 163369
Ada*_*ink 15
编辑:虽然我喜欢这个答案,但它现在已经很老了.AWS已经提出了新的服务(如证书管理器),这些服务已经过时了.此外,
.ebextensions如上所述,使用Apache文件夹是一种更简洁的方法来处理此重定向.
如果您在S3上托管您的网站,此答案的部分内容可能仍然对您有用.
这对我有用:
使用awsconsole命令将证书上载到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/
Run Code Online (Sandbox Code Playgroud)在Elastic Beanstalk应用程序中,转到配置 - > 网络层 - > 负载平衡,然后单击齿轮图标.
选择安全侦听器端口为443.选择Protocol as HTTPS.选择CERTIFICATE_NAME从步骤2对SSL证书ID.保存配置.
转到您的控制台.单击EC2实例.单击" 负载均衡器".单击负载平衡器.单击Instances并向下滚动以查看分配给该负载均衡器的EC2实例.如果EC2实例与您的应用程序URL具有相同的名称(或关闭的名称),请记下负载均衡器的DNS名称.它应该是格式awseb-e-...
返回您的控制台.单击CloudFront.单击创建分发.选择Web分配.
设置分发.将源域名设置为您在步骤5中找到的负载均衡器DNS名称.将查看器协议策略设置为将HTTP重定向到HTTPS.将" 查询字符串"设置为" 是".将备用域名(CNAME)设置为要用于应用程序的URL.将SSL证书设置为CERTIFICATE_NAME您在步骤2中上传的内容.创建您的发行版.
在CloudFront中单击您的分发名称.单击" 起源",选择原点,然后单击" 编辑".确保您的原始协议策略是匹配查看器.回去.单击" 行为",选择您的原点,然后单击" 编辑".将转发标题更改为白名单并添加主机.保存.
注意: 我也写了一篇更长的指南.
小智 7
使用新的应用程序负载均衡器,您现在可以相当轻松地做到这一点......
确保在设置 EB 环境时设置其中之一(我相信仍然默认为经典负载均衡器)。创建环境后,您无法更改类型,因此请重新创建它
完成此操作后,转到您的 EC2 设置 -> 负载均衡器。单击您为 EB 环境创建的负载均衡器。您必须确保在此任务之前已设置 HTTPS 侦听器,因此请确保使用 SSL 证书侦听 HTTPS 443,并使用 80 上的 HTTP 将流量转发到您的实例。
然后添加一个新的侦听器,它侦听 HTTP 并添加“重定向到:”的默认操作。确保将 HTTPS 设置为协议,将 443 设置为端口,“原始主机、路径、查询”作为选项,最后将 301 设置为 HTTP 响应代码。
添加此侦听器后,请确保更新您的 EC2 负载均衡器安全组以接受 HTTPS 和 HTTP 连接,您将在侦听器上看到小警告标志以提醒您!
克里斯
小智 6
最受欢迎的对我不起作用.. <If>指令仅适用于Apache 2.4+,但ElasticBeanstalk的版本为2.2.x.
因此,遵循与上述相同的建议.使用以下内容创建名为.ebextensions/https_rewrite.config的文件
files:
"/etc/httpd/conf.d/ssl_rewrite.conf":
mode: "000644"
owner: root
group: root
content: |
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
Run Code Online (Sandbox Code Playgroud)
这似乎对我有用.
有关如何将此文件构建到WAR文件中,请参阅此答案
小智 -4
如果您使用负载均衡环境,则可以按照为 AWS Elastic Beanstalk 环境配置 HTTPS 的说明进行操作,并在最后禁用 HTTP 端口。
请注意,目前AWS 免费使用套餐包含的 Elastic Load Balancing (ELB) 小时数与 EC2 微型实例相同。
| 归档时间: |
|
| 查看次数: |
38636 次 |
| 最近记录: |