IIS URL重写多租户强制HTTPS www到非www

时间:2015-06-24 19:22:38

标签: iis binding https url-rewriting web-config

TLDR:我只需要这个条件: https://www.example.com - > https://example.com

我重写了强制HTTPS的规则。我还需要强制www到非www(或者弄清楚是否有办法改变绑定,以便https://www也有效)。我在IIS启动时使用服务器名称指示(SNI)动态安装并将多个域的多个SSL绑定到站点。因此,我不知道URL将是什么。我相信我已经弄清楚如何使用条件回调来捕获权限部分{example.com}并删除www。

但是,如果用户输入https://www.example.com,我就无法匹配。使用服务器上的IIS url重写模块中的模式匹配工具,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 - &gt; https://example.com(好)

https://example.com - &gt; https://example.com(好)

http://www.example.com - &gt; https://example.com(好)

https://www.example.com - &gt; https://www.example.com !!! (应为https://example.com

目前我的绑定:
 类型 - 主机名 - 端口 - IP地址
 http - 空白 - 80 - 10.0.0.53
 https - example.com - 443 - *
 https - example2.com - 443 - *

2 个答案:

答案 0 :(得分:1)

我的回答是你不应该使用网址重写来获取https和www。

我将[RequireHttps]放在应该使用https的控制器类上(或者如果你在该控制器中有应该响应普通http请求的方法的方法)。

这样做可以解决非www和www与http和https的问题。

然后,至于您只想使用www的附加评论,我通常只使用DNS提供商设置CNAME和A记录,但这是另一个问题。

答案 1 :(得分:1)

答案结果非常简单......我在帖子末尾的绑定必须改变。

类型 - 主机名 - 端口 - 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 - *