资源和URL
资源
HTTP 请求的内容通称为“资源”。”资源“这一概念非常宽泛,它可以是一份文档,一张图片,或所有其他你能够想到的格式。每个资源都由一个 URI 来进行标识,例如下面的url其实是一张图片
1 | https://pic.imge.cc/2024/08/11/66b8b34a1deb8.jpg |
URL与URN
URL
网址即URL(统一资源定位符),也就是web地址,例如下面就是一个URL
1 | https://ourobros.top |
URL 由多个必须或可选的组件构成。下面给出了一个复杂的 URL
1 | https://ourobros.top/xss%E6%BC%8F%E6%B4%9E%E7%9B%B8%E5%85%B3%E5%AD%A6%E4%B9%A0/ |
1 | URL标准语法:协议://主机:端口/路径?参数1=值1&参数2=值2#片段标识符 |
协议
于大部分 Web 资源,通常使用 HTTP 协议或其安全版本,HTTPS 协议。另外,浏览器也知道如何处理其他协议。例如, 协议指示浏览器打开邮件客户端;协议指示浏览器处理文件传输。常见的方案有:mailto:ftp:(更多协议见下图)
主机
www.example.com 既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的 IP address 地址发起请求。但直接使用 IP 地址的场景并不常见
端口
:80 是端口。它表示用于访问 Web 服务器上资源的技术“门”。如果访问的该 Web 服务器使用 HTTP 协议的标准端口(HTTP 为 80,HTTPS 为 443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。
路径
路径(/path/to/myfile.html)是 Web 服务器上资源的路径。在 Web 的早期,类似这样的路径表示 Web 服务器上的物理文件位置。现在,它主要是由没有任何物理实体的 Web 服务器抽象处理而成的。
参数
?参数1=值1&参数2=值2(?key1=value1&key2=value2)是提供给 Web 服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。Web 服务器可以在将资源返回给用户之前使用这些参数来执行额外的操作。每个 Web 服务器都有自己的参数规则,想知道特定 Web 服务器如何处理参数的唯一可靠方法是询问该 Web 服务器所有者。
片段
#片段标识符(#SomewhereInTheDocument)是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。例如,在 HTML 文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器。
1 | ##例如 |
URNs
URN 是另一种形式的 URI,它通过特定命名空间中的唯一名称来标识资源。
1 | urn:isbn:9780141036144 |
Data URL
Data URL,即前缀为 data: 协议的 URL,其允许内容创建者向文档中嵌入小文件。它们之前被称作“data URI”,直到这个名字被 WHATWG 弃用。
1 | #语法 |
1 | #示例 |
base64编码
Window.btoa()(也在 worker 中可用:从二进制数据字符串创建一个 Base64 编码的 ASCII 字符串(“btoa”应看作“从二进制到 ASCII”)
Window.atob()(也在 worker 中可用):解码通过 Base64 编码的字符串数据(“atob”应看作“从 ASCII 到二进制”)
linux中base64编码命令
1 | echo -n hello|base64 |
Window中进行base64编码
在 Windows 中,PowerShell 的 Convert.ToBase64String可用于执行 Base64 编码:
1 | [convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes("hello")) |
另一种方案是:使用 GNU/Linux shell (例如 WSL)提供的使用工具 base64:
1 | bash$ echo -n hello | base64 |
ps:但是感觉window中base64位编码最好的方法是找一个base64编码网站或者随便找个工具
[!NOTE]
许多安全问题(例如,钓鱼网站)已与 data URL 相关联,并在浏览器的顶层导航到它们。为了缓和这样的问题,在所有现代浏览器中,在顶层导航到 data: URL 是被禁止的。
MIME类型
介绍
MIME 类型通常仅包含两个部分:类型(type)和子类型(subtype),中间由斜杠 / 分割,中间没有空白字符:
1 | type/subtype |
类型代表数据类型所属的大致分类,例如 video 或 text
子类型标识了 MIME 类型所代表的指定类型的确切数据类型。以 text 类型为例,它的子类型包括:plain(纯文本)、html、calender(iCalendar/.ics 文件)
每种类型都有自己的一组可能的子类型。一个 MIME 类型总是包含类型与子类型这两部分,且二者必需成对出现。
有一个可选的参数,能够提供额外的信息:
1 | type/subtype;parameter=value |
例如,对于主类型为text的任何MIME类型,可以添加可选的charset参数,以指定数据中的字符所使用的字符集。如果没有指定 charset,默认值为ASCII(US-ASCII),除非被用户代理(User agent)的设置覆盖。要指定UTF-8文本文件,则使用MIME类型text/plain;charset=UTF-8
MIME 类型对大小写不敏感,但是传统写法都是小写。参数值可以是大小写敏感的。
分类
类型可分为两类:独立的(discrete)和多部分的(multipart)。独立类型代表单一文件或媒介,比如一段文字、一个音乐文件、一个视频文件等。而多部份类型,可以代表由多个部件组合成的文档,其中每个部分都可能有各自的 MIME 类型;此外,也可以代表多个文件被封装在单次事务中一同发送。多部分 MIME 类型的一个例子是,在电子邮件中附加多个文件。
独立类型
application:
不明确属于其他类型之一的任何二进制数据;要么是将以某种方式执行或解释的数据,要么是需要借助某个或某类特定应用程序来使用的二进制数据。通用二进制数据(或真实类型未知的二进制数据)是 application/octet-stream。其他常用的示例包含 application/pdf、
application/pkcs8和application/zip
audio:
音频或音乐数据。常见的示例如 audio/mpeg、audio/vorbis
example:
在演示如何使用 MIME 类型的示例中用作占位符的保留类型。这一类型永远不应在示例代码或文档外使用。example也可以作为子类型。例如,在一个处理音频有关的示例中,MIME 类型 audio/example 表示该类型是一个占位符,且在实际使用这段代码时,此处应当被替换成适当的类型。
font:
字体/字型数据。常见的示例如 font/woff、font/ttf 和 font/otf
image:
图像或图形数据,包括位图和矢量静态图像,以及静态图像格式的动画版本,如 GIF 动画或 APNG。常见的例子有 image/jpeg、image/png 和 image/svg+xml
model:
三维物体或场景的模型数据。示例包含 model/3mf 和 model/vrml
text:
纯文本数据,包括任何人类可读内容、源代码或文本数据——如逗号分隔值(comma-separated value,即 CSV)格式的数据。示例包含:text/plain、text/csv 和 text/html
video:
视频数据或文件,例如 MP4 电影(video/mp4)
[!NOTE]
对于那些没有明确子类型的文本文档,应使用 text/plain。类似的,没有明确子类型或子类型未知的二进制文件,应使用 application/octet-stream。
多部份类型
多部分类型指的是一类可分成不同部分的文件,其各部分通常是不同的 MIME 类型;也可用于——尤其在电子邮件中——表示属于同一事务的多个独立文件。它们代表一个复合文档。
message:
封装其他信息的信息。例如,这可以用来表示将转发信息作为其数据一部分的电子邮件,或将超大信息分块发送,就像发送多条信息一样。例如,message/rfc822(用于转发或回复信息的引用)和 message/partial(允许将大段信息自动拆分成小段,由收件人重新组装)是两个常见的例子。
multipart:
由多个组件组成的数据,这些组件可能各自具有不同的 MIME 类型。例如,multipart/form-data(用于使用 FormData API 生成的数据)和 multipart/byteranges
比较重要的MIME类型
1 | #这是二进制文件的默认值 |
音频与视频类型
可用于HTML表单从浏览器发送信息给服务器
multipart/form-data
1 | #作为多部分文档格式,它由边界线(一个由双横滑线 -- 开始的字符串)划分出的不同部分组成。每一部分有自己的实体,以及自己的 HTTP 请求头,Content-Disposition 和 Content-Type 用于文件上传字段。 |
如下所示的