Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redirect 将EC2弹性负载平衡器从HTTP重定向到HTTPS_Redirect_Nginx_Amazon Ec2_Https_Amazon Elb - Fatal编程技术网

Redirect 将EC2弹性负载平衡器从HTTP重定向到HTTPS

Redirect 将EC2弹性负载平衡器从HTTP重定向到HTTPS,redirect,nginx,amazon-ec2,https,amazon-elb,Redirect,Nginx,Amazon Ec2,Https,Amazon Elb,我想将所有HTTP请求重定向到上的https请求。我有两个EC2实例。我正在为服务器使用nginx。我尝试过重写nginx conf文件,但没有成功。我希望得到一些建议。ELB设置X-Forwarded-Proto头,您可以使用它来检测原始请求是否是HTTP,然后重定向到HTTPS 您可以在服务器配置中尝试此操作: if ($http_x_forwarded_proto = 'http') { return 301 https://yourdomain.com$request_uri;

我想将所有HTTP请求重定向到上的https请求。我有两个EC2实例。我正在为服务器使用nginx。我尝试过重写nginx conf文件,但没有成功。我希望得到一些建议。

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

您可以在
服务器
配置中尝试此操作:

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

看一看。

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

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

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

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

创建一个文件
。ebextensions/00\u forward\u http\u to\u 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环境变量。

亚马逊弹性负载平衡器(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的域):


...
重新启动发动机
重写cond%{HTTP:X-Forwarded-Proto}!https
重写规则^.*$https://%{SERVER_NAME}%{REQUEST_URI}
...
IIS

使用配置GUI安装IIS Url重写模块添加以下设置:

<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配置有奇怪的问题。我的设置在ELB后面的一个nginx中包含3个不同的服务。我遇到了混合内容问题:当您对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
var中使用它。 此时,您可以在所有需要的位置使用此功能:

location ~ /softwareapi/index.php {
  fastcgi_param HTTPS $switch;
  .. other settings here ..
}
通过HTTPS设置,php应用程序将自动检测正确的协议,并仔细构建相对路径,以防止混合内容问题


致以最良好的祝愿

上述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应用程序负载平衡器现在支持本机HTTP到HTTPS重定向

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

  • 转到EC2中的负载平衡器,并选项卡“侦听器”
  • 在HTTP侦听器上选择“查看/编辑规则”
  • 删除除默认规则外的所有规则(底部)
  • 编辑默认规则:选择“重定向到”作为操作,将所有内容保留为默认值,并输入“443”作为端口
  • 如上所述,通过使用CLI也可以实现同样的效果

    在Cloudformation中也可以这样做,您需要像这样设置侦听器对象:

      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的回答,如果您想使用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"
        }
      }
    }
    

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

    curl -Iv [your url]
    
    例:旋度-Iv

    要求

  • 在AWS路由53中为DNS和名称服务器设置托管区域
  • 使用AWS证书管理器获取证书
  • 在端口443的负载平衡器上添加侦听器从2中选择证书。还有SSL
  • 我所做的是

  • 重定向-->(步骤2)
  • 重定向-->(步骤2)
  • 重定向-->(步骤3)
  • 台阶

    1。转到负载平衡器

    2。转到侦听器ID HTTP:80(单击查看/编辑规则)

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

  • 更改然后阻止重定向到https://{host}:443/{path}?{query}
  • 状态代码:HTTP_301
  • 再添加一个操作(单击顶部的+签名)

  • 如果block主机是yourwebsite.com,请选择
  • 更改然后阻止重定向到https://www.#{host}:443/#{path}?#{query}
  • 状态代码:HTTP_301
  • 3。返回并进入侦听器ID HTTPS:443(单击查看/编辑规则)

    再添加一个操作(单击顶部的+签名)

  • 如果block主机是yourwebsite.com,请选择
  • 更改然后阻止重定向到https://www.#{host}:443/#{path}?#{query}
  • 状态代码:HTTP_301

  • 在何处进行此配置?@ericpeters0n答案中的代码段是针对
    nginx
    config的,但该原则适用于任何web服务器。如果您使用beanstalk和passenger standalone,请按照此链接了解如何更改nginx配置。确保您有HTTP和HTTPS侦听器
    curl -Iv [your url]