http状态码301和302详解及区别

一直对http状态码301和302的理解比较模糊,在遇到实际的问题和翻阅各类资料了解后,算是有了必定的理解。这里记录下,但愿能有新的认识。你们也共勉。php


官方的比较简洁的说明:html

        301 redirect: 301 表明永久性转移(Permanently Moved)node

        302 redirect: 302 表明暂时性转移(Temporarily Moved )数据库

        ps:这里也顺带记住了两个比较相近的英语单词(permanently、temporarily),嘻哈!浏览器


        详细来讲,301和302状态码都表示重定向,就是说浏览器在拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址能够从响应的Location首部中获取(用户看到的效果就是他输入的地址A瞬间变成了另外一个地址B)——这是它们的共同点。他们的不一样在于。301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向以后的网址;302表示旧地址A的资源还在(仍然能够访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。服务器



      这里开启傻瓜自问自答模式(本身可能想到的疑问):网络

一、什么是重定向啊?mvc

        就是地址A跳转到地址B啦。百度百科的解释:重定向(Redirect)就是经过各类方法将各类网络请求从新定个方向转到其它位置(如:网页重定向、域名的重定向、路由选择的变化也是对数据报文经由路径的一种重定向)。网站


二、但是,为何要进行重定向啊?何时须要重定向呢?搜索引擎

        想跳就跳,就跳的漂亮。仍是借鉴百度百科:

1)网站调整(如改变网页目录结构);
2)网页被移到一个新地址;
3)网页扩展名改变(如应用须要把.php改为.Html或.shtml)。
        这种状况下,若是不作重定向,则用户收藏夹或搜索引擎数据库中旧地址只能让访问客户获得一个404页面错误信息,访问流量白白丧失;再者某些注册了多个域名的网站,也须要经过重定向让访问这些域名的用户自动跳转到主站点等。

三、那么,何时进行301或者302跳转呢?
        当一个网站或者网页24—48小时内临时移动到一个新的位置,这时候就要进行302跳转,打个比方说,我有一套房子,可是最近走亲戚去亲戚家住了,过两天我还回来的。而使用301跳转的场景就是以前的网站由于某种缘由须要移除掉,而后要到新的地址访问,是永久性的,就好比你的那套房子实际上是租的,如今租期到了,你又在另外一个地方找到了房子,以前租的房子不住了。
    清晰明确而言:
使用301跳转的场景:
1)域名到期不想续费(或者发现了更适合网站的域名),想换个域名。
2)在搜索引擎的搜索结果中出现了不带www的域名,而带www的域名却没有收录,这个时候能够用301重定向来告诉搜索引擎咱们目标的域名是哪个。
3)空间服务器不稳定,换空间的时候。

使用302跳转的场景:
        --尽可能使用301跳转!

四、为何尽可能要使用301跳转?——网址劫持!
        这里摘录百度百科上的解释:
        从网址A 作一个302 重定向到网址B 时,主机 服务器的隐含意思是网址A 随时有可能改主意,从新显示自己的内容或转向其余的地方。大部分的搜索引擎在大部分状况下,当收到302 重定向时,通常只要去抓取目标网址就能够了,也就是说网址B。若是搜索引擎在遇到302 转向时,百分之百的都抓取目标网址B 的话,就不用担忧网址URL 劫持了。问题就在于,有的时候搜索引擎,尤为是Google,并不能老是抓取目标网址。好比说,有的时候A 网址很短,可是它作了一个302 重定向到B 网址,而B 网址是一个很长的乱七八糟的URL 网址,甚至还有可能包含一些问号之类的参数。很天然的,A 网址更加用户友好,而B 网址既难看,又不用户友好。这时Google 颇有可能会仍然显示网址A。因为搜索引擎排名算法只是程序而不是人,在遇到302 重定向的时候,并不能像人同样的去准确断定哪个网址更适当,这就形成了网址URL 劫持的可能性。也就是说,一个不道德的人在他本身的网址A 作一个302 重定向到你的网址B,出于某种缘由, Google 搜索结果所显示的仍然是网址A,可是所用的网页内容倒是你的网址B 上的内容,这种状况就叫作网址URL 劫持。你辛辛苦苦所写的内容就这样被别人偷走了。302 重定向所形成的网址URL 劫持现象,已经存在一段时间了。不过到目前为止,彷佛也没有什么更好的解决方法。在正在进行的谷歌大爸爸数据中心转换中,302 重定向问题也是要被解决的目标之一。从一些搜索结果来看,网址劫持现象有所改善,可是并无彻底解决。
        个人理解是,从网站A(网站比较烂)上作了一个302跳转到网站B(搜索排名很靠前),这时候有时搜索引擎会使用网站B的内容,但却收录了网站A的地址,这样在不知不觉间,网站B在为网站A做贡献,网站A的排名就靠前了。
      301跳转对查找引擎是一种对照驯良的跳转编制,也是查找引擎可以遭遇的跳转编制,它告诉查找引擎,这个地址弃用了,永远转向一个新地址,能够转移新域名的权重。而302重定向很容易被搜索引擎误认为是利用多个域名指向同一网站,那么你的网站就会被封掉,罪名是“利用重复的内容来干扰Google搜索结果的网站排名”。


        自问自答模式先告一段落,这里分享下我在 NodeJs中实现跳转的场景:

        以前作过一个重构的项目,因为各类缘由,咱们的网站的登陆以及注册部分须要剥离为另外一个网站,域名和以前的不一样,因此,咱们须要保证旧的地址也能重定向到地址中去,咱们就在旧的系统的node层中做了一个重定向,代码相似这样:



这里没有设置状态码,发现默认是302跳转,而后咱们设置了301状态码,相似这样:



用fiddle抓包(上面的302调整我就不上图了),看到效果:



以上是使用Express,用nodejs原生的代码实现相似这样: