我似乎无法在弹性beanstalk的免费使用层上强制使用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规则。我不太确定从哪里开始。感谢。
答案 0 :(得分:158)
此答案假设您已在负载均衡器安全组中启用了https,将SSL证书添加到负载均衡器,将443添加到负载均衡器转发的端口,并使用路由将您的域名指向Elastic Beanstalk环境53(或等效的DNS服务)。
注意:此答案适用于使用Apache的Elastic Beanstalk环境。它也可能不适用于基于docker的部署。
您需要做的就是将以下内容添加到.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,则不需要这样做,但拥有它并没有什么坏处。
我已经看到了很多解决这个问题的坏方法,值得深入了解为什么这个解决方案是必要的。
使用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?threadID=163369
答案 1 :(得分:15)
编辑:虽然我喜欢这个答案,但它现在很旧。 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应用程序中,转到配置 - &gt; 网络层 - &gt; 加载平衡,然后点击齿轮图标。
选择安全侦听器端口为 443 。选择协议为 HTTPS 。为 SSL证书ID 从第2步中选择CERTIFICATE_NAME
。保存配置。
转到控制台。点击 EC2实例。点击加载平衡器。单击负载平衡器。单击实例,然后向下滚动以查看分配给该负载均衡器的EC2实例。如果EC2实例与您的应用程序URL具有相同的名称(或关闭的内容),请记下负载均衡器的 DNS名称。它应采用awseb-e-...
返回控制台。点击 CloudFront 。点击创建分配。选择网络分发。
设置分发。将原始域名设置为您在步骤5 中找到的负载均衡器DNS名称。将查看器协议策略设置为将HTTP重定向到HTTPS 。将转发查询字符串设置为是。将备用域名(CNAME)设置为您要用于应用程序的URL。将 SSL证书设置为您在第2步中上传的CERTIFICATE_NAME
。创建您的发行版。
在CloudFront中单击您的分发名称。点击来源,选择您的来源,然后点击修改。确保原始协议政策 匹配查看器。回去。点击行为,选择您的来源,然后点击修改。将转发标题更改为白名单,然后添加主机。保存。
答案 2 :(得分:6)
最受欢迎的对我不起作用..&lt; If&gt;指令仅适用于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]
这似乎对我有用。
关于如何将此文件构建到WAR文件中,请参阅此answer
答案 3 :(得分:4)
编辑:Zags solution更通用,更正确。我推荐它超过我的(特定于python env)
这是一个干净而快速的解决方案,我提出了避免黑客攻击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”。
答案 4 :(得分:4)
我试图在2018年使用loadbalancer重定向弹性beanstalk。上述答案都不适用于我的环境。我遇到的几个问题:
我正在尝试最多投票的答案,但我的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>
希望这会有所帮助。
答案 5 :(得分:3)
使用下一个命令为我工作:
RewriteCond %{HTTP:X-Forwarded-Port} !=443
没有https检查:
RewriteCond %{HTTP:X-Forwarded-Proto} !https
它看起来像ELB将X-Forwarded-Proto的值更改为http(即使在TCP协议上)。
答案 6 :(得分:3)
上述答案都不适用于我,但有些帮助我找出了对我有用的答案 另外我发现下面的网址有帮助 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]
现在部署您的代码 它应该工作。
答案 7 :(得分:2)
我很难想到这一点,所以在我提出解决方案之后,wrote a detailed explanation of my solution希望帮助其他人。这特定于Tomcat 8,Apache2和Spring Boot应用程序。真有用ebextension examples in the AWS labs github。
对我有用的摘要:
答案 8 :(得分:2)
在弹性beanstalk上,您只需添加您的on配置,以便AWS覆盖它们,它将允许您覆盖Web服务器配置并提交您自己的配置。
只需在路径下添加以下文件:.ebextensions \ httpd \ conf.d
文件内容:
forecstCoef=optim(par=tranProb,costFunc,gr=NULL, dat=dat,
method="Nelder-Mead")$par
Error in state_dat %*% state_coef :
non-conformable arguments
'.ebextensions'是AWS中的标准配置文件夹,其余只是指向您要覆盖的文件和文件夹。 如果文件或文件夹不存在,只需创建它们。
答案 9 :(得分:1)
我发现 here 的回答很有帮助。
我所做的只是在应用程序负载平衡器默认进程中将运行状况检查路径设为 /index.php
而不是 /
。
答案 10 :(得分:1)
我有弹性beanstalk的以下配置(运行Tomcat 8 Java 8的64位Amazon Linux 2016.09 v2.3.1)。 我创建了一个目录.ebextensions并添加了一个带有重写条件的.config YAML文件
上面描述的Zagas solution(非常复杂)对我不起作用。
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重定向就会消失。
答案 11 :(得分:1)
我只需要对我们的生产环境实施HTTPS,而对于在Elastic Beanstalk上但不使用负载平衡器(因此无法直接分配证书)的开发和登台环境实施HTTPS。
我使用环境变量USE_HTTPS
。仅当ssl_rewrite.conf
设置为USE_HTTPS
时,我们才复制true
文件。
.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
,则需要重新部署应用程序以使更改生效。您也可以根据需要删除echo
文件中的https.config
命令。
答案 12 :(得分:0)
为什么不简单地将.htaccess文件放在根文件夹中?这样你就可以简单地测试和调试它。如果将它包含在.zip中,它将自动再次部署在所有实例上。
只需使用.htaccess
:
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
答案 13 :(得分:0)
AWS对此也有一些documentation。
如果您使用的是应用程序负载平衡器,请将文件http-to-https.config
添加到.ebextensions
文件夹中,然后添加以下配置(不要忘记将您的ARN放入https证书):
注意:请确保尚未通过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等)无关。
答案 14 :(得分:0)
借助新的应用程序负载平衡器,您现在可以轻松完成此任务...
请确保在设置EB环境时设置其中之一(我相信仍然默认为经典负载均衡器)。创建环境后便无法更改类型,因此请重新创建
完成后,转到EC2设置->负载均衡器。单击您为EB环境创建的负载均衡器。 在执行此任务之前,必须确保已设置HTTPS侦听器,因此请确保使用SSL证书在HTTPS 443上侦听,并在80上使用HTTP将流量转发到实例。
然后添加一个新的侦听器,该侦听器在HTTP上侦听并添加默认操作“重定向到:”。确保将HTTPS设置为协议,将443设置为端口,“原始主机,路径,查询”作为选项,最后将301设置为HTTP响应代码。
一旦添加了此侦听器,请确保您更新了EC2负载平衡器安全组以接受HTTPS和HTTP连接,您将在侦听器上看到一个小的警告标志,以提醒您!
克里斯
答案 15 :(得分:0)
以防万一有人还在挣扎:
我已经苦苦挣扎了一段时间,最后,我找到了一个包含所有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存储库:
此外,还有许多有用的配置和示例。
致谢
答案 16 :(得分:0)
AWS在标题中不接受非下划线(_),而我们可以使用(-),因此请从标题变量中删除下划线,例如:- header_var_val =“ some value” 用< strong> headervarval =“某些值” 。它对我有用。
答案 17 :(得分:0)
为此问题https://stackoverflow.com/a/43026082/8775205,https://stackoverflow.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>
在此之后,请记住添加一个&#34;资源&#34;在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环境
答案 18 :(得分:0)
我们已经通过正确处理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']
]
答案 19 :(得分:0)
请注意,投票最多的答案现在有点老了。 保罗的答案实际上是正确的答案。他的答案中提供的链接是由AWS提供的(因此,在Elastic Beanstalk上运行应用程序时,建议使用覆盖Apache配置以从HTTP重定向到HTTPS的方法)。
有一点非常重要。如果您要部署多个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文件中,那么您会注意到它被完全忽略,并且不会执行任何配置更改。
希望这有助于其他人。
答案 20 :(得分:-4)
如果使用负载平衡环境,则可以按照Configuring HTTPS for your AWS Elastic Beanstalk Environment的说明进行操作,最后禁用HTTP端口。
请注意,目前AWS Free Usage Tier包含Elastic Load Balancing(ELB)与EC2 Micro Instance相同的小时数。
答案 21 :(得分:-4)
这是一个简单的解决方案
编辑wsgi.conf的本地版本,并在&lt;中添加以下重定向规则。虚拟主机&GT; &LT; /虚拟主机&GT;标签
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
将“/ status”更改为您用作运行状况检查页面的任何页面。
编辑你的&lt;你的。 ebextensions 目录中的app&gt; .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'
...
部署代码。
它应该可以正常工作,并且每个部署都会正确更新文件。唯一需要注意的是,如果Amazon将来更改其基本wsgi.conf文件内容,那么您的副本可能不再有效。
Autor rickchristianson