高性能网站建设指南(十一)避免重定向
in Blog
重定向(Redirect)用于将用户从一个URL重新路由到另一个URL。重定向有很多种——301和302是最常用的两种。通常针对HTML文档进行重定向,但也可能用在请求页面中的组件(图片、脚本)时。实现重定向到可能有很多不同的原因,包括网站重新设计、跟踪流量、记录广告点击和建立易于记忆的URL。重定向会使页面变慢。
重定向(Types of Redirects)
当Web服务器向浏览器返回一个重定向时,响应中就会拥有一个范围在3XX的状态码。这表示用户代理必须执行进一步操作才能完成请求。
- 300 Multiple Choices (基于Content-Type)
- 301 Moved Permancently
- 302 Moved Temporarily (亦称Found)
- 303 See Other (对302的说明)
- 304 Not Modified
- 305 Use Proxy
- 306 (不再使用)
- 307 Temporary Redirect (对302的说明)
“304 Not Modified”并不真的是重定向——它用来响应条件GET请求,避免下载已经存在于浏览器缓存中的数据。
重定向的方法有:
-
浏览器会自动将用户带到Location字段所给出的URL。重定向所必需的所有信息都会出现在这个头中。响应提通常为空。不管名字,301和302响应在实际中都不会被缓存,除非有附加的头——如Expires或Cache-Control等要求这么做。
-
HTML文档的头中包含meta refresh标签可以在其content属性所指的秒数之后重定向用户——
<meta http-equiv="refresh" content="0; url=http://a.com/newuri">
-
JavaScript也可以用于执行重定向,将document.location设置为期望的URL即可。如果你必须进行重定向,最好的技术是使用标准的3XX HTTP状态码,这主要是为了确保后退按钮能够正常工作。
重定向之外的其他选择(Alternatives to Redirect)
重定向是解决很多问题的简单方式,但最好使用其他不会减慢页面加载速度的解决方案。
-
缺少结尾的斜线(Missing Trailing Slash)
有一种重定向最为浪费、发生的也很频繁。在URL的结尾必须出现斜线(/)而没有出现时。当缺少结尾的斜线时发送重定向悠着很充分的理由——它允许自动索引(autoindexing,自动转到默认的index.html上)并且能够获得与的昂前目录相关的URL。然而,很多流行的Web页面并不依赖自动索引,而是依赖特定的URL和处理器。另外,URL通常也与根目录相关而不是和当前目录相关。
总之,如果你的网站包含目录并使用了自动索引,用户就必须忍受一个到达预期页面的重定向。查看一下你的Web日志就能看到发出了多少301状态码,这能帮助你认识到多少值得去解决缺少结尾斜线的问题。
-
链接网站(Connecting Web Sites)
将用户从旧URL转移到新URL最简单的方式就是重定向。重定向是使用定义良好的API——URL来整合两个代码库的一种方式。
-
跟踪内部流量(Tracking Internal Traffic)
重定向经常用于跟踪用户流量的流向。一种是分析Web服务器日志得知流量去向,另一种是使用Referer日志来跟踪流量去向。
-
跟踪出站流量(Tracking Outbound Traffic)
当你尝试跟踪用户流量时,发现链接可能将用户带离网站,那么使用Referer就不太现实了。
跟踪出站流量除重定向之外的选择是信标(beacon)——一个HTTP请求,其URL中包含有跟踪信息。可以从信标Web服务器的访问日志中提取出来。信标响应通常是一个1px*1px的透明图片;不过204响应更为优秀,因为它更小、从来不会被缓存,而且绝对不会改变浏览器的状态。
美化URL(Prettier URLs)
使用重定向的另一种动机是使URL更加美观并且易于记忆。找出一种方式,无需重定向就能拥有简洁的URL,最好还是使用连接网站和直接链接代码来避免重定向。