首页 > 解决方案 > HTTP 重定向 - Google 负载均衡器和 Windows Server 上的无限循环

问题描述

我对以下设置有疑问。

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

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

<rewrite>
  <rules>
    <clear />
      <rule name="Force WWW" enabled="true" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTP_HOST}" negate="true" pattern="^(www\.)(.*)$" ignoreCase="true" />
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="Redirect" url="https://www.example.org/{R:0}" appendQueryString="true" redirectType="Permanent" />
    </rule>
    <rule name="Force HTTPS" enabled="true" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
        <add input="{HTTPS}" negate="true" pattern="^ON$" ignoreCase="true" />
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="Redirect" url="https://www.example.org/{R:1}" appendQueryString="true" redirectType="Permanent"  />
    </rule>
  </rules>
</rewrite>

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

谁能建议如何/是否可以在 Google Compute Engine 上的负载均衡器级别强制执行 HTTPS?!

我在控制台中执行事情的能力并不出色(如果这是要走的路),所以任何帮助都将不胜感激。

标签: asp.netasp.net-mvcgoogle-cloud-platformweb-configgoogle-compute-engine

解决方案


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

您需要利用每个请求的用户代理/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,否则我们让他们通过。

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

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

在此处输入图像描述


推荐阅读