1

我正在尝试让 IIS URL Rewrite 模块在我的 URL 上强制使用尾部正斜杠,以便将对 mysite.com/bla 的请求转换mysite.com/bla/

我正在使用如下所示的规则,这是 IIS URL 重写向导为这种情况设置的规则,并且一切正常,但前提是文件存在。一旦我们遇到 404 情况,请求的末尾就会附加一个正斜杠。

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

使用上述规则会发生以下情况:

  • www.mysite.com/bla - 重定向到 www.mysite.com/bla/(正是我想要的)
  • www.mysite.com/bla/ - 保持原样(正是我想要的)
  • www.mysite.com/bla/myimg.jpg - 保持原样,提供 myimg.jpg 存在
  • www.mysite.com/bla/myimg.jpg - 如果 myimg.jpg 不存在,则重定向到 www.mysite.com/bla/myimg.jpg/

首先,知道为什么会发生这种情况以及如何防止它吗?如果一个资源 404s 我只想要它到 404,就这么简单。或者,如果对目录的请求没有尾部正斜杠,我只希望它附加。

其次,为什么我们既有规则说如果它不是文件如果它不是目录?当然,我们应该说它是否不是一个文件,如果它是一个目录(或者我误解了什么?)。

任何帮助表示赞赏。

4

1 回答 1

0

首先,知道为什么会发生这种情况以及如何防止它吗?

发生这种情况是因为在条件下,如果请求的路径是现有文件或文件夹,则不会触发规则:

<conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>

所以当你请求一个不存在的文件时,规则就会触发。

如果一个资源 404s 我只想要它到 404,就这么简单。

rewrite 模块首先尝试重定向您的路径,因为它不考虑您请求文件或文件夹的请求,因此它会尝试到达路由。该路线不存在,因此您最终会得到 404。

其次,为什么我们既有规则说它不是文件又不是目录?

因为如果您请求www.mysite.com/bla/myimg.jpg,您可能希望显示bla/myimg.jpg而不是将bla/myimg.jpg其视为路线。目录也是如此。

于 2013-09-06T19:12:11.633 回答