HTTP重定向-Google负载均衡器和Windows Server上的无限循环

时间:2018-08-05 00:18:22

标签: asp.net asp.net-mvc google-cloud-platform web-config google-compute-engine

我对以下设置有疑问。

  • 服务器:Windows Server 2016
  • 服务器主机:Google Compute Engine
  • 我的实例在负载均衡器后面运行(并且SSL在负载均衡器级别附加)。

我在www.example.org上有一个网站。我希望将web.config重定向到301:

  • 非www到www
  • http://到https://

我在web.config中具有以下规则:

<input type="text" id="date">

我的问题是HTTPS规则导致无限循环。 我的理论是,这取决于负载均衡器。我正在“站点”(/服务器)级别重定向,它循环回到负载均衡器,一切都在进行“有点卡卡” :)

任何人都可以建议如何/是否可以在Google Compute Engine的负载均衡器级别上强制实施HTTPS?!

我没有足够的能力在控制台上执行操作(如果可以的话),所以任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

当前在负载均衡器级别上是不可能的。您必须在实例级别执行此操作。

您将要利用每个请求的用户代理/ X-Forwarded-Proto标头来确定是否需要执行重定向。用户代理必须确定发送方是否为运行状况检查程序(在这种情况下,不需要重定向),并且X-Forwarded-Proto标头对于确定客户端用来发出请求的协议是必需的。简化的请求流程如下所示:

Client (http or https) -> LB -> Instance (http)

对于每个实例,您都需要这样的东西(对不起,我不知道asp)来处理重定向:

server {
    listen 80;
    server_name _;

    if ($http_user_agent ~ "GoogleHC") {
        set $foo "foo";
    }

    if ($http_x_forwarded_proto != "https") {
        set $foobar "${foo}bar";
    }

    if ($foobar = "bar") {
        return 301 https://$host$request_uri;
    }

    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

上面的nginx配置文件侦听80。如果发件人是运行状况检查器,则该请求将被代理到8080(或运行Web服务器/ api的任何地方)。但是,如果用户代理不是运行状况检查器,则我们询问客户端使用哪种协议来达到负载均衡器。如果使用了http,则会将用户重定向到https,否则我们会让他们通过。

当然,这只有在其他所有设置都正确的情况下才有效(为简便起见,我假设是这样)。

我有一个脚本,该脚本可以为我的其余api拆除/创建跨区域负载均衡器。我知道您的设置会有所不同,但是希望以下脚本日志可以帮助您了解基础知识。

enter image description here