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 - *