短链接用302

[TOC]

之前某厂面试的时候问到过状态码 301/302 的问题,问我有没有相应的实践。当时我只是把概念简单说了下,状态码 3xx 表示重定向,301 是永久重定向,302 是临时重定向,但是实在没有这方面的实践。

今天看了一篇文章,讲短链接的实现,涉及到了 301/302 跳转,感觉面试答这个就非常完美了。分享这篇文章之前,先来简单回顾下这两个状态码。

301 Moved Permanently 永久移动
表示被请求的资源已永久移动到新位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个 URI 之一。

后台会在响应头中返回 Location 字段,其中包含了需要重定向的新地址,浏览器接收响应之后会重定向到这个地址。如果没有额外指定,这个响应默认会被浏览器缓存。当下次再请求的时候,浏览器不会向服务器发送请求,而是直接从缓存中获取需要重定向的新地址。

除非是 HEAD 请求,否则响应实体应该包含指向新的 URI 的链接和简短说明。如果既不是 HEAD 也不是 GET 请求,浏览器会禁止自动重定向,除非得到用户确认,因为请求的条件可能发生变化。

客户端发出请求:
GET /bolg HTTP/1.1
Host: www.example.com

服务器响应(不带Cache-Control头部):
HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/index

服务器响应(带Cache-Control头部):
HTTP/1.1 301 Moved Permanently
Location: http://www.example.org/index
Cache-control: private; max-age=600;

302 Moved Temporarily 临时重定向
要求客户端执行临时重定向。由于这样的重定向是临时的,客户端应该继续向原有地址发送请求。

这个响应默认不会被浏览器缓存,只有在 Cache-Control 或 Expires 中进行指定的情况下,这个响应才会缓存。新的临时性的 URI 应该在响应头的 Location 字段返回。没有指定缓存的情况下,当下次再请求的时候,浏览器会继续发送请求给服务器。

除非是 HEAD 请求,否则响应实体应该包含指向新的 URI 的链接和简短说明。如果既不是 HEAD 也不是 GET 请求,浏览器会禁止自动重定向,除非得到用户确认,因为请求的条件可能发生变化。

客户端发出请求:
GET /bolg HTTP/1.1
Host: www.example.com

服务器响应(不带Cache-Control头部):
HTTP/1.1 302 Moved Temporarily
Location: http://www.example.org/index

服务器响应(带Cache-Control头部):
HTTP/1.1 302 Found
Location: http://www.example.org/index
Cache-control: private; max-age=600;

短链跳转的基本原理

在这里插入图片描述通过浏览器请求抓包之后可以看到,短链接的请求返回状态码 302 与 Location 字段,这个 Location 的值就是对应的长链接。

在这里插入图片描述

浏览器收到这个请求之后,会再请求长链接得到最终的响应,整个过程流程图如下:

在这里插入图片描述

整个步骤就是先访问短链接 A ,然后重定向到长链接 B 。那么问题来了,既然 301 和 302 都可以实现重定向,到底该用哪一个呢?

上面已经提到,301 代表永久重定向,也就是说第一次请求拿到长链接后,下次浏览器再去请求短链接,浏览器不会再去请求短链接的服务器了,而是直接从浏览器缓存里取。这样有一个问题,如果服务器需要获取用户的点击数,如果浏览器缓存了长链接,服务器就没办法获取到短链接的点击数了,所以一般不采用 301 。

302 代表临时重定向,也就是说每次访问短链接都会去请求短链接的服务器(除非响应头中用 Cache-Control 或 Expires 暗示浏览器缓存)。这样虽然给服务器增加了压力,但是便于服务器统计点击数,所以推荐使用 302 。
————————————————
版权声明:本文为CSDN博主「天猫精灵998」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43487782/article/details/114882881