最近看到 http response 的状态码, 说302 是 moved permanently, 301 是 moved temporarily.
想彻底搞清楚它们本质的区别, 仔细去看了它们的 Response:
访问 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/
访问 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 等协议吗?
有什么好的学习资料或书推荐的吗?
1 mooncakejs 2017-08-13 13:57:17 +08:00 ![]() 301 意味着客户端可以对结果进行缓存, 搜索引擎或者浏览器都可以把跳转后的地址缓存下来,下一次不必发送这个请求。 302 就是客户端必须请求原链接。 |
![]() | 2 580a388da131 2017-08-13 14:01:01 +08:00 Moved Permanently 永久 移动 Moved Temporarily 临时 移动 |
![]() | 3 tomczhen 2017-08-13 14:01:57 +08:00 via Android ![]() 返回是由服务器决定的,但是如何处理是客户端决定的,只不过按照 HTTP 协议规范规定 301 跳转是会被客户端记住。后台开发通常只要关心应用层即可,推荐图解 HTTP,足够一般工作使用了,再想继续深入就是 HTTP 权威指南了。 |
![]() | 4 tomczhen 2017-08-13 14:02:34 +08:00 via Android 应该是 302 会被客户端记住。 |
![]() | 5 babywhisper OP |
![]() | 6 chuhemiao 2017-08-13 14:57:35 +08:00 可以看下 hsts,为何只支持 301 而不是 302。 |
![]() | 7 fiht 2017-08-13 15:01:48 +08:00 哪有啥本质的区别,是 HTTP 标准制定的。 ======= 存在本质区别的比如讲 啊 为什么 ElasticSearch 的全文索引比 MySQL 快那么多呢? 然后各式各样的大佬就可以开始给你讲本质区别了。 |
![]() | 8 liuzhiyong 2017-08-13 15:32:22 +08:00 via iPad 楼上说的很清楚了,一个是永久性的,一个是临时性的。永久性的会被客户端记住。 |
9 pqee 2017-08-13 15:33:14 +08:00 via Android HTTP 协议就是如此简单,理论上讲 GET POST 除了这两个词不一样之外没有任何区别。区别都是客户端的约定俗成。 |
10 carlclone 2017-08-13 15:35:30 +08:00 via Android 约定,不强制遵循 |
![]() | 11 TimePPT PRO 你做站点改版没事大量做 302 跳转看看 SEO 啥效果…… |
![]() | 12 YangXiaoming 2017-08-13 16:54:47 +08:00 ![]() 301 和 302 的区别其实对爬虫很重要。 |
13 strong>cxbats 2017-08-13 17:20:06 +08:00 via Android 这些其实都是约定,你要是自己喜欢完全可以想怎么来怎么来 |
15 FanWall 2017-08-13 17:58:53 +08:00 这些属于约定 翻翻文档就行了 |
![]() | 16 Kilerd 2017-08-13 18:14:18 +08:00 via iPhone 客户端(浏览器)会对永久的进行缓存。当访问原地址时,会直接本地 302 跳转,跟 HSTS 的 307 一样 |
17 SimonFu 2017-08-13 18:25:51 +08:00 个人理解,从 SEO 角度,302 跳转,搜索引擎仍然保留原来的地址,301 跳转,则会保留跳转后的地址。 |
![]() | 18 flowfire 2017-08-13 21:20:43 +08:00 ![]() 301:永久重定向,客户端以后不应该再次请求此地址 302:临时重定向,客户端可以(也应该)再次请求此地址 P.S. 由于 302 语义不明确,所以不推荐使用 302 重定向,应该使用 303 或者 307 代替 303:临时重定向,并使用 GET 方法请求新的 URL 307:临时重定向,并使用原方法请求新的 URL |
![]() | 19 chuhemiao 2017-08-14 10:17:51 +08:00 @yatesun 我记得加的时候是要先 http 跳到 https (这里需要用 301 把),之后浏览器会在判别跳 307 |
![]() | 20 1010011010 2017-08-14 20:59:09 +08:00 还会影响搜索引擎 |