我目前正在使用angularjs编写一个Web应用程序,但我认为这个问题适用于任何在客户端进行路由的javascript框架(就像angular一样)。
在单页面应用程序中,如何处理错误的URL是正确的方式?
看了几个主要网站,我发现gmail会重定向到收件箱,如果您在https://mail.google.com/mail/下输入任何随机URL。这是在服务器端完成的(使用http 300代码)或在客户端完成的,具体取决于错误路径是在#字符之前还是之后。另一方面,Twitter对任何无效的URL显示真正的HTTP 404。第三个选项是显示“软”404,即纯客户端错误页面。
这些解决方案似乎适用于不同的情况。Twitter希望Twitter用户和推文链接成为真正的链接,以便人们可以共享它们,在新闻文章中发布它们等等,因此识别无效链接非常重要(如果我在我的网站上有一个损坏的推文链接,简单的爬行将告诉我)。另一方面,在Gmail中,您不需要在收件箱中分享链接,我甚至不确定链接是否真正是永久/持久的:似乎URL更新主要用于浏览器历史记录导航单页应用程序内。给出软错误的第三种方法可能适用于类似Gmail的情况,但没有合理的“默认”页面。经过这么长的介绍,以下是一些具体问题:
- 在单页应用程序中,如果URL无效,是否可以给出“软”错误页面而不是404错误,或者始终重定向到真正的404?
- Gmail的代码可能完全没有漏洞,但如果出现错误导致无效链接最终重定向回收件箱,这可能比错误页面更令用户困惑。对于大多数没有像Gmail一样经过充分测试的Web应用程序,显示错误页面是否更好?
- 要为单页应用程序实现真正的404,似乎需要在服务器端复制路由逻辑。有没有其他方法可以解决这个问题?
- 重定向到404时,我认为用户应该能够看到导致错误的URL,可能在URL栏中。使用html5历史记录API,我认为可以通过简单地触发当前页面(带有错误的URL)的重新加载来实现,再结合上述服务器端路由。对于不支持此功能或使用哈希符号表示法的浏览器,似乎不可能。如何支持所有浏览器?