仅当没有文件、子目录或查询字符串时才重写 IIS 7 URL

仅当没有文件、子目录或查询字符串时才重写 IIS 7 URL

(我已经发布StackOverflow 上的这个问题因为搜索答案会显示 StackOverflow 上的相关问题,这些问题得到了答案和许多赞成票。但我的问题到目前为止只获得了反对票和“离题”关闭票,所以我试着在这里提问,在哪里它可能被认为更切题。)

我想进行 URL 重写(或重定向,如有必要,例如在这个回答的问题中), 但我希望它在请求的 URL 仅仅是站点根目录(没有文件或子目录,也没有查询字符串)时才重写/重定向。

即我只想要以下请求网站重写/重定向至TheSite.net/home.htm,但要求TheSite.net/FAQ.htm或者TheSite.net/sub或者TheSite.net/?parameter=yep不被重写/重定向。

我已经获得了重写和重定向的工作,例如:

<system.webServer>
    <rewrite>
      <rules>
        <clear />
        <rule name="Rewrite home page to Home.htm" stopProcessing="true">
          <match url="^" />
          <action type="Rewrite" url="/Home.htm" />
        </rule>
      </rules>
    </rewrite>
</system.webServer>

我也尝试过<match url="^$" /><match url="TheSite.net" />,但它们自然也会重写 TheSite.net/?parameter=yep,而我需要它不这样做。也许如果有另一个属性<match>可以让我匹配空查询字符串,但如果有查询字符串则不行(或者如果斜杠后有任何内容则不匹配)?

我希望有一条合适的规则可以实现我想要的功能,但是我的 RegEx 语法技能无法胜任这项任务,而且我还没有找到足够接近的示例。

在这个网站上,我看到IIS URL 重写模块查询字符串参数看起来它可能是可以工作的东西,但我想要的却相反——仅当 URL 中的域名后没有查询字符串或其他内容时才重写。

答案1

好的,在对奇怪情况进行完整测试后,我似乎通过玩条件找到了解决方案,即:

<rule name="Rewrite home page to Home.htm" stopProcessing="true">
  <match url="^$" />
  <conditions>
    <add input="{QUERY_STRING}" pattern=".+=(.+)" negate="true" />
  </conditions>
  <action type="Rewrite" url="/Home.htm" />
</rule>

相关内容