Redirecting EC2 Elastic Load Balancer from HTTP to HTTPS

I want to redirect all the HTTP request to https request on ELB. I have two EC2 instances. I am using nginx for the server. I have tried a rewriting the nginx conf files without any success. I would love some advice on it.

99603 次浏览

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

你可以在你的 server会议上试试这个:

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

看看 ELB 文件

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

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


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

And then of course pointing the ELB 'https' to the instance port 80 and then the 'http' route to the instance port 81.

创建一个包含以下内容的文件 .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 环境变量。

Amazon 弹性负载均衡器(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}

Or if you use vhost.conf for managing multiple domains in same EC2 web server then you can add following to the vhost.conf (add it to the domain you want to use https for it):

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

阅读更多 给你

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

我在 nginx 和 ELB 配置方面遇到了奇怪的问题。我的设置包括3个不同的服务在一个 nginx 后面的 ELB。而且我有混合内容的问题: 当你的请求 ELB 是 https,但内部 ELB http 只,和服务器创建相对路径静态使用 http,所以浏览器失败的“混合内容”的问题。 我必须为这两个 http/https 工作创建没有任何重定向的解决方案。

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

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

这意味着我们将知道什么是真正的客户端协议。如您所见,我们将在 $switch变量中使用它。 And at this moment you use this in all location where you need it:

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

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

Best regards.

上面的 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 上进行负匹配。

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

AWS 应用程序负载均衡器现在支持本机 HTTP 到 HTTPS 的重定向。

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

  1. Go to your Load Balancer in EC2 and tab "Listeners"
  2. 在 HTTP 侦听器上选择“查看/编辑规则”
  3. 删除所有规则,除了默认规则(底部)
  4. 编辑默认规则: 选择“ Redirect to”作为操作,将所有内容保留为默认,并输入“443”作为端口。

Native redirect listener rule

通过使用所述 给你的 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 配置之一。

基于@Ulli 的回答如果您想使用 地形改造配置它,这里有一个示例 >

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"
}
}
}

来源

I just went through the process and tested redirects (from ec2 instance shell) with command

curl -Iv [your url]

例如: 卷曲静脉 http://example.com

Requirement

  1. 在 < strong > AWS Route 53中为 DNS 和 Name server 设置 Hosted zone

  2. 使用 < strong > AWS 证书管理器获得证书

  3. 在端口443的负载平衡器上添加侦听器,从2中选择证书,然后使用 SSL

    • 弹性豆茎—— > 单击环境—— > 配置—— > 查找负载均衡器,然后单击编辑—— > 添加侦听器; 使用2016-08年的 SSL 策略(其他人可能会出错)

我所做的是:

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

Steps

1. Went to EC2 Load Balancer

进入监听器 ID HTTP: 80 (单击 Rules 列下的 View/edit Rules)

编辑默认操作: (点击上面的铅笔图标,使用“切换到完整的网址”,它将是灰色的,直到你输入 #{port})

  1. THEN block改为重定向到 https://#{host}:443/#{path}?#{query}
  2. 状态码: HTTP _ 301

再加一个动作 (点击 + 在顶部签名)

  1. 选择 IF 块主机头是 yourwebsite.com
  2. change 然后封锁 to Redirect to https://www.#{host}:443/#{path}?#{query}
  3. Status code:HTTP_301

enter image description here

返回并进入监听器 ID HTTPS: 443 (单击 View/edit rules)

再加一个动作 (点击 + 在顶部签名)

  1. 选择 IF 块主机头是 yourwebsite.com
  2. 然后封锁改为重定向到 https://www.#{host}:443/#{path}?#{query}
  3. 状态码: HTTP _ 301

不要编辑 HTTPS 上的默认操作

enter image description here

Here you go with exact answer : 创建具有以下名称的文件,并在其中放入以下内容。

重定向到 https. json

[
{
"Type": "redirect",
"RedirectConfig": {
"Protocol": "HTTPS",
"Port": "443",
"Host": "#{host}",
"Path": "/#{path}",
"Query": "#{query}",
"StatusCode": "HTTP_301"
}
}
]

使用 awscli 命令在端口80上创建一个带有 HTTP 协议的侦听器规则,该协议将把所有流量重定向到 HTTPS 端口。

aws elbv2 create-listener --load-balancer-arn Arn: aws: elasticloadBalance: us-east-1:12345678910: loadbalancer/app/demo1-alb/b4d5fbc78965417f —— port 80—— protocol HTTP —— default-actions file://redirect-to-https. json