我目前正在使用angularjs编写一个web应用程序,但我认为这个问题适用于客户端路由的任何客户端javascript框架(as angular does)。在单页面应用程序中,处理错误URL(404错误)的正确方法是什么?
在单页面应用程序中,处理错误URL的正确方法是什么?
看看几个主要网站,我发现如果您在https://mail.google.com/mail/以下键入任何随机URL,gmail将重定向到收件箱。这发生在服务器端(使用http 300代码)或客户端,这取决于错误的路径是否在#字符之前或之后。另一方面,Twitter显示任何无效URL的真实HTTP 404。第三种选择是显示一个“软”404,一个纯粹的客户端错误页面。
这些解决方案似乎适用于不同的情况。 Twitter希望Twitter用户和推文链接成为真正的链接,所以人们可以共享它们,将它们发布在新闻文章等中,因此重要的是无效的链接应该被识别为这样(如果我有一个链接到推文链接我的网站,一个简单的抓取会告诉我)。另一方面,在Gmail中,你不希望共享链接到你的收件箱,我甚至不确定链接是否真的是永久性/持久性的:看起来URL更新主要服务于浏览器历史导航的目的单页应用程序。提供软错误的第三种方法可能适用于类似于gmail的情况,但是没有合理的“默认”页面。
这漫长的介绍后,这里有一些具体的问题:
- 是以往任何时候都可以接受的给予,而不是一个404错误“软”错误页面,还是应该单页应用始终重定向到一个真正的404如果一个网址无效?
- Gmail的代码可能完全没有bug,但如果确实存在导致无效链接的错误,最终重定向回收件箱,那么用户可能会比错误页面更令人困惑。对于大多数网络应用程序,这些应用程序的测试不如Gmail,最好是显示一个错误页面?
- 要为单页面应用程序实现真正的404s,似乎有必要在服务器端复制路由逻辑。有没有办法解决?
- 重定向到404时,我认为用户应该能够看到导致错误的URL,可能在URL栏中。使用html5历史api,我认为这可以通过简单地触发当前页面的重新加载(使用错误的url)以及上面提到的服务器端路由来实现。对于不支持此功能的浏览器或使用hashbang符号的浏览器来说,这似乎不可能。支持所有浏览器的最佳方式是什么?
你的网站甚至没有JavaScript的工作?您是否使用history.pushState通过javascripts或网址中的细分来更新网址? – 2013-02-08 18:50:07
另外,你为什么要谈论*重定向*为404,为什么不只是*显示*一个? – 2013-02-08 18:50:38
@markus我目前正在使用的网站在没有javascript的情况下无法使用。但我希望深层链接工作,以便用户可以共享链接到网站内部(通常,这将通过电子邮件)。我现在使用hashbang符号,但是如果我想/需要,angularjs可以轻松切换到html5 pushState。 – jssebastian 2013-02-08 19:01:57