资源
HTTP 请求的内容通称为"资源"。”资源“这一概念非常宽泛,它可以是一份文档,一张图片,或所有其他你能够想到的格式。每个资源都由一个 (URI) 来进行标识。
URIs
URI(统一资源标识符)是一个指向资源的字符串。包括 URL 和 URN 。
- URLs
URI 的最常见形式是统一资源定位符 (URL),它也被称为 Web 地址。
https://developer.mozilla.org
https://developer.mozilla.org/en-US/docs/Learn/
https://developer.mozilla.org/en-US/search?q=URL
- URNs
URN通过特定命名空间中的唯一名称来标识资源。为资源提供永久的、与位置无关的表示方法。允许简单将多个命名空间映射到单个URN命名空间。
urn:isbn:9780141036144
urn:ietf:rfc:7230
上面两个 URN 标识了下面的资源:
- 乔治·奥威尔所著的《1984》
- IETF规范7230,超文本传输协议 (HTTP/1.1):Message Syntax and Routing.
磁力链接常用URN表示,如magnet:?xt=urn:sha1:YNCKHTQC5C
统一资源标识符的语法
主要参考 RFC3986 文档
绝对URI
相对URI
scheme:scheme告诉浏览器使用何种协议。对于大部分 Web 资源,通常使用
HTTP
协议或其安全版本,HTTPS
协议。另外,浏览器也知道如何处理其他协议。例如,mailto:
协议指示浏览器打开邮件客户端;ftp:
协议指示浏览器处理文件传输。host:
www.example.com
既是一个域名,也代表管理该域名的机构。它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的 IP address 地址发起请求。但直接使用 IP 地址的场景并不常见。-
port:
:80
是端口。它表示用于访问 Web 服务器上资源的技术“门”。如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。 -
path:
/path/to/myfile.html
是 Web 服务器上资源的路径。在 Web 的早期,类似这样的路径表示 Web 服务器上的物理文件位置。现在,它主要是由没有任何物理实体的 Web 服务器抽象处理而成的。 -
query:
?key1=value1&key2=value2
是提供给 Web 服务器的额外参数。这些参数是用 & 符号分隔的键/值对列表。Web 服务器可以在将资源返回给用户之前使用这些参数来执行额外的操作。每个 Web 服务器都有自己的参数规则,想知道特定 Web 服务器如何处理参数的唯一可靠方法是询问该 Web 服务器所有者。 -
fragment:
#SomewhereInTheDocument
是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。 例如,在HTML文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器。
为什么要进行URI编码
一些字符可能导致歧义:
-
存在用作分隔符的保留字
不在ASCII码中和ASCII码不能显示的字符
不安全字符(传输环节中可能被不正确处理),如空格、引号、尖括号。中间的代理服务器可能会认为这种编码有问题从而截断。
解决方法:利用URI百分号编码
- pct-encoded =
%
HEXDIG
HEXDIG
注:十六进制数大小写等价 - 非ASCII码字符,先
utf-8
再US-ASCII
编码 - URI合法字符,编码不编码等价
例如,"URI转换''既可以表示为URI%e8%bd%ac%e6%8d%a
也可以表示为
%55%52%49%e8%bd%ac%e6%8d