likes
comments
collection
share

好好的短链,url?1=1为啥变成了url???1=1

作者站长头像
站长
· 阅读数 20

运营小伙伴突然找到我们说,我们的一个短链有三个?

第一反应就是不可能,但是事实胜于雄辩,还真的就是和运营小伙伴说的一模一样。

到底发生了什么呢?跟着我一起Review一下。

一、URL结构

1.1 URL概述

URL(统一资源定位符)是一个用于标识互联网上资源的地址。一个典型的URL结构通常包括以下几个部分:

好好的短链,url?1=1为啥变成了url???1=1

  1. 协议(Scheme) :也称为"服务方式",位于URL的开头,指定了浏览器与服务器之间通信的方式。常见的协议有http(超文本传输协议)、https(安全超文本传输协议)、ftp(文件传输协议)等。

  2. 子域名(Subdomain) :可选部分,位于域名之前,通常用于区分不同的服务或组织。例如,在sub.example.com中,sub是子域名。

  3. 域名(Domain Name) :URL的核心部分,用于唯一标识一个网站。通常是一个组织或公司的名字,如example.com

  4. 端口号(Port) :可选部分,用于指定服务器上的特定服务。如果省略,浏览器将使用默认端口,例如httphttps的默认端口是80和443。

  5. 路径(Path) :指定服务器上的资源位置。路径可以包含多个部分,用斜杠/分隔。例如,在/path/to/resource中,path/to/resource是资源的路径。

  6. 查询字符串(Query String) :可选部分,位于路径之后,用于传递额外的参数或数据。查询字符串以问号?开始,后面跟着一系列的参数,参数之间用和号&分隔。例如,在?key1=value1&key2=value2中,key1key2是参数名,value1value2是对应的值。

  7. 片段标识符(Fragment Identifier) :可选部分,用于指向页面内的特定部分。片段标识符以井号#开始,通常用于锚点链接。例如,在#section2中,section2是页面内的一个锚点。

1.2 URL示例

示例:一个完整的URL示例可能是下面这样的

https://www.xxx.com:8080/path/to/resource?key1=value1&key2=value2#section2

在上面的示例中,详细拆解如下:

https 是协议。 www.xxx.com 是域名。 8080 是端口号。 /path/to/resource 是路径。 key1=value1&key2=value2 是查询字符串。 #section2 是片段标识符。

二、URL的意义

URL(统一资源定位符)的意义在于它提供了一种标准化的方法来标识和访问互联网上的资源。它是互联网的基础构件之一,它不仅使得资源的定位和访问变得简单,还支持了互联网的组织、导航、安全和分享等多种功能。以下是URL的几个关键意义:

好好的短链,url?1=1为啥变成了url???1=1

这些意义做开发的都懂,不懂的就自己百度吧,这里不做赘述。

三、硬菜:url?1=1为啥变成了url???1=1

3.1 故事背景

我们有一个自己的短链项目,用户访问短链的时候,我们自己服务器会进行重定向,这样的好处是分享出去的链接都是很短的,会有效提升用户的使用体验。

短链触发和服务器的交互流程如下:

用户短链服务器长链点击请求找到映射的长链地址重定向到长链请求并得到响应用户短链服务器长链

3.2 事故现场

上面弄清楚了短链的基本触发流程,那我我们看看到底发生了什么。

  • 客户端事故现场截图

好好的短链,url?1=1为啥变成了url???1=1

从这个截图就可以明显的看出,这里有三个?,这是不合理的...

  • 数据库存储的事故现场数据截图

好好的短链,url?1=1为啥变成了url???1=1

哎,数据库里面只有一个问号吧?

3.3 问题分析和解决方案

  • 问题分析

上面数据库看着正常的,别着急,咱们换个方式看看,我们执行下面这个SQL看看数据存储的实际长度是多少。

SELECT
	LENGTH(
	CONVERT ( full_link USING utf8 )) AS actual_length 
FROM
	t_short_link 
WHERE
	id = '0fcc75b3e1b243c4b36d71b1d58b3b41';

执行结果:

好好的短链,url?1=1为啥变成了url???1=1

上面sql执行实际得到的长度是52,但是我们长链的实际长度却是49,那么问题就出来了,数据库里面多了两个我们肉眼看不见的字符,三个问号就是这个来的

  • 解决方案

从上面分析了事故现场,我们已经知道是多了两个字符了,删掉即可。

注意:因为数据库看不到,所以不能直接编辑,可以选择一些可以看到的编辑器编辑之后更新,例如notepad++。

3.4 额外发现

好好的短链,url?1=1为啥变成了url???1=1

四、总结

程序员大多数都非常自信,相信自己的代码没有bug,相信有bug也不是我的问题,有的时候怼天怼地。

但是真的遇到问题,需要三思而后行,谋定而后动;是不是自己的���题,先检查检查,避免后面发现是自己的问题很尴尬。

希望本文对您有所帮助。如果有任何错误或建议,请随时指正和提出。

同时,如果您觉得这篇文章有价值,请考虑点赞和收藏。这将激励我进一步改进和创作更多有用的内容。

感谢您的支持和理解!

转载自:https://juejin.cn/post/7399985723674394633
评论
请登录