URL查询字符串详解:如何读懂和构造

URL里"?"后面那一长串文字看起来像是随机的,其实只要摸清规律,它遵循一套相当严格、可以直接读懂的结构。

以"?"开头,用"&"分隔各个参数

以https://example.com/search?q=cats&sort=new为例,"?"之后的部分就是查询字符串,"&"用来分隔一个个key=value的参数对。

每个参数都是一对key=value

q=cats表示名为"q"的参数,取值为"cats"。参数的顺序一般不影响结果,一个URL可以携带任意数量的参数。

特殊字符会被百分号编码

在URL中具有特殊含义的字符(空格、&、=、?以及非ASCII字符等)会被转换成%XX形式的十六进制编码,比如空格会变成%20或+,所以"new york"会被编码成"new%20york"。

同一个key可以重复出现

一些系统会用重复的key(如tag=cat&tag=dog)或者带方括号的写法(如tag[]=cat&tag[]=dog)来表示一个列表(数组)类型的值,具体如何解读取决于接收方的后端或框架实现,而不是URL本身的统一规则。

UTM参数本质上只是带营销约定的查询参数

utm_source、utm_medium、utm_campaign等并不是URL自带的特殊功能,而是Google Analytics等分析工具约定俗成读取的一套非正式命名规范,在URL中依然只是普通的查询参数。

查询字符串存在的意义

它让一个URL、一个页面能够携带可变的数据,而不需要为每一种可能的状态单独建一个页面。搜索结果、筛选条件、分页、追踪统计和API请求,基本都依赖通过URL传递参数这一机制。之所以能对某个特定的筛选结果收藏或分享,正是因为这种状态本身就保存在URL里。

如何手动构造一条查询字符串

把每一对key=value用"&"连接起来,并在拼接前先对每个key和value中的特殊字符做百分号编码,最后在整体前面加上"?",拼接到基础URL后面即可。编码这一步没做对,是链接失效最常见的原因,尤其是内容中包含空格或非ASCII字符的时候。

常见问题

查询字符串是完全可见的吗,安全吗?

是的,它会完整出现在浏览器地址栏、浏览历史、服务器日志中,还常常会随"Referer"请求头被发送到其他网站。因此绝对不应该用它来传递密码之类的敏感信息,即便走的是HTTPS连接,这一点也不会改变。

查询字符串和URL的路径部分有什么区别?

路径(比如/products/shoes)通常以相对固定的层级结构来标识某一个具体资源。查询字符串(?color=red&size=10)则是用来传递可选的、可变的参数,对这个资源做筛选或调整,避免为每一种参数组合都单独建一个路径。