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

2017-08-13 13:50:59 +08:00
 daya0576

最近看到 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 等协议吗?
有什么好的学习资料或书推荐的吗?

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/382599

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX