将EC2 elb从http重定向到https

Ami*_*eka 95 https redirect nginx amazon-ec2 amazon-elb

我想将所有http请求重定向到elb上的https请求.我有2个ec2实例.我正在使用nginx作为服务器.我试过重写nginx conf文件没有任何成功.我会喜欢它的一些建议.

Dmi*_*hin 105

ELB设置X-Forwarded-Proto标头,您可以使用它来检测原始请求是否是HTTP,然后重定向到HTTPS.

你可以在你的serverconf中尝试这个:

if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)

看看ELB文档.

  • 关于完全相同主题的另一篇有用的文章(有关apache和IIS的说明):http://www.emind.co/how-to/how-to-force-https-behind-aws-elb (3认同)
  • 人们在哪里做这个配置? (3认同)
  • 确保负载均衡器上有HTTP和HTTPS侦听器. (3认同)
  • @ ericpeters0n答案中的片段是针对`nginx`配置的,但该原则适用于任何Web服务器. (2认同)

Ull*_*lli 66

AWS Application Load Balancers现在支持本机HTTP到HTTPS重定向.

要在控制台中启用此功能,请执行以下操作:

  1. 转到EC2中的Load Balancer并选择"Listeners"选项卡
  2. 在HTTP侦听器上选择"查看/编辑规则"
  3. 删除除默认规则以外的所有规则(底部)
  4. 编辑默认规则:选择"重定向到"作为操作,将所有内容保留为默认值并输入"443"作为端口.

本机重定向侦听器规则

使用此处描述的CLI可以实现相同的目的.

也可以在Cloudformation中执行此操作,您需要在其中设置一个Listener对象,如下所示:

  HttpListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      LoadBalancerArn: !Ref LoadBalancer
      Port: 80
      Protocol: HTTP
      DefaultActions:
      - Type: redirect 
        RedirectConfig:
          Protocol: HTTPS
          StatusCode: HTTP_301
          Port: 443
Run Code Online (Sandbox Code Playgroud)

如果您仍然使用经典负载均衡器,请使用其他人描述的NGINX配置之一.

  • @florian 您似乎在使用 Classic Load Balancer。切换到 Application Load Balancer 以获取该选项 (2认同)

Tyl*_*ler 33

我有同样的问题,在我的情况下,HTTPS完全由ELB处理,我提前不知道我的源域,所以我最终做了类似的事情:

server {
  listen 81;
  return 301 https://$host$request_uri;
}

server {
  listen 80;
  # regular server rules ...
}
Run Code Online (Sandbox Code Playgroud)

然后当然将ELB'https'指向实例端口80,然后指向实例端口81的'http'路由.

  • 这是天才. (3认同)
  • @CodyBugstein这是nginx配置,如果你有一个 (2认同)

Ima*_*ghi 16

Amazon Elastic Load Balancer(ELB)支持名为X-FORWARDED-PROTO的HTTP标头.通过ELB的所有HTTPS请求都将使X-FORWARDED-PROTO的值等于"HTTPS".对于HTTP请求,您可以通过添加以下简单重写规则来强制HTTPS.对我来说它工作正常!

阿帕奇

您可以在.htaccess文件中添加以下行:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用vhost.conf管理同一EC2 Web服务器中的多个域,则可以将以下内容添加到vhost.conf(将其添加到要为其使用https的域):

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

IIS

安装IIS Url-Rewrite模块,使用配置GUI添加以下设置:

<rewrite xdt:Transform="Insert">
<rules>
<rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
</conditions>
<action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
</rule>
</rules>
</rewrite>
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多


omi*_*kes 5

上面的 htaccess 解决方案导致 ELB 健康检查失败。我在寻找解决方案时遇到了一些麻烦,直到我在网上发现一篇文章,其中有人遇到了与我相同的问题。他的解决方案是将其添加到 htaccess 文件的开头:

RewriteEngine on 
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Run Code Online (Sandbox Code Playgroud)

要在通过 ELB 将外部请求重定向到 HTTPS 的同时允许通过 HTTP 进行此请求和其他本地请求,请调整重写条件以匹配 http 而不是 https 上的否定匹配。

资料来源:使用 AWS 和 ELB 将 HTTP 重定向到 HTTPS