当您在弹性 beanstalk 负载平衡器后面时,如何使用 IIS 的 url 重写模块强制用户使用 ssl?
4 回答
由于几个原因,这比听起来更困难。一,负载均衡器负责ssl,因此从负载均衡器传递的请求永远不会使用ssl。如果您使用传统的重写规则,您将获得无限循环的重定向。另一个需要解决的问题是,如果 AWS 运行状况检查收到重定向响应,它将失败。
- 解决方案的第一步是创建一个 healthcheck.html 页面并将其设置在根目录中。内容是什么并不重要。
- 将您的负载均衡器设置为使用 healthcheck.html 文件进行健康检查。
在您的 web.config 部分中添加以下重写规则
<system.webServer><rewrite><rules>
:<rule name="Force Https" stopProcessing="true"> <match url="healthcheck.html" negate="true" /> <conditions> <add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true" /> </conditions> <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" /> </rule>
请注意,规则匹配在我们的健康检查文件之外的任何内容上。这可以确保负载均衡器的健康检查成功,并且不会错误地将我们的服务器从负载中删除。
负载均衡器在标头中传递 X-Forwarded-Proto 值,让我们知道请求是否通过 https。如果该值不是 https,我们的规则将触发并使用 https 返回永久重定向。
首先,我要感谢罗斯的原始回答,它让我建立了一个对我有用的 IIS URL 重写规则,方法是使用我在我的网站落后于 AWS Elastic Load 之前使用的现有 HTTP 到 HTTPS 重定向规则平衡器。
<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true" />
<add input="{REMOTE_HOST}" pattern="localhost" negate="true" />
<add input="{REMOTE_ADDR}" pattern="127.0.0.1" negate="true" />
<add input="{HTTP_HOST}" pattern="localhost" negate="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
</rule>
此规则允许您在 Visual Studio 中本地访问您的站点或在端口 80 上的服务器上访问您的站点,而无需通过 HTTPS 访问,因此您只需在服务器上绑定端口 80。它不会受到其他人提到的事情(重复的查询字符串等)的影响。
我个人对健康检查没有任何问题,我不需要在服务器上创建一个文件来让弹性负载均衡器 ping。我将负载均衡器设置为运行状况检查,TCP:80
并且可以正常工作。
如果您使用的是 ELB,卢克的答案非常完美,但不适用于 ALB。对于 ALB 罗斯佩斯的答案是正确的。但是您也可以将两者结合起来,这样您就可以在本地访问站点而无需重定向到 HTTPS。
<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
<match url="healthcheck.html" negate="true" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true"/>
<add input="{REMOTE_HOST}" pattern="localhost" negate="true"/>
<add input="{REMOTE_ADDR}" pattern="127.0.0.1" negate="true"/>
<add input="{HTTP_HOST}" pattern="localhost" negate="true"/>
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent"/>
</rule>
这适用于我的应用程序 - IIS 8.5,将 HTTP 重定向到 AWS ALB 后面的 HTTPS。关键是添加 appendQueryString="false" 以防止重定向时查询字符串重复。您可以根据需要添加用于运行状况检查和本地主机处理的陷阱。我不需要添加健康检查陷阱,因为我们将它添加到应用程序的 web.config 中,使其成为特定应用程序。我们的健康检查是域上的默认应用程序,因此它没有受到影响。
<system.webServer>
<rewrite>
<rules>
<rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
<match url="^(.*)$" />
<conditions>
<add input="{HTTP_X_FORWARDED_PROTO}" pattern="https" negate="true"/>
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" appendQueryString="false" redirectType="Permanent"/>
</rule>
</rules>
</rewrite>