文档中心 >Google PageSpeed

避免目标网页重定向

概览

由于重定向会触发额外的HTTP请求响应周期,并会额外延长往返时间延迟,因此,将应用发出的重定向数量降至最低至关重要。避免HTTP重定向可以缩减用户等待网页加载的时间。我们建议您仔细斟酌自己网站的设计,看看可以在哪些方面提升网站性能。

以下是重定向模式的一些优劣示例:

  • 优质:example.com使用响应性网页设计,无需重定向
  • 中等:example.com -> m.example.com/home
  • 劣质:example.com -> www.example.com -> m.example.com -> m.example.com/home

Web应用程序重定向的几个原因

有时有必要为您的应用到浏览器从一个URL到另一个重定向。Web应用程序的重定向问题有几个原因:

  • 以指示已移动的资源的新位置。
  • 要跟踪的点击和展示和日志提交页面。
  • 预留多个域,允许“用户友好”或“虚荣”域名和网址,并赶上拼错/输错网址。
  • 一个网站或应用程序的不同部分,不同的国家代码顶级域名,不同的协议(HTTP到HTTPS),不同的安全策略(例如:未经认证和认证网页)等之间的连接。
  • 要尾随斜线添加到URL目录名,使它们的内容访问浏览器。

不管是什么原因,重定向会触发额外的HTTP请求- 响应周期,并添加往返时间延迟。重要的是要尽量减少您的应用程序发出的重定向的数量- 特别是启动您的主页的所需资源。要做到这一点,最好的方法是您使用重定向限制。

建议

消除不必要的重定向

这里有一些策略,简单地消除不必要的重定向:

  • 在您的页面永远不要引用已知重定向到其他URL的URLs。当资源改变位置时,您的应用程序需要有一个更新URL引用的方法。
  • 永远不要使用一个以上的重定向来获得给定的资源。例如,如果C是目标页,并且有两个不同的开始点,A和B,A和B应直接定向到C;A不应该先定向到B,再从B重定向到C。
  • 尽量减少出现重定向,但实际上并不提供内容的外域数量。有时候,人们需要从多个域重定向,以获得不正确的用户输入(拼写错误/输错网址)。但是,如果你要引导用户他们可以从多个URL到达你的网站,你需要从你的名字每一个变种去购买新的域名。

使用服务器重写 以便用户输入url

许多Web服务器支持内部的“重写”。这允许你配置从一个URL到另一个URL的映射;当客户端请求无效的URL,服务器自动重新映射到正确的资源,而不发出重定向。一定要使用他们获得你无法控制的URL。千万不要把它们作为易更新URL引用的一个手段;你应该总是使用一个单一的URL指向一个资源。此外,如果可能缓存资源,还要避免使用它们。自动在目录名称末尾添加所需的尾随斜线是用户输入的URL,这是一个很好的重写机制的例子。

在后台跟追网络流量

为了跟追网页各种属性之间的流量,有些网站使用中间重定向到一个页面,它记录了一个独立的中央服务器上的所有属性。然而,因为这样的重定向会添加页面过渡之间的延迟,应该避免他们,并寻找在后台记录页面访问量的其他方式。

记录页面访问,一个流行的方法是在目标页面(或onload事件处理程序)的底部上包括一段JavaScript,当用户加载页面时,通知日志服务器。这样做的最常见的方式是建立一个请求给服务器,并把各种参数的数据进行编码加密。为了保持HTTP响应非常小的,请求一个透明的1x1像素的图像是一个很好的选择。稍微更优化的方法是使用一个HTTP204响应(“没有内容”),这稍微比1x1的GIF小。

使用服务器端HTTP重定向

有几种方法发出重定向:

  • 服务器端:您可以使用Location头,配置你的Web服务器发出300 HTTP响应代码(最常见的301(“永久移动”)或302(“发现”/“暂时移动”)),设置为新的URL。
  • 客户端:您在HTML文档的头部使用http-equiv="refresh"的meta标签属性或设置JavaScript的window.location对象(使用或不使用replace()方法)。

如果你必须使用重定向机制,应该使用服务器端方法而不用客户端方法。浏览器处理HTTP重定向比meta和Javascript更有效率。例如,JS重定向会增加浏览器解析延迟,然而301或302重定向会在浏览器解析HTML文档之前被立即进行。

另外,根据HTTP/1.1说明,301和302响应会被浏览器缓存。这意味着即使资源本身没有缓存,浏览器至少能在本地缓存找到正确的URL。301响应默认是可以缓存的,除非有其他说明。为了使302响应缓存,你应该配置你的web服务器,添加一个Expires或者Cache-Control max-age头(看浏览器设置缓存)。需要说明的是,并不是所有的浏览器都执行规范,不管是301缓存还是302缓存,看Browserscope知符合要求和不符合要求的浏览器列表。

本页面中的内容已获得知识共享署名3.0许可,并且代码示例已获得Apache 2.0许可;另有说明的情况除外。

文章源地址:https://developers.google.com/speed/docs/insights/AvoidRedirects