IIS URL 重写规则 - 排除所有文件和特定路径

IIS URL Rewriting rule - exclude ALL files and a specific path

我想创建一个 URL 重写规则,在没有 URL 的 / 上添加 / 例如:

www.domain.com/news/latest 将被重定向到 www.domain.com/news/latest/

下面的规则正是这样做的,但我遇到的问题有两个:

  1. 此重写规则正在应用于图像文件等内容。 因此,例如 domain.com/globalassets/icons/image.svg 更改为 domain.com/globalassets/icons/image.svg/ 导致 404 它不会发生在 CSS 文件中,这很奇怪,也许是因为我在 MVC 中使用 RegisterBundles 方法添加它们?

  2. 这是一个使用 CMS (episerver) 的 ASP.NET 基于 MVC 的网站,所以我想忽略管理区域中的任何重定向,所以我添加了第二条规则,但它再次这样做CSS 和打破管理区域的图像。

这就是我目前所知道的,任何人都可以帮助我使这条规则正常工作吗?

<rewrite>
    <rules>

      <rule name="Exclude Slash Episerver " stopProcessing="true">
        <match url="^episerver/" />
        <action type="None" />
      </rule>

      <rule name="Add trailing slash" stopProcessing="true">
        <match url="(.*[^/])$" />
        <conditions>
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
        </conditions>
        <action type="Redirect" redirectType="Permanent" url="{R:1}/" />
      </rule>

    </rules>
</rewrite>

IIS 的常见 SEO 重写规则是 documented here

特别是,使用 尾部斜杠 规则时,您缺少 logicalGrouping="MatchAll" attribute:

Conditions are defined within a <conditions> collection of a rewrite rule. This collection has an attribute called logicalGrouping that controls how conditions are evaluated. If a rule has conditions, then the rule action is performed only if rule pattern is matched and:

  • All conditions were evaluated as true, provided that logicalGrouping="MatchAll" was used.
  • At least one of the conditions was evaluated as true, provided that logicalGrouping="MatchAny" was used.

如果没有此设置,它会在您的文件名中添加一个尾部斜线,因为当您的否定规则 any 匹配而不是 all[= 时它匹配其中 31=]。


上面 link 的整个 尾部斜线 规则是:

<rule name="Trailing Slash" stopProcessing="true"> 
    <match url="(.*[^/])$" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
        <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
        <add input="{URL}" pattern="WebResource.axd" negate="true" /> 
    </conditions> 
    <action type="Redirect" url="{R:1}/" /> 
</rule>