高性能web网站优化原则11——避免重定向

重定向(redirect)将用户从一个URL路由到另一个URL。
重定向的类型:当web服务器向浏览器返回一个重定向时,响应中就会包含一个3xx的状态码,表示用户代理必须进一步操作才能完成请求,下面是几种状态码:
• 300 Multiple Choices (based on Content-Type)
• 301 Moved Permanently
• 302 Moved Temporarily (a.k.a. Found)
• 303 See Other (clarification of 302)
• 304 Not Modified
• 305 Use Proxy
• 306 (no longer used)
• 307 Temporary Redirect (clarification of 302)
304并不是真的重定向,它用来响应GET请求,避免已经存在于缓存中的数据再次被下载。306已被弃用
301和302用的最多,303和307是在HTTP规范1.1中添加的,用来澄清对302的使用,但几乎没人使用303和307,绝大部分还在使用302.下面是一个301的例子:
HTTP/1.1 301 Moved Permanently
Location: http://www.baidu.com
Content-Type: text/html
浏览器自动将用户重定向到Location指定的url。301和302响应不会被缓冲,除非有Express或cache-contrl头。还有其他方法可以自动将用户重定向到其他url,例如:

用js脚本也可以用户只需重定向,例如将document.location=www.sohu.com即可。最好的技术是使用标准的3xx状态码,这主要是为了确保后退按钮能正常工作。参见w3c的文章Use standard redirects: don’t break the back button!” at http://www.w3.org/QA/Tips/reback.

重定向会降低网站性能
重定向延迟了整个html文档的下载,在html文档下载完成之前,页面不会呈现任何内容,也不会下载任何组件。在用户和html文档之间重定向延迟了页面中的所有组件及内容

重定向之外的其他选择
重定向是解决很多问题的简单方式,但最好使用其他不会减慢页面加载速度的解决方案。

缺失结尾的/
有一种重定向最为浪费发生的也很频繁,但web开发者通常都没有意识到它(我从来也没有意识到,╮(╯_╰)╭),发生在url的结尾必须出现/而没有出现时。访问http://www.aaa.com/example时会导致一个301的响应,包含了一个到http://www.aaa.com/example/的重定向,唯一的区别就是结尾多了一个/,当确实结尾/时发送重定向的理由是——它允许自动索引且能获得与当前目录相关的url(例如logo。gif),然后很多流行的web页面并不依赖自动索引,而是依赖特定的url和处理器。

连接网站
将用户从旧的url转移到新的url的最简单方式就是重定向,重定向是使用定义良好的API——URL来整合两个代码基础的一种方式。其他形式还包括基于一些条件来引导用户,用重定向来连接两个网站很简单且只需要很少的代码量。
虽然重定向降低了开发的复杂性,但这也损害的用户的体验。整合两个后端代码还有其他的选择,但比起简单的重定向需要更多的开发工作,不过这样非但不会损害用户体验,还能使之改善。如果两个后端处于同一个服务器上,则他们的代码自己就能链接,如通过接口方式直接调用。

你可能感兴趣的:(performance,后端)