当前位置: 首页 > 知识库问答 >
问题:

如何在弹性豆茎上强制使用https?

羿易安
2023-03-14

我似乎不能强迫https在弹性Beanstalk的自由使用层上。

关于如何在amazon elastic 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重写规则似乎不会拾取弹性负载均衡器报头X-Forwarded-Port和X-Forwarded-Proto,但重定向循环也不是我想要的。

请帮帮忙。我是AWS、弹性豆茎的新手,对Apache规则不是很熟悉。我不太确定从这里到哪里去。多谢了。

共有1个答案

唐信瑞
2023-03-14

这个答案假设您已经在负载均衡器安全组中启用了https,向负载均衡器添加了SSL证书,负载均衡器转发了80和443端口,并且将您的域名指向Route 53(或等效的DNS服务)的弹性Beanstalk环境。

这只有在使用Apache的弹性Beanstalk环境中才有可能。它可能不适用于基于Docker的部署。

大多数基于AWS Linux版本2的平台都可以选择Apache作为代理主机。这可以通过转到“Configuration”>“Software”>“Container Options”并将“Proxy Server”设置为“Apache”来完成。

完成这些操作后,将一个名为.platform/httpd/conf.d/ssl_rewrite.conf的配置文件添加到代码库(相关的AWS文档)中,其中包含以下内容:

RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
</If>

您只需将以下内容添加到项目的.ebextensions目录中的.config文件中:

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>

这是在弹性豆茎外面适度向前的。通常会添加如下所示的Apache重写规则:

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

或者,如果在负载均衡器后面,就像我们在本例中所做的那样:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

但是,这些配置仅在 块内工作。将rewritecond更改为 块允许它在 块之外正常工作,从而允许我们将其放入一个独立的Apache配置文件中。请注意,CentOS上的标准Apache设置(包括ElasticBeanstalk上的设置)包含所有与/etc/httpd/conf.d/*.conf相匹配的文件,该文件与我们存储该文件的文件路径相匹配。

条件的-n“%{http:x-forwarded-proto}”部分阻止它重定向(如果您不在负载均衡器之后),从而允许您在具有负载均衡器和https的生产环境与单实例且不具有https的临时环境之间共享配置。如果您在所有环境中都使用负载均衡器和https,那么这并不是必需的,但拥有它也无妨。

这只有在使用应用程序负载均衡器时才可能。Amazon在这里提供了如何实现的说明:https://docs.aws.Amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html

您只需将以下内容添加到项目的.ebextensions目录中的.config文件中,以使用重定向替换http侦听器:

Resources:
 AWSEBV2LoadBalancerListener:
  Type: AWS::ElasticLoadBalancingV2::Listener
  Properties:
    LoadBalancerArn:
      Ref: AWSEBV2LoadBalancer
    Port: 80
    Protocol: HTTP
    DefaultActhtml" target="_blank">ions:
      - Type: redirect
        RedirectConfig:
          Host: "#{host}"
          Path: "/#{path}"
          Port: "443"
          Protocol: "HTTPS"
          Query: "#{query}"
          StatusCode: "HTTP_301"

我已经看到了很多解决这个问题的糟糕方案,值得通过它们来理解为什么这个解决方案是必要的。

>

  • 使用Cloudfront:有些人建议在弹性Beanstalk前面使用非缓存的Cloudfront设置来执行HTTP到HTTPS的重定向。这增加了一个完全不合适的新服务(因此增加了复杂性)(Cloudfront是一个CDN;它不是在固有的动态内容上强制使用HTTPS的正确工具)。Apache config是这个问题的正常解决方案,而Elastic Beanstalk使用Apache,所以我们应该这样做。

    SSH进入服务器和...:这和弹性豆茎的点完全对立,有那么多问题。通过自动缩放创建的任何新实例都不会具有修改的配置。任何克隆的环境都不会具有该配置。任何数量的合理的环境变化都将消除配置。这真是个坏主意。

    用一个新文件覆盖Apache配置:这进入了解决方案的正确领域,但如果弹性Beanstalk更改了服务器设置的各个方面(它们很可能会这样做),则会给您带来维护噩梦。另请参阅下一项中的问题。

    动态编辑Apache配置文件以添加几行:这是一个不错的想法。这样做的问题是,如果弹性Beanstalk更改了默认Apache配置文件的名称,它将无法工作,而且该文件可能会在您最意想不到的时候被覆盖:https://forums.aws.amazon.com/thread.jspa?threadid=163369

  •  类似资料:
    • 假设我在Wordpress中创建了一个站点,它运行在Elastic Beanstalk上。现在,在运行的应用程序上,我将创建帖子/页面,上传图像等。也就是说,数据库中的一些数据、视频、文件和记录将被添加到运行的应用程序中。 从我在AWS控制台中看到的情况来看,我可以部署一个应用程序的不同版本--但是根据上面的场景,如果我部署了一个新版本,我会不会丢失直接上传到正在运行的应用程序中的所有文件(即文件

    • 我在elastic beanstalk上使用django进行开发,我想对apache配置做两个更改: 1.将www.domain.com重定向到domain.com 2.将http://domain.com重定向到https://domain.com 有人知道如何在弹性豆茎中添加重写吗?

    • 我的设置:-我在Dockerrun.aws.json文件中指定了一个多锁应用程序。-我的应用程序的图像存储在ECR上。 在Elastic Beanstalk的AWS控制台中,我可以“上传并部署”一个新的Dockerrun.AWS。json文件。然后弹性豆茎部署该版本。 是否可以通过命令行执行相同的操作(“上传和部署”)? 我找到的最接近的东西是。但这只是使用现有的Dockerrun.aws.jso

    • 配置验证异常:AWS Elastic Beanstatk无法与Amazon EC2通信以确定是否为Elastic Load均衡创建自定义安全组。 在创建AWS Elastic Beanstalk应用程序时,我在尝试继续“查看和启动”时遇到了这个错误。我是新手。请帮忙。

    • 有人知道是否有可能将现有的AWS弹性豆茎环境更改为应用程序负载平衡器(而不是经典的负载平衡器)。 据我所知,只有应用程序ELB可以被AWS WAF和DDOS“屏蔽”保护,所以任何现有的EB应用程序都不能利用这些特性,因为他们有经典的ELB。

    • 我是AWS的新手,这个问题似乎很基本。然而,我需要看看我是否能找到解决方案。 我首先创建并启动了一个 EC2 实例,然后创建了一个弹性 Beanstalk 实例,并在该实例上部署了一个示例应用程序。默认情况下,弹性 Beanstalk 会将“默认环境”附加到此实例,我无法将其更改为我的 EC2 实例。如何将我的 EC2 实例(我之前创建的实例)附加到此弹性豆茎实例?我正在使用亚马逊免费套餐来学习。