首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
daya0576
V2EX  ›  程序员

HTTP 301 和 302 跳转的本质区别?

  •  
  •   daya0576 · 2017-08-13 13:50:59 +08:00 · 8542 次点击
    这是一个创建于 890 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近看到 http response 的状态码, 说302 是 moved permanently, 301 是 moved temporarily.
    想彻底搞清楚它们本质的区别, 仔细去看了它们的 Response:

    1. 访问 changchen.me 的响应(301):
      HTTP/1.1 301 Moved Permanently
      Server: nginx/1.10.3 (Ubuntu)
      Date: Sun, 13 Aug 2017 05:37:04 GMT
      Content-Type: text/html
      Content-Length: 194
      Connection: keep-alive
      Location: https://changchen.me/

    2. 访问 www.changchen.me 的响应(302):
      HTTP/1.1 302 Moved Temporarily
      Server: nginx/1.10.3 (Ubuntu)
      Date: Sun, 13 Aug 2017 05:38:23 GMT
      Content-Type: text/html
      Content-Length: 170
      Connection: keep-alive
      Location: https://changchen.me/

    但问题来了, 它们唯一的区别只有第一行 O.O, 那他们的区别到底是什么呢?
    功能上好像是完全一样的, 只是告诉客户端是永久还是临时跳转吗?

    谢谢~~


    ps. 还有大家要是工作了, 做 web 开发, 还会去仔细研究一下 TCP/IP, HTTP, HTTPS 等协议吗?
    有什么好的学习资料或书推荐的吗?

    20 回复  |  直到 2017-08-14 20:59:09 +08:00
    mooncakejs
        1
    mooncakejs   2017-08-13 13:57:17 +08:00   ♥ 4
    301 意味着客户端可以对结果进行缓存, 搜索引擎或者浏览器都可以把跳转后的地址缓存下来,下一次不必发送这个请求。
    302 就是客户端必须请求原链接。
    580a388da131
        2
    580a388da131   2017-08-13 14:01:01 +08:00
    Moved Permanently
    永久 移动

    Moved Temporarily
    临时 移动
    tomczhen
        3
    tomczhen   2017-08-13 14:01:57 +08:00 via Android   ♥ 2
    返回是由服务器决定的,但是如何处理是客户端决定的,只不过按照 HTTP 协议规范规定 301 跳转是会被客户端记住。后台开发通常只要关心应用层即可,推荐图解 HTTP,足够一般工作使用了,再想继续深入就是 HTTP 权威指南了。
    tomczhen
        4
    tomczhen   2017-08-13 14:02:34 +08:00 via Android
    应该是 302 会被客户端记住。
    daya0576
        5
    daya0576   2017-08-13 14:12:20 +08:00
    @tomczhen
    @mooncakejs

    谢谢了, 就是说功能其实是一样的, 都是跳转, 但会告诉客户端(游览器, 搜索引擎)是个临时还是永久的跳转, 好让它们做更合适的处理.
    chuhemiao
        6
    chuhemiao   2017-08-13 14:57:35 +08:00
    可以看下 hsts,为何只支持 301 而不是 302。
    fiht
        7
    fiht   2017-08-13 15:01:48 +08:00
    哪有啥本质的区别,是 HTTP 标准制定的。
    =======
    存在本质区别的比如讲 啊 为什么 ElasticSearch 的全文索引比 MySQL 快那么多呢?
    然后各式各样的大佬就可以开始给你讲本质区别了。
    liuzhiyong
        8
    liuzhiyong   2017-08-13 15:32:22 +08:00 via iPad
    楼上说的很清楚了,一个是永久性的,一个是临时性的。永久性的会被客户端记住。
    pqee
        9
    pqee   2017-08-13 15:33:14 +08:00 via Android
    HTTP 协议就是如此简单,理论上讲 GET POST 除了这两个词不一样之外没有任何区别。区别都是客户端的约定俗成。
    carlclone
        10
    carlclone   2017-08-13 15:35:30 +08:00 via Android
    约定,不强制遵循
    TimePPT
        11
    TimePPT   2017-08-13 15:41:50 +08:00 via iPhone
    你做站点改版没事大量做 302 跳转看看 SEO 啥效果……
    YangXiaoming
        12
    YangXiaoming   2017-08-13 16:54:47 +08:00   ♥ 1
    301 和 302 的区别其实对爬虫很重要。
    cxbats
        13
    cxbats   2017-08-13 17:20:06 +08:00 via Android
    这些其实都是约定,你要是自己喜欢完全可以想怎么来怎么来
    yatesun
        14
    yatesun   2017-08-13 17:53:08 +08:00 via Android   ♥ 1
    @chuhemiao hsts 是 307,既不是 301 也不是 302
    FanWall
        15
    FanWall   2017-08-13 17:58:53 +08:00
    这些属于约定 翻翻文档就行了
    Kilerd
        16
    Kilerd   2017-08-13 18:14:18 +08:00 via iPhone
    客户端(浏览器)会对永久的进行缓存。当访问原地址时,会直接本地 302 跳转,跟 HSTS 的 307 一样
    SimonFu
        17
    SimonFu   2017-08-13 18:25:51 +08:00
    个人理解,从 SEO 角度,302 跳转,搜索引擎仍然保留原来的地址,301 跳转,则会保留跳转后的地址。
    flowfire
        18
    flowfire   2017-08-13 21:20:43 +08:00   ♥ 3
    301:永久重定向,客户端以后不应该再次请求此地址
    302:临时重定向,客户端可以(也应该)再次请求此地址
    P.S. 由于 302 语义不明确,所以不推荐使用 302 重定向,应该使用 303 或者 307 代替
    303:临时重定向,并使用 GET 方法请求新的 URL
    307:临时重定向,并使用原方法请求新的 URL
    chuhemiao
        19
    chuhemiao   2017-08-14 10:17:51 +08:00
    @yatesun 我记得加的时候是要先 http 跳到 https (这里需要用 301 把),之后浏览器会在判别跳 307
    1010011010
        20
    1010011010   2017-08-14 20:59:09 +08:00
    还会影响搜索引擎
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4279 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 37ms · UTC 09:03 · PVG 17:03 · LAX 01:03 · JFK 04:03
    ♥ Do have faith in what you're doing.