我正在尝试使用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>
使用上述规则会发生以下情况:
首先,任何想法为什么会发生这种情况以及如何防止它?如果资源404s我只想要404,那么简单。或者,如果对目录的请求没有前导斜杠,我只想要它附加。
其次,为什么我们都有这样的规则:如果它不是文件而如果它不是目录?当然,我们应该说,如果它不是一个文件,是否是一个目录(或者我误解了什么?)。
感谢任何帮助。
答案 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
视为路线。目录也一样。