使用 IIS URL 重写从地址中删除 www 的正确方法

Posted

技术标签:

【中文标题】使用 IIS URL 重写从地址中删除 www 的正确方法【英文标题】:Proper method to remove www from address using IIS URL Rewrite 【发布时间】:2022-03-04 19:26:54 【问题描述】:

使用 IIS URL 重写从 url 中删除 www 子域的最佳方法是什么?

【问题讨论】:

【参考方案1】:

如果您希望它与任何主机名一起使用(而不是将其硬编码到规则中),您需要执行以下操作:

<rule name="Remove www" stopProcessing="true">
  <match url="(.*)" ignoreCase="true" />
  <conditions logicalGrouping="MatchAll">
    <add input="HTTP_HOST" pattern="^www\.(.+)$" />
  </conditions>
  <action type="Redirect" url="http://C:1/R:0" appendQueryString="true" redirectType="Permanent" />
</rule>

在重定向操作中,C:1 包含条件中的第二个捕获组,而 R:0 包含规则中的任何内容(路径)。 appendQueryString="true" 还将任何查询字符串附加到重定向(如果存在)。但请记住,任何 url 哈希(如果存在)都将在此过程中丢失,因为这些哈希不会传递给服务器。

【讨论】:

我从来没有对第一个答案中的硬编码片段感到兴奋,很高兴我终于可以在这个问题上标记答案。 如果有人进入 https 怎么办?您不想只是自动将它们重定向到 http,是吗? 也许您可以将http:// 替换为//,它会按照您想要的方式工作。 @mrjedmao 不,您不能使用协议相对 url 作为基本 url。重写将重写请求,而不是标记。当浏览器在标记中看到 href="//google.com" 时,它会查看基本 url(地址栏中的那个)并使用相同的协议。请求本身将分别包含 http:// 或 https:// 。尝试在浏览器中输入 //google.com。您也可以使用 IIS Rewrite 修改标记,但这需要输出重写规则。 Mads Kristensen 有一个很好的配置示例,它也与协议无关(支持 HTTPS):madskristensen.net/post/url-rewrite-and-the-www-subdomain【参考方案2】:

IIS 会自动为您完成:

选择站点> URL重写>新规则>规范主机名:)

【讨论】:

肯定是最佳答案。【参考方案3】:

以下一个应该可以工作:

<system.webServer>
  <rewrite>
    <rules>
      <rule name="Remove WWW" stopProcessing="true">
        <match url="^(.*)$" />
        <conditions>
          <add input="HTTP_HOST" pattern="^(www\.)(.*)$" />
        </conditions>
        <action type="Redirect" url="http://www.example.comPATH_INFO" redirectType="Permanent" />
      </rule>
    </rules>
  </rewrite>
</system.webServer>

【讨论】:

你有 www 在行动吗?【参考方案4】:

要进行适用于 http 和 https 的重定向,可以使用以下内容

    <rewrite>
        <rules>
            <rule name="Lose the www" enabled="true" stopProcessing="true">
                <match url="(.*)" ignoreCase="true"/>
                <conditions logicalGrouping="MatchAll">
                    <add input="HTTP_HOST" pattern="^www\.(.*)$"/>                    
                </conditions>
                <action type="Redirect" redirectType="Permanent" url="SchemeMap:HTTPS://C:1/R:1" appendQueryString="true" />
            </rule>
        </rules>
        <rewriteMaps>
            <rewriteMap name="SchemeMap">
                <add key="on" value="https" />
                <add key="off" value="http" />
            </rewriteMap>
        </rewriteMaps>
    </rewrite>

【讨论】:

以上是关于使用 IIS URL 重写从地址中删除 www 的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp在iis下如何写规则url重写

即使使用 URL 重写,IIS 也会强制使用斜线来删除它

IIS URL 将模块 url 重写为小写

IIS重写2.0 IIS伪静态 下载地址

使用 IIS 7 重写模块重写 & 符号 URL

thinkphp5 部署到iis服务器url重写