如何在弹性豆茎上强制 https?
Posted
技术标签:
【中文标题】如何在弹性豆茎上强制 https?【英文标题】:How to force https on elastic beanstalk? 【发布时间】:2013-01-19 13:44:13 【问题描述】:我似乎无法在弹性豆茎的免费使用层上强制使用 https。
我在How to force https on amazon elastic beanstalk without failing the health check尝试了以下建议
使用这个 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 规则不是很熟悉。我不太确定从这里去哪里。谢谢。
【问题讨论】:
在其上休眠后,似乎重写规则现在检测到 X-Forwarded-Proto 标头。不完全确定为什么,但现在可以了。 互联网似乎无法就这个问题的单一、完整和有效的解决方案达成一致。希望你能得到一些帮助here in my post。最后,我不得不费尽心思才想出这个。 谁能知道我该如何更改它以将 www 重定向到非 www RewriteEngine On此答案假设您已在负载均衡器安全组中启用 https,将 SSL 证书添加到负载均衡器,负载均衡器转发端口 80 和 443,并将您的域名指向 Elastic Beanstalk 环境使用 Route 53(或等效的 DNS 服务)。
选项 1:使用 Apache 进行重定向
只有在使用 Apache 的 Elastic Beanstalk 环境中才有可能。它可能不适用于基于 docker 的部署。
亚马逊 Linux 2
大多数基于 AWS Linux 版本 2 的平台都可以选择 Apache 作为您的代理主机。这可以通过转到“配置”>“软件”> “容器选项”并将“代理服务器”设置为“Apache”。
完成后,将名为 .platform/httpd/conf.d/ssl_rewrite.conf
的配置文件添加到您的代码库 (relevant AWS docs) 中,其内容如下:
RewriteEngine On
<If "-n '%HTTP:X-Forwarded-Proto' && %HTTP:X-Forwarded-Proto != 'https'">
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]
</If>
亚马逊 Linux 1
您只需将以下内容添加到您的.config
files in the .ebextensions
directory of your project 之一:
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>
说明
这在 Elastic Beanstalk 之外是相当直接的。通常会添加一个 Apache 重写规则,如下所示:
RewriteCond %HTTPS off
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
或者,如果在负载均衡器后面,就像我们在这种情况下一样:
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]
但是,这些配置仅适用于 <VirtualHost>
块。将RewriteCond
更改为<If>
块允许它在<VirtualHost>
块之外正常工作,允许我们放入独立的Apache 配置文件。请注意,CentOS 上的标准 Apache 设置(包括 ElasticBeanstalk 上的设置)包含与 /etc/httpd/conf.d/*.conf
匹配的所有文件,这与我们存储此文件的文件路径匹配。
条件的-n '%HTTP:X-Forwarded-Proto'
部分会阻止它在您不在负载均衡器之后进行重定向,从而允许您在具有负载均衡器和 https 的生产环境与单实例和暂存环境之间共享配置没有https。如果您在所有环境中都使用负载均衡器和 https,则这不是必需的,但拥有它并没有什么坏处。
选项 2:使用 ALB 进行重定向
这只有在您使用应用程序负载均衡器时才有可能。亚马逊在这里有如何做到这一点的说明:https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html
您需要做的就是将以下内容添加到您的.config
files in the .ebextensions
directory of your project 之一,以将 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: 有人建议在 Elastic Beanstalk 前面使用非缓存 Cloudfront 设置来执行 HTTP 到 HTTPS 的重定向。这增加了一个不完全合适的全新服务(从而增加了复杂性)(Cloudfront 是一个 CDN;它不是在固有动态内容上强制使用 HTTPS 的正确工具)。 Apache config 是这个问题的常规解决方案,而 Elastic Beanstalk 使用 Apache,所以我们应该这样做。
SSH 进入服务器并...: 这与 Elastic Beanstalk 的观点完全相反,并且存在很多问题。通过自动缩放创建的任何新实例都不会具有修改后的配置。任何克隆的环境都没有配置。任何数量的合理环境更改都将清除配置。这真是个坏主意。
用新文件覆盖 Apache 配置: 这进入了正确的解决方案领域,但如果 Elastic Beanstalk 更改服务器设置的各个方面(他们很可能做)。另请参阅下一项中的问题。
动态编辑 Apache 配置文件以添加几行: 这是一个不错的想法。这样做的问题是,如果 Elastic Beanstalk 更改其默认 Apache 配置文件的名称,它将无法正常工作,并且此文件可能会在您最意想不到的时候被覆盖:https://forums.aws.amazon.com/thread.jspa?threadID=163369
【讨论】:
在 2021 年偶然发现了这一点。我们通过.ebextensions
成功完成了#3,直到我们从 php7.3 升级到 PHP7.4 环境为止。 PHP7.4 的默认 EB 环境是 nginx,所以我们没有意识到我们的 HTTP->HTTPS 重定向停止工作。
@haz 使用哪个网络服务器(Nginx 或 Apache)可在基于 Amazon Linux 2 的环境中配置【参考方案2】:
我发现here 的回答很有帮助。
我所做的只是在应用程序负载均衡器默认进程中创建健康检查路径/index.php
而不是/
。
【讨论】:
【参考方案3】:AWS 对此也有一些 documentation。
如果您使用的是应用程序负载均衡器,请将文件 http-to-https.config
添加到您的 .ebextensions
文件夹,然后添加以下配置(不要忘记输入您的 https 证书的 ARN强>):
注意:请确保您尚未通过 EB 控制台在端口 443 上添加侦听器。如果您这样做了,请在添加 .config 文件之前删除侦听器。
Resources:
AWSEBV2LoadBalancerListener:
Type: 'AWS::ElasticLoadBalancingV2::Listener'
Properties:
DefaultActions:
- Type: redirect
RedirectConfig:
Protocol: HTTPS
Port: '443'
Host: '#host'
Path: '/#path'
Query: '#query'
StatusCode: HTTP_301
LoadBalancerArn:
Ref: AWSEBV2LoadBalancer
Port: 80
Protocol: HTTP
AWSEBV2LoadBalancerListenerHTTPS:
Type: 'AWS::ElasticLoadBalancingV2::Listener'
Properties:
Certificates:
- CertificateArn: Replace with Certificate ARN
DefaultActions:
- Type: forward
TargetGroupArn:
Ref: AWSEBV2LoadBalancerTargetGroup
LoadBalancerArn:
Ref: AWSEBV2LoadBalancer
Port: 443
Protocol: HTTPS
为此使用 LB 的优势在于,您的配置将与您使用的服务器无关,例如 nginx、apache 等。
【讨论】:
【参考方案4】:使用新的应用程序负载均衡器,您现在可以相当简单地做到这一点...
确保在设置 EB 环境时设置其中一个(我相信仍然默认为经典负载均衡器)。创建环境后无法更改类型,请重新创建它
完成后,转到您的 EC2 设置 -> 负载均衡器。单击您为 EB 环境创建的负载均衡器。 您必须确保在执行此任务之前已设置 HTTPS 侦听器,因此请确保您使用 SSL 证书侦听 HTTPS 443,并使用 80 上的 HTTP 将流量转发到您的实例。
然后添加一个新的侦听器来侦听 HTTP 并添加一个默认操作“重定向到:”。确保将 HTTPS 设置为协议,443 作为端口,“原始主机、路径、查询”作为选项,最后将 301 作为 HTTP 响应代码。
添加此侦听器后,请确保您更新您的 EC2 负载均衡器安全组以接受 HTTPS 和 HTTP 连接,您将在侦听器上看到小警告标志以提醒您!
克里斯
【讨论】:
谢谢,我得到了这个为我的 www 工作。路由但不是裸域。关于为什么会这样的任何建议?【参考方案5】:通过环境变量启用 HTTPS
我只需要对我们的生产环境强制实施 HTTPS,而不是对也在 Elastic Beanstalk 上但不使用负载均衡器(因此不能直接分配证书)的开发和暂存环境强制实施 HTTPS。
我使用环境变量USE_HTTPS
。当且仅当USE_HTTPS
设置为true
时,我们才复制ssl_rewrite.conf
文件。
.ebextensions/files/ssl_rewrite.conf
RewriteEngine On
<If "-n '%HTTP:X-Forwarded-Proto' && %HTTP:X-Forwarded-Proto != 'https'">
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R=301,L]
</If>
.ebextensions/https.config
files:
"/home/ec2-user/https_setup.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
echo "USE_HTTPS env var: $USE_HTTPS,,"
outfile=/etc/httpd/conf.d/ssl_rewrite.conf
if [ "$USE_HTTPS,," == "true" ]; then
echo "Configure SSL rewrite"
cp .ebextensions/files/ssl_rewrite.conf $outfile
chmod 644 $outfile
chown root:root $outfile
else
[ -f $outfile ] && rm $outfile
echo "Do not use SSL"
exit 0
fi
container_commands:
01_https_setup:
command: "/home/ec2-user/https_setup.sh"
请注意,如果您更改USE_HTTPS
,您需要重新部署您的应用程序才能使更改生效。如果您愿意,还可以删除https.config
文件中的echo
命令。
【讨论】:
【参考方案6】:以防万一有人还在苦苦挣扎:
我已经挣扎了一段时间,最后,我找到了一个包含所有 AWS 配置的 GitHub(来自 AWS 团队),下面的示例适用于 Apache 2.2 的 HTTP>HTTPS 重定向。 (有关 Apache 2.4 和 Nginx 的配置,请参阅下面的链接)。
Apache 2.2
在应用的根目录中创建一个文件: YOUR_PROJECT_ROOT/.ebextensions/httpd/conf.d/elasticbeanstalk.conf (如果使用 IntelliJ / Java,请确保将其添加到最终的 .WAR 工件中)
添加以下行以在虚拟主机中启用重定向:
<VirtualHost *:80>
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteCond %HTTP_USER_AGENT !ELB-HealthChecker
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on
ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>
有关 Apache 2.4 和 Nginx 的更多示例,请访问此 GitHub 存储库:
https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect/java-tomcat
此外,还有更多有用的配置和示例可用。
问候
【讨论】:
【参考方案7】:AWS 不接受在 headers 中使用 unserscores (_),而我们可以使用 (-),因此从 header 变量中删除下划线,例如:- header_var_val = "some value" 将其替换为 headervarval = "某个值"。它对我有用。
【讨论】:
【参考方案8】:我正在尝试在 2018 年使用负载平衡器重定向弹性 beantalk。以上答案均不适用于我的环境。我遇到的几个问题:
我正在尝试投票最多的答案,但我的 tomcat 是 2.7 版。不支持。
我正在使用 container_commands 并复制 00_applications 设置。 AWS 只是忽略它。
所以最后我通过阅读这篇文章让它工作了: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html
这是我的工作:
我重新创建了文件夹结构:
.ebextensions
- httpd
-conf.d
-ssl.conf
然后这是 ssl.conf 的内容
<VirtualHost *:80>
RewriteEngine on
RewriteCond %HTTP:X-Forwarded-Proto =http
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]
<Proxy *>
Order Allow,Deny
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on
ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>
希望这会有所帮助。
【讨论】:
它重定向到 https,但它说找不到服务器。我正在使用 Spring MVC 网络应用程序 添加此内容后,我在 EB 日志中收到了nginx: [emerg] unknown directive "<VirtualHost"
。还有其他人看到这种行为吗?【参考方案9】:
扩展这个问题的另外两个答案https://***.com/a/43026082/8775205,https://***.com/a/42035023/8775205。 对于使用 ELB 在 AWS 上部署服务并需要分步指南的 Spring Boot 用户,您可以在项目中的 src/main/webapp/.ebextensions/httpd/conf.d/ 下添加一个 ****.conf 文件.
src
--main
----java
----resources
----webapps
------.ebextensions
--------httpd
----------confd
------------****.conf
****.conf 如下所示。注意到我的测试站点只有一个实例,所以我添加了一个条件来排除它。
<VirtualHost *:80>
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteCond %HTTP_USER_AGENT !ELB-HealthChecker
RewriteCond %HTTP_HOST !testexample.com #excludes test site
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on
ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>
在这之后,记得在你的 pom.xml 中的 maven-war-plugin 下添加一个“资源”,以便获取上述配置。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<!-- some other resource configured by yourself-->
</resource>
<resource>
<directory>src/main/webapps/.ebextensions</directory>
<targetPath>.ebextensions</targetPath>
<filtering>true</filtering>
</resource>
</webResources>
</configuration>
<version>2.1.1</version>
</plugin>
最后提交并推送您的代码,等待 AWS codebuild 和 codepipeline 从您的存储库中获取您的代码并部署到 beanstalk 环境,或者只是将您的项目打包到一个 war 文件中并将其上传到您的 AWS beanstalk 环境
【讨论】:
【参考方案10】:我们通过正确处理X-Forwarded-Proto
在后端解决了这个问题。
这是我们的 Grails 配置,但它会帮助您实现这个想法:
grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
grails.plugin.springsecurity.portMapper.httpPort = 80
grails.plugin.springsecurity.portMapper.httpsPort = 443
grails.plugin.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http'
grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https'
grails.plugin.springsecurity.secureChannel.definition = [
[pattern: '/**', access: 'REQUIRES_SECURE_CHANNEL']
]
【讨论】:
【参考方案11】:请注意,投票最多的答案现在有点老了。 A Paul的答案实际上是正确的答案。他的回答中提供的链接是 AWS 提供的(因此,在 Elastic Beanstalk 上运行您的应用程序时,建议覆盖您的 Apache 配置以进行从 HTTP 到 HTTPS 的重定向)。
有一件非常重要的事情需要注意。如果您要部署超过 1 个 Web 应用程序,那么在您的一个 Web 应用程序中添加 .ebextensions 文件夹将不起作用。您会注意到您指定的配置中没有一个正在编写或创建。如果您在 Elastic Beanstalk 环境中部署多个 Web 应用程序,那么您需要阅读 AWS 的这篇文章 Java Tomcat Deploy Multiple WAR files on Elastic Beanstalk
一般来说,在对它发出 eb 命令以部署 WAR 文件之前,您需要具有以下结构:
MyApplication.zip
├── .ebextensions
├── foo.war
├── bar.war
└── ROOT.war
如果 .ebextentions 文件夹存在于每个 WAR 文件中,那么您会注意到它被完全忽略并且不会执行任何配置更改。
希望这对其他人有所帮助。
【讨论】:
【参考方案12】:我很难弄清楚这一点,所以在我想出一个解决方案后,我 wrote a detailed explanation of my solution 希望能帮助其他人。这特定于 Tomcat 8、Apache2 和 Spring Boot 应用程序。真的很有用ebextension examples in the AWS labs github。
对我有用的总结:
-
在 /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf 创建一个文件
添加重写条件/规则,小心包含“LoadModule rewrite_module modules/mod_rewrite.so”
部署到 AWS EBS
这是example Spring Boot app。
【讨论】:
【参考方案13】:您为什么不简单地将 .htaccess 文件放在根文件夹中?这样你就可以简单地测试和调试它。如果您将其包含在 .zip 中,它将再次自动部署在所有实例上。
只需使用.htaccess
:
RewriteEngine on
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [R,L]
【讨论】:
【参考方案14】:在弹性 beanstalk 上,您只需添加您的 on 配置,以便 AWS 覆盖它们,它将允许您覆盖 Web 服务器配置并提交您自己的配置。
只需在路径下添加以下文件:.ebextensions\httpd\conf.d
文件内容:
<VirtualHost *:80>
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteCond %HTTP_USER_AGENT !ELB-HealthChecker
RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on
ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>
“.ebextensions”是 AWS 中的标准配置文件夹,其余的只是指向您希望覆盖的文件和文件夹。 如果文件或文件夹不存在,只需创建它们。
【讨论】:
【参考方案15】:以上答案都不适合我,但有些答案帮助我找出了适合我的答案 我还找到了以下帮助 http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-platform.html
我创建了上面 url 中提到的文件结构来更改 2 个文件 httpd.conf 00_application.conf
从您的实例中复制整个 httpd.conf 并将其放在上述链接中提到的文件夹结构下的 .ebextention 下的代码中。然后只需在项目中的该文件中添加以下行
LoadModule rewrite_module modules/mod_rewrite.so
对 00_application.conf 执行相同操作,从您的实例中复制它并将其放置在您的代码库中 httpd/conf.d/elasticbeanstalk/00_application.conf 下的 .ebextention 下 现在编辑此文件并在 VirtualHost 之间添加以下内容
RewriteEngine on
RewriteCond %HTTP:X-Forwarded-Proto =http
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]
现在部署您的代码 它应该可以工作。
【讨论】:
【参考方案16】:我有以下弹性 beanstalk 配置(运行 Tomcat 8 Java 8 的 64 位 Amazon Linux 2016.09 v2.3.1)。 我创建了一个目录 .ebextensions 并添加了一个带有重写条件的 .config YAML 文件
上述Zagas solution(非常复杂)对我不起作用。
-
因为“如果”条件未知
由于 Apache 2.2,我的 httpd.conf 文件中没有包含 mod_rewrite.so
This solution 对我来说更有意义,但这也行不通。什么都没有发生,我在“conf.d”目录下看不到文件“ssl_rewrite.conf”。
第三个尝试的解决方案是在“.ebextendsion”目录下添加“run.config”和“ssl_rewrite.conf”文件。
run_config 包含
container_commands:
copy-config:
command: "cp .ebextensions/ssl_rewrite.conf /etc/httpd/conf.d"
ssl_rewrite.conf 包含
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto =http
RewriteRule . https://%HTTP:Host%REQUEST_URI [L,R=permanent]
ssl_rewrite.conf 是在“conf.d”目录下创建的,但从 http 重定向到 https 不起作用。
对我来说唯一可行的解决方案是在“/etc/httpd/conf.d/elasticbeanstalk/00_application.conf”中添加以下行
<VirtualHost *:80>
......
RewriteEngine on
RewriteCond %HTTP:X-Forwarded-Proto =http
RewriteRule ^ https://%HTTP_HOST%REQUEST_URI [L,R=301]
......
</VirtualHost>
但这是一个临时解决方案,如果更换机器,我的 https 重定向就会消失。
【讨论】:
“如果更换了机器,我的 https 重定向消失了” 我认为您可以使用 Zags 的回答中显示的相同技巧在 ELB 部署应用程序时自动写入文件在一个新的例子中。基本上,给你files:
下的文件路径,content: |
下的文件内容,并设置适当的模式,所有者和组。 ELB 会自动为你创建文件。
我已经使用上述方法(在我的评论中)将此文件部署为应用程序的一部分(而不是将其直接写入当前实例)。我通过 SSH 检查该文件是否存在。但是,尽管我的设置与您的设置非常接近,但它对我也不起作用:运行 Tomcat 8 Java 8 的 64 位 Amazon Linux 2016.03 v2.1.1 但有一件事,该文件不存在于最初都是-它是新创建的。我应该编辑/etc/httpd/conf.d/elasticbeanstalk.conf
吗?【参考方案17】:
最赞成的对我不起作用..
因此,请遵循与上述相同的建议。使用以下内容创建一个名为 .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]
这似乎对我有用。
关于如何将此文件构建到您的 WAR 文件中,请参阅answer
【讨论】:
关于这个答案的附加说明:编辑:虽然我喜欢这个答案,但它现在非常古老。 AWS 提供了新的服务(如 Certificate Manager),这些服务构成了这个答案的一部分过时的。此外,在 Apache 中使用
.ebextensions
文件夹是一种更简洁的方式来处理上述重定向。
如果您在 S3 上托管您的网站,此答案的部分内容可能对您仍然有用。
这对我有用:
使用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/
在您的 Elastic Beanstalk 应用程序中,转到 Configuration -> Network Tier -> Load Balancing 并单击 齿轮图标。
选择安全侦听器端口作为443。选择 Protocol 作为 HTTPS。为 SSL 证书 ID 选择 步骤 2 中的 CERTIFICATE_NAME
。保存配置。
转到您的控制台。点击 EC2 实例。点击负载平衡器。单击负载均衡器。单击 Instances 并向下滚动以查看分配给该负载均衡器的 EC2 实例。如果 EC2 实例与您的应用程序 URL 具有相同的名称(或类似名称),请记下负载均衡器的 DNS 名称。格式应为awseb-e-...
返回您的控制台。单击 CloudFront。点击创建分发。选择一个Web分发版。
设置分发。将您的 Origin Domain Name 设置为您在 步骤 5 中找到的负载平衡器 DNS 名称。将查看器协议政策设置为将 HTTP 重定向到 HTTPS。将 Forward Query Strings 设置为 Yes。将备用域名 (CNAME) 设置为您要用于您的应用程序的 URL。将 SSL 证书 设置为您在步骤 2 中上传的CERTIFICATE_NAME
。创建您的发行版。
在 CloudFront 中单击您的分配名称。点击Origins,选择您的来源,然后点击Edit。确保您的 Origin Protocol Policy 是 Match Viewer。回去。点击Behaviors,选择您的来源,然后点击Edit。将 Forward Headers 更改为 Whitelist 并添加 Host。保存。
注意:I wrote a longer guide as well.
【讨论】:
【参考方案19】:编辑:Zags solution 更加通用和正确。我推荐它而不是我的(这是特定于 python 环境的)
这是我想出的一个干净快速的解决方案,可以避免入侵 wsgi.conf 或使用 CloudFront
在您的 .ebextensions/some_file.config 中:
# Redirect HTTP to HTTPS
"/etc/httpd/conf.d/https_redirect.conf":
mode: "000644"
owner: root
group: root
content: |
<Directory /opt/python/current/app/>
RewriteEngine on
RewriteCond %HTTP:X-Forwarded-Proto ^http$
RewriteRule .* https://%HTTP_HOST%REQUEST_URI [R=301,L]
</Directory>
我觉得这太容易了,但似乎工作正常。
另请注意,我明确重定向 HTTP 而不是“非 HTTPS”。
【讨论】:
所以我在一个 EBS 环境中工作。 /etc/httpd/conf.d/https_redirect.conf 存在,它重定向到 https。问题出在第二个环境中,设置方式完全相同,文件 /etc/httpd/conf.d/https_redirect.conf 不存在。有什么想法吗? @NitzanWilnai/etc/httpd/conf.d/https_redirect.conf
不必存在,请参阅answer
将文件添加到 /etc/httpd/conf.d 是个好主意。这帮助我找到了通用解决方案 (***.com/a/38751749/2800876)【参考方案20】:
下一个命令对我有用:
RewriteCond %HTTP:X-Forwarded-Port !=443
并且没有 https 检查:
RewriteCond %HTTP:X-Forwarded-Proto !https
看起来ELB将X-Forwarded-Proto的值更改为http(即使在TCP协议上)。
【讨论】:
这应该是公认的答案。标头已记录在案,因此您可以依赖它们。 docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/…【参考方案21】:这是一个简单的解决方案
-
SSH 进入您的 EC2 实例
将 /etc/httpd/conf.d/wsgi.conf 的内容复制到名为 wsgi.conf 的本地文件中,该文件将放置在应用程序的基本文件夹中
编辑 wsgi.conf 的本地版本并在
RewriteEngine On
RewriteCond %HTTP:X-Forwarded-Proto !https
RewriteRule !/status https://%SERVER_NAME%REQUEST_URI [L,R=301]
将“/status”更改为您用作健康检查页面的任何页面。
保存文件在您的 .ebextensions 目录中编辑您的 .conf 文件,以添加一个容器命令,将这个版本的 wsgi.conf 复制到亚马逊的版本
container_commands:
01_syncdb:
command: "django-admin.py syncdb --noinput" leader_only: true
02_collectstatic:
command: "django-admin.py collectstatic --noinput"
03_wsgireplace:
command: 'cp wsgi.conf ../wsgi.conf'
...
部署代码。
/etc/httd/conf.d/wsgi.conf 中部署的 wsg.conf 版本现在将包含必要的重定向规则。它应该可以工作,并且每次部署都会正确更新文件。唯一需要注意的是,如果 Amazon 将来更改其基本 wsgi.conf 文件内容,那么您的副本可能不再有效。
作者rickchristianson
【讨论】:
他自己的答案完全相同:***.com/questions/6858492/…。停止发布重复的答案! 问题可以用相同的答案解决;)它的垃圾邮件?? ssh 到负载均衡器后面的实例并进行调整违背了 Elastic Beanstalk 的目的。当您扩大规模并获得更多实例时会发生什么?对所有人都这样做吗?手动? @fivedogit 如果您仔细阅读,您会注意到他没有通过 SSH 连接到实例进行调整。他只 SSH 读取文件并复制它。之后,他在他的部署中使用.ebextensions
通过 Elastic Beanstalk 本身正确地进行调整,所以他没有违背它的目的。【参考方案22】:
如果您使用负载平衡环境,您可以按照Configuring HTTPS for your AWS Elastic Beanstalk Environment 的说明操作,最后禁用 HTTP 端口。
请注意,目前AWS Free Usage Tier 包含的 Elastic Load Balancing (ELB) 小时数与 EC2 微实例相同。
【讨论】:
这样你只启用HTTPS,但你不强制它。强制意味着您自动将所有 HTTP 请求重定向到 HTTPS。以上是关于如何在弹性豆茎上强制 https?的主要内容,如果未能解决你的问题,请参考以下文章
如何在亚马逊弹性豆茎上强制 https 而不会失败健康检查 [重复]
如何在亚马逊弹性豆茎上强制 https 而不会失败健康检查 [重复]
如何在亚马逊弹性豆茎上强制 https 而不会失败健康检查 [重复]