IIS URL重写强制执行尾随斜杠不使用404的资源

时间:2013-09-05 16:30:08

标签: iis url-rewriting url-rewrite-module

我正在尝试使用IIS网址重写模块对我的网址强制执行结尾斜杠,以便将 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,那么简单。或者,如果对目录的请求没有前导斜杠,我只想要它附加。

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

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

  

首先,任何想法为什么会发生这种情况以及如何防止它?

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

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

因此,当您请求不存在的文件时,规则会触发。

  

如果资源404s我只想要404,那就这么简单。

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

  

其次,为什么我们都有规则说如果它不是文件AND   如果它不是目录?

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