在浏览器输入网址,Enter之后发生了什么?

a114c6de06bc923321230604e10aa424.gif

在浏览器输入网址,Enter之后发生了什么?

很多八股文会给出:

  1. 1. DNS Resolution

  2. 2. Establishing a Connection

  3. 3. Sending an Http Request

  4. 4. Receiving the HTTP Response

  5. 5. Rendering the Web Page

但今天我斗胆插入第0.9步URL Parsing

URL( uniform resource locator)由四部分组成:scheme、domain、path、resource

5305f2c29b44cc3748fed87c6324c166.png

URL Parsing做了2个事情:

  • • prase url:只有解析分离出domain,还有后续的第1步: DNS resolution

  • • url_encode

本文我主要想聊一聊url_encode

  1. 1. 为什么会有url_encode?

  2. 2. javascript encodeURI() vs encodeURIComponent()

  3. 3. 我为什么会关注到这个问题?

  4. 4. 常见的httpclient默认有做url_encode吗?


在浏览器插入https://www.baidu.com/s?wd=博客园马甲哥,Enter之前童鞋们可尝试拷贝地址栏, 粘贴到任意位置, 内容是:https://www.baidu.com/s?wd=%E5%8D%9A%E5%AE%A2%E5%9B%AD%E9%A9%AC%E7%94%B2%E5%93%A5, 这就是浏览器自动url_encode的结果, 浏览器会拿这个网址去做 dns、request行为。

1. 为什么会有url_encode?

url_encode 又叫百分号编码,为什么要有url_encode[1],看知乎。

总结下来:uri地址最初要求是以可显示、可写的 ascii 字符集, 非英文字符和其他特殊字符需要被编码。

默认按照UTF-8转化为字节流,每个字节按16进制表示,并添加%组成一个percent编码。

UTF-8 到底是什么意思?[2]

例如:汉字 “你好”

  • • UTF-8字节流打印为:-28 -67 -96 -27 -91 -67

  • • 对应的16进制表示为:E4 BD A0 E5 A5 BD

  • • URLEncode编译后为:%E4%BD%A0%E5%A5%BD

当然服务端会对应的url_decode函数,编码/解码的次数需要对应。

2. js 中的encodeURI() vs encodeURIComponent()

是js 中内置的全局函数,用于url_encode,不会对以下特殊字符编码,这也是为了确保url中原生字符的正确表达: A–Z a–z 0–9 - _ . ! ~ * ' ( ) ; / ? : @ & = + $ , #

const uri = 'https://mozilla.org/?x=шеллы';
const encoded = encodeURI(uri);
console.log(encoded);
// Expected output: "https://mozilla.org/?x=%D1%88%D0%B5%D0%BB%D0%BB%D1%8B"

encodeURIComponent 也是全局函数,但他的用途是对字符串做完整的url_encode, 这个函数会对上面排除的字符做编码,这个函数一般用于已知是特殊字符需要做url编码。

// Encodes characters such as ?,=,/,&,:
console.log(`?x=${encodeURIComponent('test?')}`);
// Expected output: "?x=test%3F"
3.我为什么会想到这个问题?

我在使用lua-resty-http客户端做反向代理请求时关注到这个问题。

1720f20cfb98680283b08bdcfe3fe832.png

nginx内置变量并提供了自定义变量的能力[3]

  • • $request_uri
    full original request URI (with arguments)

  • • $uri
    current URI in request, normalized, The value of $uri may change during request processing, e.g. when doing internal redirects, or when using index files.

一开始lua_resty_http 将 $uri(解码值)送到应用,不符合应用的预期, 我这才发现应恢复成原始编码uri[4]

4. 常见的httpclient是否能自动url_encode?

.NET、go、lua的HttpClient(包括curl)都不会自动对 URL 进行编码。如果你的 URL 包含特殊字符或需要编码的字符,你需要自己手动进行 URL 编码。

  • • [C#] System.Net.WebUtility.UrlEncode

  • • [golang] url.QueryEscape(rawURL)

  • • [lua] ngx.escape_uri(str, 0)

本文记录了url_encode的来龙去脉;引用的知乎外链都是高赞答案,人人为我我为人人; 整理了常见httpclient url_encode的表现。  

文字和图片均为原创,一家之言,欢迎留言吐槽。

引用链接

[1] 为什么要有url_encode: https://zhuanlan.zhihu.com/p/557035152?utm_id=0
[2] UTF-8 到底是什么意思?: https://zhuanlan.zhihu.com/p/137875615
[3] nginx内置变量并提供了自定义变量的能力: https://nginx.org/en/docs/http/ngx_http_core_module.html
[4] 应恢复成原始编码uri: https://stackoverflow.com/questions/78225022/is-there-a-lua-equivalent-of-the-javascript-encodeuri-function

ed4eda19b88f6f5f06000f3297f47df5.gif

自古以来,同步/异步都是八股文第一章

async/await 贴脸输出,这次你总该明白了

流量调度、微服务可寻址性和注册中心

Go语言正/反向代理的姿势

两将军问题和TCP三次握手

"家长进校园"之《计算机和人工智能》

a068963a168236041bcb31eb867aed77.png

点“1bdf17b25e867d3a2e7659d7c02ffd7c.gif戳“在看5a462ff8c58d8640525ff31900af1612.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2981184.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

为什么堆排序的时间复杂度是O(N*logN)?

目录 前言: 堆排序(以排升序为例) 步骤(用大根堆,倒这排,排升序): 1.先把要排列的数组建立成大根堆 2.堆顶元素(82)和最后一个元素交换(2&…

【随想录】Day30—第七章 回溯算法part06

目录 题目1: 重新安排行程1- 思路2- 题解⭐重新安排行程 ——题解思路 题目2: N皇后1- 思路2- 题解⭐N皇后 ——题解思路 题目3: 解数独(跳过) 题目1: 重新安排行程 题目链接:332. 重新安排行程 1- 思路 思路: 本题实际上是一个…

2024第24届营养健康展/北京健康展/健康食品展

第24届中国国际营养健康产业博览会 2024HEC营养健康展/北京健康展/大健康展 2024北京大健康展/营养健康展/北京健康展 2024第24届营养健康展/北京健康展/健康食品展 2024北京健康展/营养品展/HEC营养健康展 HEC2024与您共同打造健康梦-做中国最具权威性的大健康…

H264 编码标准常见术语解释

H264 编码标准 H.264编码标准,也被称作MPEG-4 AVC(Advanced Video Coding),是一种被广泛使用的数字视频压缩标准,由国际电信联盟(ITU-T)和国际标准化组织(ISO)共同开发。…

ArcGIS教程:降雨量插值

一、目标 制作一副年平均降雨量的地图。 二、数据 某地的175个气象站数据的shp文件station.shp,以及这个地方轮廓的栅格数据idoutlgd。 数据下载链接:数据下载链接 三、制作方法 1.首先加载数据。 2.在菜单栏/customize/toolbars/中找到geostatisti…

AI图书推荐:如何用ChatGPT和Python进行数据可视化

《如何用ChatGPT和Python进行数据可视化》的原版英文图书标题:Python 3 Data Visualization Using ChatGPT - GPT-4 ,作者是 Oswald Campesato ,2023年出版 本书旨在向读者展示Python 3编程的概念和数据可视化的艺术。它还探讨了使用ChatGPT/…

模块化 DeFi L2 “Mode” 整合 Covalent Network(CQT),以获 Web3 最大数据集的支持

Covalent Network(CQT),作为 Web3 领先的数据层,宣布其统一 API 将与 Mode 集成,以加快其基于以太坊构建的专注于 DeFi 的模块化 Layer2 方案的数据访问速度。这一战略合作将通过为开发者提供更强大的工具和能力&#…

8.0MGR单主模式搭建_克隆(clone)插件方式

为了应对事务一致性要求很高的系统对高可用数据库系统的要求,并且增强高可用集群的自管理能力,避免节点故障后的failover需要人工干预或其它辅助工具干预,MySQL5.7新引入了Group Replication,用于搭建更高事务一致性的高可用数据库…

快解析搭建网站解决方案

在如今网络时代下,各行各业都需要有自己的门户网站。 企业搭建自己的门户网站,有着众多实际意义: 1.可以全面详细地介绍企业及企业产品,这是企业网站的一个最基本的功能。企业可以把任何想让大众知道的信息放到网站,当人们想知道…

如何从架构层面降低公有云多可用区同时故障的概率

阿里云和腾讯云都曾出现过因一个组件故障而导致所有可用区同时瘫痪的情况。本文将探讨如何从架构设计的角度减小故障域,在故障发生时最小化业务损失,并以 Sealos 的稳定性实践为例,分享经验教训。 抛弃主从,拥抱点对点架构 从腾…

Xilinx 7系列MMCM/PLL 编程时参数值的确定

MMCM/PLL 的编程必须遵循一套流程,以确保配置的稳定性和性能。本文将描述了如何根据特定的设计要求来编程 MMCM/PLL。设计可以通过两种方式实现:直接通过图形用户界面(Clocking Wizard 时钟向导)或通过实例化来实现 MMCM/PLL。无论…

LabVIEW与Modbus协议的多点温度监控系统

LabVIEW与Modbus协议的多点温度监控系统 随着工业自动化和智能化水平的不断提升,对于现场监控技术的需求日益增长。开发了一种基于LabVIEW与Modbus协议的多点温度监控系统,实现高效、准确的温度数据采集、处理和显示,以及数据存储功能&#…

python爬虫学习第二十八天-------了解scrapy(二十八天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

related_name和related_query_name属性

在Django模型继承中,假如在外键或多对多字段中使用了related_name属性或related_query_name属性,则必须为该字段提供一个独一无二的反向名字和查询名字。但是,这样在抽象基类中一般会引发问题,因为基类中的字段都被子类继承并且保…

Photoshop 2024 25.4蓝猫版_支持参数滤波器和Ai神经滤镜

网盘下载 Photoshop 2024 (Beta) 蓝猫版v25.4.0(2426)全新功能:支持参数滤波器和AI神经滤镜。 最新的PS 25.4 Beta版新增了参数滤波器(Parametric Filters)功能,而正式版的PS 2024还没有这个功能,只有Beta版才有&…

数据可视化———Tableau

基本认识: 维度:定性—字符串文本,日期和日期时间等等 度量:定量—连续值,一般属于数值 数据类型: 数值 日期/日期时间 字符串 布尔值 地理值 运算符 算数运算符:加减乘除,%取余,…

vue: vscode安装扩展Volar失败(保姆级教程+图文结合)

1 vscode插件离线下载vsix文件 2.1 打开vscode插件市场地址 ​​​​​​https://marketplace.visualstudio.com/search?termvue&targetVSCode&categoryAll%20categories&sortByRelevance 2.2 搜索插件,Vue.volar 1 2.3 下载vsix文件 打开 vetur插件地址&…

GUI测试首推!TestComplete 帮助有效缩短 40-50% 测试时长!

TestComplete 是一款自动化UI测试工具,这款工具目前在全球范围内被广泛应用于进行桌面、移动和Web应用的自动化测试。 TestComplete 集成了一种精心设计的自动化引擎,可以自动记录和回放用户的操作,方便用户进行UI(用户界面&…

蓝桥杯:日期问题(我的绝望题)

🎁个人主页:我们的五年 🔍系列专栏:每日一练 🌷追光的人,终会万丈光芒 目录 前言: 🌷1.问题描述: 1.问题描述: 2.输入格式: 3.输出格式&#…

常见大厂面试题(SQL)01

知乎问答最大连续回答问题天数大于等于3天的用户及其对应等级 1.描述 现有某乎问答创作者信息表author_tb如下(其中author_id表示创作者编号、author_level表示创作者级别,共1-6六个级别、sex表示创作者性别): author_id author_level sex 101 …