短链接和长链接

短链接和长链接

使用短链接的好处:短、字符少、美观、便于发布、传播

比如我的个人博客地址:http://will-johnson.gitee.io/blog/

使用百度短网址服务转换为短网址为:https://dwz.cn/Eps6teX5

现象

当在浏览器输入短网址回车时,会有一个302跳转。然后浏览器重新访问location地址

image

对于302多余的解释

302 Found,Moved Temporarily,可以简单的理解为该资源原本确实存在,但已经被临时改变了位置;换而言之,就是请求的资源暂时驻留在不同的URI下

对于服务器,通常会给浏览器发送HTTP Location头部来重定向到新的新位置,然后浏览器重新加载该Location

HTTP Location 是在两种情况下,因来自HTTP服务器的响应中返回头域:1.要求网页浏览器加载其他网页(域名转址)

但是

跳转用301还是302?301是永久重定向,302是临时重定向。短地址一经生成就不会变化,所以用301是符合http语义的。同时对服务器压力也会有一定减少。 但是如果使用了301,我们就无法统计到短地址被点击的次数了。而这个点击次数是一个非常有意思的大数据分析数据源。能够分析出的东西非常非常多。所以选择302虽然会增加服务器压力,但是我想是一个更好的选择。

  1. 301

表示被请求的资源已永久移动(Moved Permanently),永久移动到新位置,任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。正常这个响应是可缓存的,除非额外指定。新的永久性的URI应当在响应的Location域中返回,正常实体中应当包含指向新的URL的超链接及简短说明,除非是HEAD类的请求。

  1. 302

如果返回状态码302,表示要求客户端临时重宝向(Moved Temporarily)。由于是临时重定向,客户端应当继续向原有地址发送以后的请求,并且只有在Cache-Control或Expires中指定的情况下,响应才可以缓存。注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。因此状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。

原理

短链接的原理其实就是:

  • 将长链接通过一定的手段生成一个短链接

  • 访问短链接时实际访问的是短链接服务器,然后根据短链接的参数找回对应的长链接

  • 重定向跳转

业内实现

发号器(ID自增)+62进制编码

如对于我的博客地址:http://will-johnson.gitee.io/blog/,发号16进制:816e351d15bf,转换为62进制即为:Eps6teX5

为什么要用62进制转换

  • 62进制转换是因为62进制转换后只含数字+小写+大写字母。而64进制转换会含有/,+这样的符号(不符合正常URL的字符)

  • 10进制转62进制可以缩短字符,如果我们要6位字符的话,已经有560亿个组合了。

但是如何实现一个长地址多次转换都是同一个短地址呢?

这个不能完全做到。如果想要完全做到,那么就需要保存长地址到短地址的映射关系,得不偿失。

可以采取一个折中的方案,采用有有效时间的kv存储,也就是一个缓存系统。

其他方法

  • 实现一个算法,把长地址转成短地址,但是不存在逆运算。我们需要把短对长的关系存到DB中,在通过短查长时,需要查DB

    • 不可以,会出现碰撞

你可能感兴趣的:(短链接和长链接)