IIS强制添加斜杠,即使使用URL重写来删除它

9
我无法去掉网站URL的尾部斜杠,即使使用了http://ruslany.net/2009/04/10-url-rewriting-tips-and-tricks/中的URL重写方法。这真是令人沮丧,因为它应该很简单,但我的尝试并没有产生任何结果。我甚至创建了一个测试目录,并添加了名为desktops.aspx的文件和一个名为desktops的子文件夹。如果没有子目录,则"/test/desktops"可以正常加载,因为我将默认文档设置为查看desktops.aspx。而创建了子文件夹并仍然引用"/test/desktops",它会强制加上斜杠并查看子目录。为什么IIS会这样做,因为它应该先查找文件,然后再查找子目录,对吗?服务器端是否有任何设置可以强制删除斜杠?URL Rewrite代码段:
<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>

欢迎任何帮助

3个回答

10

您正在使用 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="(.*)/$"


TIP:

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


有道理。谢谢!我之前一直在尝试使用重定向和其他所有规则,但是忘记在这个规则上检查它了。无论如何,我根据您的指示更新了规则,但是我仍然被重定向到斜杠。现在这是唯一正在使用的规则。/test/desktops 重定向到 /test/desktops/ - fseminario
如果您删除条件,那么会发生什么(您可以删除整个<conditions>...</conditions>)? - cheesemacfly
我已经让它运行了。我得到了日志,从外观上看,/test/desktops在到达IIS并添加斜杠之前都很好。<EventData> <Data Name="ContextId">{00000000-0000-0000-1D01-0080010000F9}</Data> <Data Name="Headers">Content-Type: text/html; charset=UTF-8 Location: http://xxx.xxx.com/test/desktops/ Server: Microsoft-IIS/7.5 X-Powered-By: ASP.NET </Data> 您想让我查看特定的哪一行吗? - fseminario
在跟踪中,您正在请求 test/desktops,因此不会触发规则。该规则仅删除末尾的 /,因此如果您请求 test/desktops/,则将重定向到 test/desktops - cheesemacfly
1
谢谢,我不知道它需要是虚拟目录而不是物理路径!唉! - fseminario
显示剩余13条评论

1
我遇到了和你一样的问题,这是我发现的解决方法。
我的目的是在MVC网站上使用此规则,但我不想在生产环境中进行测试,因此我在已经设置好的网站上测试了该规则,这个网站恰好是Web Forms 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 Forms网站中,在我的情况下,/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>

希望这能有所帮助!

0

我遇到的问题是PDF文件链接末尾有斜杠,所以在运行IIS 6.1的Windows Server 2008 R2上对我有效的方法是:

点击需要规则的网站,在功能视图中打开URL Rewrite,然后在操作部分(右窗格)选择添加规则并选择追加或删除尾随斜杠符号。在下一个窗口中,在下拉菜单中选择如果存在,则删除

希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接