asp.net - HTTP 重定向 - Google 负载均衡器和 Windows Server 上的无限循环
问题描述
我对以下设置有疑问。
- 服务器:Windows Server 2016
- 服务器主机:谷歌计算引擎
- 我的实例在负载均衡器后面运行(并且 SSL 附加在负载均衡器级别)。
我在 www.example.org 上有一个网站。我希望 web.config 到 301 重定向:
- 非 www 到 www
- http:// 到 https://
我在 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?!
我在控制台中执行事情的能力并不出色(如果这是要走的路),所以任何帮助都将不胜感激。
解决方案
目前在负载均衡器级别是不可能的。您必须在实例级别执行此操作。
您需要利用每个请求的用户代理/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 拆除/创建一个跨区域负载均衡器。我知道您的设置会有所不同,但希望以下脚本日志可以帮助您了解基础。
推荐阅读
- c# - 拒绝访问 SD 卡 - UWP
- r - R Markdown:在文件夹A中创建PDF并将PDF保存在另一个文件夹B中
- google-play - 如何在 Google Play 商店中访问第二语言
- javascript - 如何反转带有数字的字符串,但不反转 1 和 0?
- http - 如何使用 TIdHttp GET 请求发送内容?
- c# - Task.Run 阻止主窗口的全局消息框
- xamarin.forms - 如何使用 xamarin 表单删除文件
- c# - 尝试部署或签署 APK 的空异常
- php - 如何在drupal目录中添加php文件的自定义文件夹?
- asp.net-mvc - Asp.net MVC Azure 云角色 - 预编译