IIS URL 重写多租户强制 HTTPS www 到非 www
IIS URL Rewrite Multi-tenancy enforce HTTPS www to non www
TLDR: 我只需要一个条件:
https://www.example.com -> https://example.com
我重写了强制 HTTPS 的规则。我还需要将 www 强制转换为非 www(或者弄清楚是否有办法更改绑定以使 https://www 也有效)。当 IIS 启动时,我正在使用服务器名称指示 (SNI) 为多个域动态安装多个 SSL 并将其绑定到站点。因此,我不知道 URL 会是什么。我相信我已经想出如何使用条件回调来捕获权限部分 {example.com} 并删除 www.
但是,如果用户键入 https://www.example.com, I can't get that to match. Using the pattern matching tool in the IIS url rewrite module on the server, the https://www.example.com 模式似乎匹配,但实际上并没有触发浏览器中的规则。浏览器中关于 https 的某些东西正在丢弃它?还是我的绑定?
<rewrite>
<rules>
<rule name="Rewrite http www to https">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" matchType="Pattern" pattern="www" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^(www\.)(.*)$" />
</conditions>
<action type="Redirect" url="https://{C:2}/{R:1}" appendQueryString="true" redirectType="Found" />
</rule>
<!-- This rule is not working. It never seems to match. -->
<rule name="Rewrite https www to https">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" matchType="Pattern" pattern="www" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^(https://)(www\.)(.*)$" />
</conditions>
<action type="Redirect" url="https://{C:3}/{R:1}" appendQueryString="true" redirectType="Found" />
</rule>
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Found" />
</rule>
</rules>
</rewrite>
所以,回顾一下,目前的规则是这样的:
http://example.com -> https://example.com(好)
https://example.com -> https://example.com(好)
http://www.example.com -> https://example.com(好)
https://www.example.com -> https://www.example.com !!! (should be https://example.com)
我目前的绑定是:
类型-主机名-端口-ip地址
http - 空白 - 80 - 10.0.0.53
https - example.com - 443 - *
https - example2.com - 443 - *
我的回答是你不应该使用 url 重写来获取 https 和 www。
我将 [RequireHttps]
放在应该使用 https 的控制器 类 上(或者方法,如果您在该控制器中有应该响应纯 http 请求的方法)。
这样做将解决非 www 和 www 与 http 和 https 的问题。
那么关于您只想使用 www 的附加评论,我通常只是使用 CNAME 和 DNS 提供商的 A 记录进行设置,但这是另一个问题。
答案最终非常简单...我在 post 末尾的绑定必须更改。
类型-主机名-端口-ip地址
http - blank - 80 - 10.0.0.53
https - example.com - 443 - *
https - example2.com - 443 - *
https - www.example.com - 443 - *
https - www.example2.com - 443 - *
TLDR: 我只需要一个条件: https://www.example.com -> https://example.com
我重写了强制 HTTPS 的规则。我还需要将 www 强制转换为非 www(或者弄清楚是否有办法更改绑定以使 https://www 也有效)。当 IIS 启动时,我正在使用服务器名称指示 (SNI) 为多个域动态安装多个 SSL 并将其绑定到站点。因此,我不知道 URL 会是什么。我相信我已经想出如何使用条件回调来捕获权限部分 {example.com} 并删除 www.
但是,如果用户键入 https://www.example.com, I can't get that to match. Using the pattern matching tool in the IIS url rewrite module on the server, the https://www.example.com 模式似乎匹配,但实际上并没有触发浏览器中的规则。浏览器中关于 https 的某些东西正在丢弃它?还是我的绑定?
<rewrite>
<rules>
<rule name="Rewrite http www to https">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" matchType="Pattern" pattern="www" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^(www\.)(.*)$" />
</conditions>
<action type="Redirect" url="https://{C:2}/{R:1}" appendQueryString="true" redirectType="Found" />
</rule>
<!-- This rule is not working. It never seems to match. -->
<rule name="Rewrite https www to https">
<match url="(.*)" ignoreCase="true" />
<conditions logicalGrouping="MatchAll">
<add input="{HTTP_HOST}" matchType="Pattern" pattern="www" />
<add input="{HTTP_HOST}" matchType="Pattern" pattern="^(https://)(www\.)(.*)$" />
</conditions>
<action type="Redirect" url="https://{C:3}/{R:1}" appendQueryString="true" redirectType="Found" />
</rule>
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="true" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Found" />
</rule>
</rules>
</rewrite>
所以,回顾一下,目前的规则是这样的:
http://example.com -> https://example.com(好)
https://example.com -> https://example.com(好)
http://www.example.com -> https://example.com(好)
https://www.example.com -> https://www.example.com !!! (should be https://example.com)
我目前的绑定是:
类型-主机名-端口-ip地址
http - 空白 - 80 - 10.0.0.53
https - example.com - 443 - *
https - example2.com - 443 - *
我的回答是你不应该使用 url 重写来获取 https 和 www。
我将 [RequireHttps]
放在应该使用 https 的控制器 类 上(或者方法,如果您在该控制器中有应该响应纯 http 请求的方法)。
这样做将解决非 www 和 www 与 http 和 https 的问题。
那么关于您只想使用 www 的附加评论,我通常只是使用 CNAME 和 DNS 提供商的 A 记录进行设置,但这是另一个问题。
答案最终非常简单...我在 post 末尾的绑定必须更改。
类型-主机名-端口-ip地址
http - blank - 80 - 10.0.0.53
https - example.com - 443 - *
https - example2.com - 443 - *
https - www.example.com - 443 - *
https - www.example2.com - 443 - *