88

我似乎无法在弹性豆茎的免费使用层上强制使用 https。

我在如何在亚马逊弹性豆茎上强制 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 规则不是很熟悉。我不太确定从这里去哪里。谢谢。

4

23 回答 23

189

此答案假定您已在负载均衡器安全组中启用 https,将 SSL 证书添加到负载均衡器,负载均衡器转发端口 80 和 443,并将您的域名指向具有 Route 53 的 Elastic Beanstalk 环境(或等效的 DNS 服务)。

选项 1:使用 Apache 进行重定向

仅当您位于使用 Apache 的 Elastic Beanstalk 环境中时,这才有可能(可以将基于 AWS Linux 2 的部署配置为使用 Apache)。它可能不适用于基于 docker 的部署。

亚马逊 Linux 2

大多数基于 AWS Linux 版本 2 的平台都可以选择 Apache 作为您的代理主机。这可以通过转到“配置”>“软件”>“容器选项”并将“代理服务器”设置为“Apache”来完成,或者将以下内容添加到您的.config文件之一.ebextensions

option_settings:
  aws:elasticbeanstalk:environment:proxy:
    ProxyServer: 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>

亚马逊 Linux 1

您需要做的就是将以下内容添加到项目目录中的一个.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>

解释

这在 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 进行重定向

这仅在您使用 Application Load Balancer 时才有可能。亚马逊在此处提供了有关如何执行此操作的说明:https ://docs.aws.amazon.com/elasticbeanstalk/latest/dg/configuring-https-httpredirect.html

您需要做的就是将以下内容添加到项目目录中的一个.config文件中,.ebextensions以将 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"

我见过的糟糕的解决方案

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

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

  2. SSH 进入服务器并...:这与 Elastic Beanstalk 的观点完全相反,并且存在很多问题。通过自动缩放创建的任何新实例都不会具有修改后的配置。任何克隆的环境都没有配置。任何数量的合理环境更改都将清除配置。这真是个坏主意。

  3. 使用新文件覆盖 Apache 配置:这进入了正确的解决方案领域,但如果 Elastic Beanstalk 更改了服务器设置的各个方面(他们很可能会这样做),那么您将面临维护噩梦。另请参阅下一项中的问题。

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

于 2016-08-03T19:05:13.740 回答
16

编辑:虽然我喜欢这个答案,但它现在已经很老了。AWS 提出了新的服务(如Certificate Manager),使该答案的一部分过时了。此外,将.ebextensions文件夹与 Apache 一起使用是一种更简洁的方式来处理上述重定向。

如果您在 S3 上托管您的网站,则此答案的部分内容可能对您仍然有用。


这对我有用:

  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. 选择Secure listener port作为443。选择协议作为HTTPSCERTIFICATE_NAME步骤 2中选择SSL证书 ID。保存配置。

  4. 转到您的控制台。单击EC2 实例。单击负载均衡器。单击负载均衡器。单击实例并向下滚动以查看分配给该负载均衡器的 EC2 实例。如果 EC2 实例与您的应用程序 URL 具有相同的名称(或类似名称),请记下负载均衡器的DNS 名称。它应该是格式awseb-e-...

  5. 返回到您的控制台。单击CloudFront。单击创建分配。选择一个Web分发。

  6. 设置分布。将您的Origin Domain Name设置为您在步骤 5中找到的负载均衡器 DNS 名称。将查看器协议策略设置为将 HTTP 重定向到 HTTPS。将转发查询字符串设置为Yes。将备用域名 (CNAME)设置为您要用于应用程序的 URL。将SSL 证书设置为您在步骤 2CERTIFICATE_NAME中上传的证书。创建您的发行版。

  7. 在 CloudFront 中单击您的分配名称。单击Origins,选择您的来源,然后单击Edit。确保您的Origin Protocol PolicyMatch Viewer。回去。单击Behaviors,选择您的来源,然后单击Edit将Forward Headers更改为Whitelist并添加Host。节省。

注意: 我也写了一个更长的指南

于 2015-03-20T16:54:24.030 回答
7

使用新的应用程序负载均衡器,您现在可以相当简单地做到这一点......

确保在设置 EB 环境时设置其中之一(我相信仍然默认为经典负载均衡器)。创建环境后,您无法更改类型,因此请重新创建它

完成后,转到您的 EC2 设置 -> 负载均衡器。单击您为 EB 环境创建的负载均衡器。您必须确保在执行此任务之前已设置 HTTPS 侦听器,因此请确保您使用 SSL 证书侦听 HTTPS 443,并使用 80 上的 HTTP 将流量转发到您的实例。

然后添加一个侦听 HTTP 的新侦听器并添加默认操作“重定向到:”。确保将 HTTPS 设置为协议,将 443 设置为端口,将“原始主机、路径、查询”设置为选项,最后将 301 设置为 HTTP 响应代码。

添加此侦听器后,请确保您更新 EC2 负载均衡器安全组以接受 HTTPS 和 HTTP 连接,您将在侦听器上看到小警告标志以提醒您!

克里斯

于 2019-07-02T18:56:54.327 回答
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]

这似乎对我有用。

关于如何将此文件构建到您的 WAR 文件中,请参阅此答案

于 2016-11-18T05:37:31.990 回答
4

我正在尝试在 2018 年使用负载均衡器重定向弹性 beantalk。以上答案均不适用于我的环境。我遇到的几个问题:

  1. 我正在尝试投票最多的答案,但我的 tomcat 是 2.7 版。它不支持 .

  2. 我正在使用 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>

希望这会有所帮助。

于 2018-01-31T17:31:57.347 回答
4

编辑:Zags 解决方案更加通用和正确。我推荐它而不是我的(这是特定于 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”。

于 2016-06-23T23:50:14.407 回答
3

下一个命令对我有用:

RewriteCond %{HTTP:X-Forwarded-Port} !=443

并且没有 https 检查:

RewriteCond %{HTTP:X-Forwarded-Proto} !https

看起来 ELB 将 X-Forwarded-Proto 的值更改为 http(即使在 TCP 协议上)。

于 2015-05-11T08:22:02.480 回答
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]

现在部署您的代码它应该可以工作。

于 2017-01-09T14:50:31.770 回答
2

我很难弄清楚这一点,所以在我想出一个解决方案后,我写了一个关于我的解决方案的详细解释,希望能帮助别人。这特定于 Tomcat 8、Apache2 和 Spring Boot 应用程序。AWS 实验室 github 中有非常有用的 ebextension 示例

对我有用的总结:

  1. 在 /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf 创建一个文件
  2. 添加重写条件/规则,小心包含“LoadModule rewrite_module modules/mod_rewrite.so”
  3. 部署到 AWS EBS

这是一个示例 Spring Boot 应用程序

于 2017-02-04T00:14:04.970 回答
2

在弹性 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 中的标准配置文件夹,其余的只是指向您希望覆盖的文件和文件夹。如果文件或文件夹不存在,只需创建它们。

于 2017-03-26T07:12:07.647 回答
1

通过环境变量启用 HTTPS

我只需要对我们的生产环境强制实施 HTTPS,而不是对也在 Elastic Beanstalk 上但不使用负载均衡器(因此不能直接分配证书)的开发和暂存环境强制实施 HTTPS。

我使用环境变量USE_HTTPSssl_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

于 2018-12-07T14:44:57.947 回答
1

AWS 也有这方面的一些文档

如果您使用的是应用程序负载均衡器,请将文件添加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 等。

于 2020-10-11T09:46:45.540 回答
1

我有以下弹性 beanstalk 配置(运行 Tomcat 8 Java 8 的 64 位 Amazon Linux 2016.09 v2.3.1)。我创建了一个目录 .ebextensions 并添加了一个带有重写条件的 .config YAML 文件

上面描述的Zagas解决方案(非常复杂)对我不起作用。

  1. 因为“如果”条件未知
  2. 由于 Apache 2.2,我的 httpd.conf 文件中没有包含 mod_rewrite.so

这个解决方案对我来说更有意义,但这也不起作用。什么也没有发生,我在“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 重定向就消失了。

于 2016-12-23T20:17:33.133 回答
1

以防万一有人还在苦苦挣扎:

我挣扎了一段时间,最后,我找到了一个包含所有 AWS 配置的 GitHub(来自 AWS 团队),下面的示例适用于 Apache 2.2 的 HTTP>HTTPS 重定向。(有关 Apache 2.4 和 Nginx 的配置,请参阅下面的链接)。

阿帕奇 2.2

  1. 在应用程序的根目录中创建一个文件: YOUR_PROJECT_ROOT/.ebextensions/httpd/conf.d/elasticbeanstalk.conf (如果使用 IntelliJ/Java,请确保将其添加到最终的 .WAR 工件中)

  2. 添加以下行以在虚拟主机中启用重定向:

    <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

此外,还有更多有用的配置和示例可用。

问候

于 2018-10-04T07:49:57.807 回答
1

我从这里找到了一个很有帮助的答案。

我所做的只是创建健康检查路径/index.php,而不是/在应用程序负载均衡器默认进程中。

于 2021-01-06T17:02:44.017 回答
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']
    ]
于 2017-12-19T13:06:41.217 回答
0

要扩展此问题的另外两个答案https://stackoverflow.com/a/43026082/8775205https://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>

在此之后,请记住在 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 环境

于 2018-01-10T09:51:45.713 回答
0

为什么不简单地将 .htaccess 文件放在根文件夹中?这样您就可以简单地测试和调试它。如果您将其包含在 .zip 中,它将再次自动部署在所有实例上。

只需使用.htaccess

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
于 2017-06-24T08:50:58.147 回答
0

请注意,投票最多的答案现在有点老了。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 文件中,那么您会注意到它被完全忽略并且不会执行任何配置更改。

希望这对其他人有帮助。

于 2017-09-04T23:31:32.843 回答
0

以上所有答案在 2022 年都已过时,因为 AWS 在没有正确更新文档的情况下对 ElasticBeanstalk 进行了静默更改。

但是,使用负载均衡器时,从 AWS 控制台执行此操作变得非常简单。创建 https 侦听器(环境 -> 配置 -> 负载均衡器)后,您只需禁用 80 端口 (http) 上的侦听器。就是这样。禁用http

健康检查不再有问题,因为它们直接在实例上执行,而不是在负载均衡器上。

于 2022-01-14T18:16:32.003 回答
0

AWS 不接受 headers 中的 unsercores (_),而我们可以使用 (-),因此从 header 变量中删除下划线,例如:- header_var_val = "some value"将其替换为headervarval = "some value"。这个对我有用。

于 2018-07-23T14:25:15.850 回答
-4
于 2014-02-20T02:43:10.590 回答
-4

如果您使用负载平衡环境,则可以按照为您的 AWS Elastic Beanstalk 环境配置 HTTPS的说明进行操作,最后禁用 HTTP 端口。

请注意,目前AWS 免费使用套餐包含的 Elastic Load Balancing (ELB) 小时数与 EC2 微实例的小时数相同。

于 2013-10-11T15:33:39.553 回答