为啥在 URL 中缺少尾部斜杠 (/) 时会发生重定向?

Posted

技术标签:

【中文标题】为啥在 URL 中缺少尾部斜杠 (/) 时会发生重定向?【英文标题】:Why redirects happens on missing of a trailing slash (/) from the URL ?为什么在 URL 中缺少尾部斜杠 (/) 时会发生重定向? 【发布时间】:2015-06-10 16:52:56 【问题描述】:

最浪费的重定向之一发生在 URL 中缺少尾随斜杠 (/) 时,否则应该有一个。例如,转到 http://example.com/action 会导致 301 响应包含一个重定向到 http://example.com/action/(注意添加的斜杠)。

那么它背后的原因是什么以及在Asp.Net应用程序的情况下如何解决它。任何想法!!

【问题讨论】:

【参考方案1】:

它是 asp.net 中StaticFileHandler 的一部分,所以我认为您不能(轻松地)更改它。这正是静态文件的默认 HTTP 处理程序所做的。

行为的来源是可以在 applicationhost.config 中找到的以下行:

<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule">

我怀疑这里导致重定向的特定模块是DefaultDocumentModule,但这需要进一步调查才能确认。

您可以通过删除 DefaultDocumentModule 来测试它,将此行更改为

<add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DirectoryListingModule">

它可能会破坏您的网站,但重定向会消失。

【讨论】:

当我有一个重写规则来删除尾部斜杠并且文件夹没有默认文档时,我确认在失败的跟踪日志记录中发生了这种情况。现在我只需要弄清楚如何让它停止。我希望 404 而不是 301 会导致重定向循环。【参考方案2】:

您所描述的实际上是一件好事,并且在网络上被推荐。 来自 nibbler 测试网站:“搜索引擎可能会将这些页面视为具有重复内容的单独页面,它们可能会受到惩罚。”

301(永久重定向)只在服务器上发生一次。它由用户的浏览器缓存,用户将被定向到正确的浏览器,而无需再次使用服务器。所以不要太担心这个(它不像是 302 临时重定向)

但我也很好奇这发生在哪里。我没有立即在我的路由中看到这一点。如果有人知道,请分享。

更新:显然你有这个属性

routes.AppendTrailingSlash = true;

这可能是导致效果的原因?

【讨论】:

【参考方案3】:

它遵循 Unix 路径逻辑。不带斜杠的 URI 指向文件,带斜杠的 URI 是目录。

如果您使用尾部斜杠访问 URI,并且在您的服务器上设置了目录列表,您将看到该路径下的所有文件。否则,可能会抛出 301 或 302 重定向以指示客户端需要使用另一个位置发送请求。

从客户端的角度来看,这 2 个 URI 在网络上可能是相同的。结果,服务器大部分时间而不是失败将重定向到另一个位置。当然是可配置的。

虽然我不是 ASP 专家,但绝对可以在服务器上以配置或编程方式控制重定向。

【讨论】:

以上是关于为啥在 URL 中缺少尾部斜杠 (/) 时会发生重定向?的主要内容,如果未能解决你的问题,请参考以下文章

Web.config:使用尾部斜杠将URL输入重定向到URL而不使用尾部斜杠

如何在 Rails 应用程序中删除 URL 的尾部斜杠? (在 SEO 视图中)

WordPress递归重定向问题

Firebase 身份验证链接不起作用 - 缺少尾部斜杠?

mod_rewrite:删除尾部斜杠(只有一个!)

如何禁用 301 重定向,在 Apache 中将斜杠添加到目录名称