最初接触URL重定向的时候,我也被这两个类型给搞糊涂了。甚至有同事问,是不是301是地址栏显示的地址不改变,而302是改变的?萌萌的问题。 

    那么301 redirect和302 redirect两者,到底有什么区别和联系呢? 

    其实最大的区别在于搜索引擎对他们的识别和处理

    301告诉搜索引擎,页面已经永久迁移到了新地址。搜索权重值会加给目标站点。而302告诉搜索引擎,重定向只是暂时的,原来的URL也许很快会恢复生效。有点像电视剧中间插播的“广告之后,马上回来”。权重值加给原来站点。当然,是否要恢复原URL的内容,取决于网站自己。

    但是另一方面,搜索引擎比较智能了,不会仅仅根据你设置301或者302就做一刀切的处理。如果301目标地址经常变化,可能搜索引擎会判断这个重定向“本意是临时的”,会当做302处理(权重值加给源站)。同样的,如果302的目标地址一直保持不变,成为事实上的永久迁移,那么搜索引擎会把它当做301处理。不会像对待302那样不停的来爬。所以,不要把301、302当儿戏啦。

    说了不少,让我们来看看一个301的例子:

    wKioL1V2obXj9xmGAAEgwzQhzdg269.jpg

    访问http://www.ebay.com/abcd(这是一个我随便写的URL),yahoo的客户体验做的比较好,虽然/abcd这个页面是不存在的,但还是先转到https://www.ebay.com/abcd,然后会继续处理,返回yahoo自己的一个页面:https://www.yahoo.com/?err=404&err_url=https%3A%2F%2Fwww.yahoo.com%2Fabcd

    不过,yahoo在安全上还是有值得改进的地方。从返回的头标里,我们获知这台web设备是ATS(即Apache Traffic Server)。对黑客来说,知道了网站使用的web架构,就可以使用相对应的攻击手法。事半功倍哦。比如,针对IIS可以用IIS的漏洞进行攻击,对Apache又是另一套攻击手法。这又是信息安全审计领域的内容了,这个话题就此打住。

    再看看302的例子:

    wKiom1V2oi3CskIEAAEHjO_jbV4808.jpg

    类似的,百度也不会简单的给出一个404之类的不友好的返回,而是临时重定向到自己的一个友好页面。这样至少让用户还是留在自己的网站上,而不是因为看到404后,用户愤怒的跑去其他站点啦。

    除了这点,还有别的区别吗?答案是肯定的。浏览器对301和302的处理也不同

    一般情况下,302的重定向不会被浏览器记入缓存(cache),但301一般会缓存。造成的用户体验差别就是,同样是第二次访问源站点,如果上次得到的是301,浏览器就会直接从缓存里读取重定向地址并访问这个地址。而302的话,浏览器会继续发送一次http请求到源站点。之后的行为,就看源站点是继续给出302,还是会有别的返回结果。

    那么在这一点上,我们也能发现者两者的不同的应用场景。301更适合已经决定的长期重定向。302则适合网站暂时的维护或其他原因导致的临时操作,以避免维护结束后,客户还是跑到新站点去。客户体验很重要呐!

    客官又问了:“我又想做301重定向,又不想用户浏览器做缓存,行不行啊?”

    还真的可以。其实还是那个套路:借助http头标(header)。这次用cache类的http头标(header)进行控制。在返回301重定向的同时,增加一个header如下:

    Cache-Control:no-cache

    其实大家有留意的话,第一个yahoo的301示例里就是这样做的。

    wKioL1V2pWegwLFcAAEnleGTB28618.jpg

    这样客户端的浏览器虽然得到的http返回码还是301,但缓存控制方面被这个header做了定义,即不记入缓存。缓存方面的头标还有很多,有机会下次再讲吧,至少这次301和302大家应该搞的比较清楚了。