规则11 避免重定向

1. 重定向

  a. 重定向(Redirect)用于将用户从一个URL重新路由到另一个URL;

  b. 重定向有很多种——301和302最常用;

  c. 通常针对HTML文档进行重定向,但通常也能用在请求页面的组件(图片、脚本等);

  d. 使用重定向的原因:网站重新设计、跟踪流量、记录广告点击、建立易于记忆的URL;

  e. 重定向会让页面变慢。

 

2. 重定向类型

  300 Multiple Choices(基于Content-Type);

  301 Moved Permancently

  302 Moved Temporarily

  303 See Other(对302的说明)

  304 Not Modified(不是真的重定向,响应条件GET请求)

  305 Use Proxy

  306(不再使用)

  307 Temporary Redict(对302的说明)

  301和302最常用,303和307是HTTP 1.1规范添加的对302的澄清,但几乎没人用303和307;

  301和302响应在实际中都不会被缓存,除非有附加的头——如Expires或Cache-Control;(肯定不会发生条件GET请求)

 

3. 302 和 303重定向

  <?php

    Header( "HTTP/1.1 301 Moved Permanently" ) ; // Header( "HTTP/1.1 302 Moved Temporarily" ) ;
    Header( "Location: http://www.9enjoy.com" );

  ?>

  301重定向是一种永久重定向页面。301重定向可以实现网站或网页间的重定向。如果使用了301重定向,那么原来的网页就会失效,搜索引擎会在较短时间内将失效的网页删除。

  302重定向是一种临时重定向页面。302重定向可以实现网站间的重定向。原来的页面会暂时失效,当302重定向移除后,用户就能返回原来的网站。

  假设将网站迁移到一个新的URL,需要将流量也重定向到新网站。在这种情况下就应该使用301重定向,这会告知搜索引擎网站已经迁移,之前的搜索结果应该迁移到新的URL。而如果使用的是302重定向,搜索引擎就不会更新索引,搜索结果的URL也不会发生变化。因为使用302重定向实际上就是告诉搜索引擎这个重定向只是暂时的。

  处理重定向页面的最佳方式是:应该按照重定向页面的正确含义来使用不同的重定向页面。

 

4. 其他方法重定向

  HTML meta refresh标签:<mata http-equiv="refresh" content="0; url=http://stevesouders.com/newurl">

  JavaScript: document.location.href = "http://stevesouders.com/newurl"

  但是使用这些方法时,后退按钮不能正确工作。(标准的3xx HTTP状态码可以)

 

5. 在重定向完毕并且HTML文档下载完毕之前,没有任何东西显示给用户。

 

6. 缺少结尾的斜线

  http://astrology.yahoo.com/astrology ——> http://astrology.yahoo.com/astrology/

  这样重定向(301)的理由:允许自动索引(自动转到默认的index.html),并且能够取得当前目录相关的URL。(页面中存在组件使用相对URL时);

  然而,很多流行的Web页面不依赖自动索引,而是依赖特定的URL和处理器。另外,URL通常也是和根目录有关,使用绝对路径,不使用相对路径;

  Notice:主机名缺少斜线不会发生重定向,但最终URL有/,因为浏览器GET请求时必须指定路径,没有则使用根路径"/";(GET / HTTP 1.1)

  这样的重定向是许多web服务器默认行为。解决方法:

  a. Alias: Alias /astrology /usr/local/apache/htdocs/astrology/astrology.html

  b. mod_rewrite: 较复杂;

  c. Apache 2.0可以使用DirectorySlash,假设有个名为astrologyhandler的处理器:

    <Location /astrology>

      DirectorySlash Off

      SetHandler astrologyhandler

    </Location>

    必须知道各模块运行顺序,否则DirectorySlash这样使用可能安全隐患;

  这些方法都不能解决页面中组件相对URL问题。因此,页面组件URL必须依赖于根目录;

  当你的网站包含目录并使用了自动索引就必须忍受这样一个301重定向。

 

7. 连接网站

  重定向:将旧网站连接到新网站、将一个网站的不同部分连接起来,基于一些条件(浏览器类型、用户账户类型等)来引导用户。

  重定向降低了开发复杂性,但这也损害了用户的体验,可以有以下改善:

  a. Alias、mod_rewrite、DirectorySlash要求除URL之外还要提交到一个接口;(处理器或者文件名)

  b. 如果两个后端文件位于同一台服务器,代码可以自己实现连接;(旧文件(处理器)调用新文件(处理器))

  c. 域名变了,可以使用CNAME来使旧域名指向新域名。

 

8. 跟踪内部流量

  Yahoo!主页(http://www.yahoo.com)的sports连接URL是http://www.yahoo.com/r/26,单击会产生301响应,Location:http://sports.yahoo.com/。通过分析http://www.yahoo.com的web服务器日志就可以得知人们离开Yahoo!首页后的流量去向。这里,去往sports的流量和日志中/r/26入口的人数一样。

  另一种选择是使用Referer,一方面Referer浏览器并不是都支持,另一方面使用这种方法要想对离开Yahoo!主页的人进行统计分析,就要对各个目标网站(sports、mail、calendar等等)的日志进行分析。对于内部流量值得建立Referer日志。

 

9. 跟踪出站流量

  重定向可以,Referer则不行;

  可以使用信标(beacon)——一个HTTP请求,其URL中包含跟踪信息。跟踪信息可以从信标的Web服务器的访问日志中提取出来,信标响应通常是一个1px*1px的透明图片;(返回一个204响应更优秀,因为它更小、从来不会缓存,而且绝对不会改变浏览器状态)

  204状态是指服务器成功处理了客户端请求,但服务器无返回内容。204是HTTP中数据量最少的响应状态,204的响应中没有body,而且Content-Length=0。

  <a href="http://en.wikipedia.org/wiki/Perfomance" onclick="resultBeacon(this); return false;">Performance - Wikipedia</a>

  <script>

    var beacon ;

    function resultBeacon(anchor){

      beacon = new Image() ;

      beacon.onload = gotoUrl ;

      beacon.onerror = gotoUrl ;  // 确保页面自身卸载之前,信标已经传送完毕  避免发送信标和页面自身卸载之间的竞态

      beacon.src = "http://rds.yahoo.com/?url=" + encodeURIComponent(anchor.href) ;

    }

    function gotoUrl(){

      document.location = beacon.src ;

    }

  </script>

   信标和重定向都需要一个额外的HTTP请求。

  使用XMLHttpRequest来发送信标,只需在xhr.readState 2(已发送不用等响应)时就可以卸载页面并跳转页面。

  对使用target属性的链接可使用简单的图片信标就好,不用担心竞态出现:

  <a href="http://en.wikipedia.org/wiki/Perfomance" onclick="resultBeacon(this); " target="_blank">Performance - Wikipedia</a>

  <script>

    var beacon ;

    function resultBeacon(anchor){

      beacon = new Image() ;

      beacon.src = "http://rds.yahoo.com/?url=" + encodeURIComponent(anchor.href) ;

    }

  </script>

  跟踪弹出广告的点击量时,这种方式很好。

 

10. 美化URL

  使用重定向的另一种动机是使URL更加美观并易于记忆。

  与其让用户忍受额外的HTTP请求,最好还是用Alias、mod_rewrite、DirectorySlash和直接链接代码来避免重定向。

  

  

  

  

  

posted on 2013-04-13 19:47  BigPalm  阅读(538)  评论(0编辑  收藏  举报

导航