即使使用 URL 重写,IIS 也会强制使用斜线来删除它

Posted

技术标签:

【中文标题】即使使用 URL 重写,IIS 也会强制使用斜线来删除它【英文标题】:IIS Forces Slash even with URL Rewrite to remove it 【发布时间】:2013-01-26 19:52:45 【问题描述】:

我无法删除我网站的 URL 的尾部斜杠,即使 URL 重写来自:http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/。

真令人沮丧,因为它应该如此简单,但我的尝试没有产生任何结果。

我什至创建了一个测试目录并添加了名为 desktops.aspx 的文件和名为 desktops 的子文件夹。

没有子目录“/test/desktops”加载正常,因为我将默认文档设置为查看desktops.aspx。

创建了一个子文件夹并仍然引用“/test/desktops”,它会强制使用斜线并查看子目录。

为什么 IIS 会这样做,因为它应该首先查找文件然后子目录正确?服务器端是否有任何设置可以强制反斜杠?

网址重写片段:

<rule name="SEO - Remove trailing slash" stopProcessing="false">
<match url="(.+)/$" />
<conditions logicalGrouping="MatchAll" trackAllCaptures="false">
<add input="HTTP_METHOD" pattern="GET" />
<add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
<add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="_R:1" />
</rule>

欢迎任何帮助

【问题讨论】:

【参考方案1】:

您正在使用Rewrite 类型的操作,但您需要Redirect

将您的配置更改为:

<rule name="SEO - Remove trailing slash" stopProcessing="false">
  <match url="(.*)/$" />
  <conditions>
    <add input="REQUEST_FILENAME" matchType="IsDirectory" negate="true" />
    <add input="REQUEST_FILENAME" matchType="IsFile" negate="true" />
  </conditions>
  <action type="Redirect" url="R:1" />
</rule>

您还需要将url="(.+)/$" 更改为url="(.*)/$"

提示:

测试模式的最佳方法是使用 IIS 测试模式工具。 在您网站的根目录 -> URL 重写 -> 创建空白规则 -> 点击测试模式:

【讨论】:

有道理。谢谢!实际上,我一直在尝试使用所有其他规则进行重定向,但忘记在这个规则上检查它。无论如何,我按照你的指示更新了规则,但我仍然被重定向到斜线。这是目前唯一使用的规则。 /test/desktops 重定向到 /test/desktops/ 我犯了一个错误,您应该使用(.*)/$ 作为模式(请参阅我更新的答案)。我应该听从自己的建议... :) 呵呵。明白了。我更新但仍然无法正常工作。斜线被强制重新打开。 您是否尝试过清理浏览器的缓存?默认情况下,重定向是永久性的,网络浏览器通常会缓存此信息 (w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.2)。 谢谢奶酪。我不知道它需要是虚拟目录而不是物理路径! DOH!【参考方案2】:

我遇到了同样的问题,这是我发现的。

我的意图是在 MVC 网站上使用此规则,但我不想在生产中进行测试,因此我在一个已经设置好的网站上测试了该规则,该网站恰好是 web 表单 asp.net。

我遇到了和你一样的问题。即使有规则,导航到 www.example.com/test 也会重定向到 www.example.com/test/。

所以我注意到了检查请求的 url 是文件还是目录的条件,我删除了它们。

现在将 www.example.com/test/ 重定向到 www.example.com/test。耶!不会。IIS 自动将另一个重定向添加回 www.example.com/test/ 导致重定向循环。嘘。

然后我发现这篇文章 https://support.microsoft.com/en-us/kb/298408 与 IIS 6 相关,但显然仍然是一个问题。

所以因为我在一个 asp.net Web 表单站点中,在我的例子中 /test 是一个物理目录,并且 IIS 中有一些东西会强制目录的尾部斜杠。很抱歉,但我找不到轻松关闭它的方法。

但是!我的要求是 MVC 和配置的不是目录的路由。因此,我在 MVC 网站上再次尝试了它,并且删除尾部斜杠的重定向效果很好。

我最终得出的规则是:

<rule name="RemoveDatSlash" 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>

希望这会有所帮助!

【讨论】:

【参考方案3】:

我遇到的问题是指向带有尾部正斜杠的 PDF 文件的链接,所以在运行 IIS 6.1 的 Windows Server 2008 R2 中对我有用的是:

单击需要规则的网站并在Features 视图中打开URL Rewrite,然后在Actions 部分(右窗格)选择Add Rule(s) 并选择Append or Remove the trailing slash symbol。在下一个窗口的下拉菜单中选择remove if exists

希望这会有所帮助。

【讨论】:

以上是关于即使使用 URL 重写,IIS 也会强制使用斜线来删除它的主要内容,如果未能解决你的问题,请参考以下文章

如何配置重写规则,即使在 URL 中使用别名,请求也会路由到服务器名称

IIS 7 规范 URL 重定向

IIS7 URL 重写 - 添加“www”前缀

如何使用 IIS URL 重写排除目录?

从 Apache (.htaccess) 到 IIS 问题的 URL 重写

无法使用 URL 重写出站规则更改 IIS 响应代码