【发布时间】:2013-02-08 18:39:21
【问题描述】:
我目前正在使用 angularjs 编写一个 Web 应用程序,但我认为这个问题适用于任何在客户端进行路由的客户端 javascript 框架 (as angular does)。
在单页应用中,处理错误 URL 的正确方法是什么?
查看几个主要网站,我发现如果您在https://mail.google.com/mail/ 下方输入任何随机 URL,gmail 将重定向到收件箱。这发生在服务器端(使用 http 300 代码)或客户端,具体取决于错误路径是在 # 字符之前还是之后。另一方面,twitter 显示任何无效 URL 的真实 HTTP 404。第三个选项是显示一个“软”404,一个纯粹的客户端错误页面。
这些解决方案似乎适用于不同的情况。 Twitter 希望到 twitter 用户和推文的链接是真正的链接,因此人们可以分享它们,将它们发布在新闻文章中等,因此重要的是要识别无效链接(如果我在我的网站,一个简单的抓取就会告诉我)。另一方面,在 gmail 中,您不应该将链接共享到您的收件箱中,而且我什至不确定这些链接是否真的是永久的/持久的:似乎 url 更新主要用于浏览器历史导航中的目的单页应用。第三种提供软错误的方法可能适用于类似于 gmail 的情况,但没有合理的“默认”页面。
经过这么长的介绍,这里有一些具体的问题:
- 是否可以接受提供“软”错误页面而不是 404 错误,或者如果 url 无效,单页应用程序是否应该始终重定向到真正的 404?
- Gmail 的代码可能完全没有错误,但如果确实存在导致无效链接最终重定向回收件箱的错误,那么这可能比错误页面更让用户感到困惑。对于大多数没有像 gmail 那样经过良好测试的网络应用程序,显示错误页面会更好吗?
- 要为单页应用程序实现真正的 404,似乎有必要在服务器端复制路由逻辑。有没有办法解决这个问题?
- 当重定向到 404 时,我认为用户应该能够看到导致错误的 URL,可能在 URL 栏中。使用 html5 history api,我认为这可以通过简单地触发当前页面的重新加载(使用错误的 url),结合上面提到的服务器端路由来完成。对于不支持此功能或使用 hashbang 表示法的浏览器,这似乎是不可能的。支持所有浏览器的最佳方式是什么?
【问题讨论】:
-
您的网站甚至可以在没有 javascript 的情况下运行吗?您是在使用 history.pushState 通过 javascript 更新 URL,还是 URL 中的分段?
-
另外,你为什么说 redirecting 到 404,为什么不只是 show 一个?
-
@MarkusUnterwaditzer:关于重定向与显示软 404:这是问题的一部分。在某些情况下,显示 404 客户端很好。但我喜欢 HTTP 404 具有自动化工具可以理解的语义(用于测试、检查链接等)这一事实。
-
对此没有明确的答案。 Armin Ronacher 写了一篇关于 Battlelog 使用的方法的文章:首先渲染站点服务器端,然后使用 Javascript 渲染每隔一次点击:lucumr.pocoo.org/2011/11/15/modern-web-applications-are-here
-
好吧,那么在你的情况下,只显示一个 404-ish 消息就足够了。
标签: javascript angularjs http-status-code-404 singlepage single-page-application