将EC2 elb从http重定向到https

时间:2014-07-07 05:35:19

标签: redirect nginx amazon-ec2 https amazon-elb

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

10 个答案:

答案 0 :(得分:102)

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

您可以在server conf:

中尝试此操作
if ($http_x_forwarded_proto = 'http') {
    return 301 https://yourdomain.com$request_uri;
}

看看ELB docs

答案 1 :(得分:40)

AWS应用程序负载平衡器现在支持从本地HTTP到HTTPS重定向。

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

  1. 在EC2中转到您的负载均衡器,然后选择“监听器”
  2. 在HTTP侦听器上选择“查看/编辑规则”
  3. 删除默认规则(底部)以外的所有规则
  4. 编辑默认规则:选择“重定向到”作为操作,将所有内容保留为默认值,然后输入“ 443”作为端口。

Native redirect listener rule

使用here中所述的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

如果您仍在使用经典负载均衡器,请使用其他配置中介绍的NGINX配置之一。

答案 2 :(得分:32)

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

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

server {
  listen 80;
  # regular server rules ...
}

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

答案 3 :(得分:15)

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

<强>的Apache

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

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}

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

<VirtualHost *:80>
...
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
...
</VirtualHost>

<强> 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>

了解更多here

答案 4 :(得分:4)

它可能不是您可能正在寻找的解决方案,但另一种选择可能是除了ELB之外还使用AWS CloudFront。 CloudFront提供了将所有传入HTTP流量重定向到HTTPS的选项。

答案 5 :(得分:3)

我在nginx和ELB配置方面遇到了奇怪的问题。我的设置包括在ELB后面的一个nginx中的3种不同服务。我有混合内容问题:当您对ELB的请求是https,但仅在ELB内部http,并且服务器使用http创建静态的相对路径,因此浏览器失败并且混合内容&#39;问题。 我必须为http / https工作创建解决方案,而不需要任何重定向。

这是位于nginx/conf.d/文件夹中的配置:

# Required for http/https switching
map $http_x_forwarded_port $switch {
  default   off;
  "80"    off;
  "443"   on;
}

这意味着我们将了解真正的客户端协议是什么。如您所见,我们将在$switch var中使用它。 此时您可以在需要的所有位置使用它:

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}

使用HTTPS设置php应用程序将自动检测正确的协议并仔细构建相对路径以防止混合内容问题。

祝你好运。

答案 6 :(得分:3)

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

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

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

来源:Redirecting HTTP to HTTPS with AWS and ELB

答案 7 :(得分:1)

基于@Ulli的答案如果要使用 Terraform 对其进行配置,下面是一个示例>

resource "aws_alb_listener" "web" {
  load_balancer_arn = "${aws_alb.web.arn}"

  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "redirect"

    redirect {
      port        = "443"
      protocol    = "HTTPS"
      status_code = "HTTP_301"
    }
  }
}

Source

答案 8 :(得分:0)

我刚刚完成了整个过程并使用命令测试了重定向(来自 ec2 实例 shell)

curl -Iv [your url]

例如:curl -Iv http://example.com

要求

  1. AWS Route 53
  2. 中为 DNS 和名称服务器设置托管区域
  3. 使用 AWS Certificate Manager
  4. 获取证书
  5. 在负载均衡器上为端口 443 添加侦听器,从 2. 和 SSL 中选择证书

我所做的是

  1. 重定向 http://yourwebsite.com --> https://www.yourwebsite.com(第 2 步)
  2. 重定向 http://www.yourwebsite.com --> https://www.yourwebsite.com(第 2 步)
  3. 重定向 https://yourwebsite.com --> https://www.yourwebsite.com(第 3 步)

步骤

1.转到负载均衡器

2.进入监听器 ID HTTP : 80(点击查看/编辑规则)

编辑默认操作:(点击顶部的铅笔图标)

  1. THEN 块 更改为重定向到 https://#{host}:443/#{path}?#{query}
  2. 状态代码:HTTP_301

再添加一项操作(点击顶部的 + 符号)

  1. 选择 IF 块 主机是 yourwebsite.com
  2. THEN 块 更改为重定向到 https://www.#{host}:443/#{path}?#{query}
  3. 状态代码:HTTP_301

3.返回并进入 Listener ID HTTPS : 443(点击查看/编辑规则)

再添加一个操作(点击顶部的 + 符号)

  1. 选择 IF 块 主机是 yourwebsite.com
  2. THEN 块 更改为重定向到 https://www.#{host}:443/#{path}?#{query}
  3. 状态代码:HTTP_301

答案 9 :(得分:-1)

使用以下内容创建文件.ebextensions/00_forward_http_to_https.config

files: 
  /tmp/deployment/http_redirect.sh:
    mode: "000755"
    content: |
      APP_URL=`/opt/elasticbeanstalk/bin/get-config environment --output yaml | grep -oP 'APP_URL: \K([^\s)\"](?!ttp:))+'`
      sed -ie 's@$proxy_add_x_forwarded_for;@$proxy_add_x_forwarded_for;\n        if ($http_x_forwarded_proto = 'http') { return 301 https://'"$APP_URL"'$request_uri; }@' /tmp/deployment/config/#etc#nginx#conf.d#00_elastic_beanstalk_proxy.conf

container_commands:
  http_redirect:
    command: "/tmp/deployment/http_redirect.sh"

确保事先从AWS管理控制台设置APP_URL环境变量。