即使使用 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 中使用别名,请求也会路由到服务器名称