02-URL与资源

浏览​因特网资源

  • URI是一类更通用的资源标识符,URL与URN是它的子集
  • URL通过描述资源的位置来标识资源
  • HTTP规范将更通用的概念URI作为资源标识符,实际上,HTTP应用程序处理的知识URI的URL子集
  • URL可以通过HTTP之外的其他协议来访问资源。
    http链接一般由协议,服务器的位置(域名),资源路径组成,如下图

URL语法

URL通过不同方案进行不同资源的访问,不同方案URL语法会有些差异;但大多数URL方案的URL语法如下:

javascript 复制代码
/**
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
*/

URL最重要的三个部分是方案(scheme),主机(host)和路径(path),具体说明如下表:

组件 描述 默认值
方案(scheme) 访问服务器获取资源时要使用哪种协议
用户(user) 某些方案访问资源时需要的用户名 匿名
密码(password) 用户名后买你可能要包含的密码,中间由冒号(:)分隔 <E-mail地址
主机或域名(host) 资源宿主服务器的主机名或点分IP地址
端口(port) 资源宿主服务器正在监听的端口号。很多方案都有默认的端口号(HTTP的默认端口号为80) 每个方案特有
路径(path) 服务器上资源的本地名,由一个斜杠(/)将其与前面URL组件分隔开来。路径组件的语法是与服务器和方案有关的
参数(params) 某些方案会用这个组件来指定输入参数。参数为名/值对。URL中可以包含多个参数字段,它们相互之间以及与路径的其余部分用(;)分隔
查询(query) 某些方案会用这个组件传递参数以激活应用程序。查询组件的内容没有通用格式。用字符"?"将其与其余部分分隔开来
片段(frag) 一片或一部分资源的名字。引用对象时,不会将frag字段传送给服务器;这个字段是在客户端内部使用的。通过字符"#"将其与其余部分分隔开来

方案

  • 规定如何访问指定资源的主要标识符,URL的应用程序会根据此进行解析
  • 方案组件必须以一个字母符号开始,由第一个":"符号将其与URL其他部分分隔开来
  • 方案名与大小写无关http:与HTTP:是等价的

主机与端口

​* 主机组件标识了能够访问资源的宿主机器(域名或IP地址)

*端口组件标识了服务器正在监听的网络端口

用户名和密码

  • 很多服务器都要求输入用户名和密码才允许用户访问数据
  • 如果应用程序是用的URL方案要求输入用户名和密码,但用户没有提供,通常会插入一个默认的用户名和密码

路径

  • 说明资源位于服务器的什么地方
  • 路径通常像一个分级的文件系统路径
  • 每段路径都有自己的参数(params)组件

参数

  • 在URL中以字符;分隔URL其他部分
  • 以名值对的形式存在

查询字符串

  • 以?分隔URL其他部分
  • 以名值对的形式存在,多个名值对用&分隔

片段

  • 以#号分隔URL其他部分
  • HTTP服务器通常只处理整个对象,而不是对象的片段,客户端不能将片段传送给服务器
  • 浏览器会根据片段来显示对应的部分资源

URL快捷方式

指Web客户端可以理解并使用的几种快捷方式

相对URL

  • 相对URL是不完整的URL,需要依靠另一个被称为基础(base)的URL进行解析
  • 相对URL是URI的一种便捷缩略记法
  • 为一组资源的可移植性提供了一种便捷方式(如HTML与其相应的资源)
基础URL

基础URL是作为相对URL参考点是用,可以来自以下几个不同的地方

  • 在资源中显示提供
    有些资源会显式地指定URL。如,HTML文档中可能会包含一个定义了基础URL的HTML标记,通过它来转换那个HTML文档中的所有相对URL
  • 封装资源的基础URL
    没有显示指定的基础URL的资源中时,使用所属资源的URL作为基础
  • 没有基础URL
    某些情况下,没有基础URL,可能得到的是一个不完整或损坏的URL
解析相对引用

自动扩展URL

用户不需要输入完整的URL,浏览器会自动扩展。有以下两种方式

  1. 主机名扩展:只要有些小提示,浏览器通常就可以在没有帮助的情况下,将输入的主机名扩展为完整的主机名
  2. 历史扩展:将以前访问过的URL历史存储起来。当输入URL时,将输入URL与历史记录中的URL的前缀进行匹配,并提供一些完整的选项可以选择;

字符

URL是可移植的。它要统一第命名因特网上的所有资源,并且需要符合不同协议的传输规范,所以只能使用较小的,通用的安全字母表中的字符。但使用过程中,会遇到传递除安全字符外的其他字符,此时,就需要进行转义,再进行传输;

URL字符集

URL使用的字符集为US-ASCII字符集,有如下原因:

  1. 计算机系统字符集通常倾向于以英语为中心,很多计算机应用程序使用的都是US-ASCII字符集
  2. 历史悠久,可移植性好。通过转义序列,可以使用US-ASCII字符集的有限子集对任意字符值或数据进行编码,实现了可移植性与完整性
编码机制

使用转义来表示不安全字符,此转义表示法包含一个百分号(%),后面跟着两个字符ASCII码的十六进制数,常用的转义字符如:

字符 ASCII码 示例
~ 126(0x7E) https://xxx/E
空格 32(0x20) https://xxx/ xxx
% 37(0x25) https://xxx/100%25
字符限制

URL中,有几个字符被保留起来,有特殊含义,有些字符不在定义的US-ASCII可打印字符集中,有些则会与某些因特网网关和协议产生混淆。以下字符,除了用于保留用途之外的场合时,要在URL中进行编码

字符 保留/受限
% 保留作为编码字符的转义标志
/ 保留作为路径组件中分隔路径段的界定符
. 保留在路径组件中使用
... 保留在路径组件中使用
# 保留作为分段定界符使用
? 保留作为查询字符串定界符使用
; 保留作为参数定界符使用
: 保留作为方案、用户/口令,以及主机/端口组件的定界符自用
$ , + 保留
@ & = 在某些方案的上下文中有特殊含义,保留
{ } | \ ^ ~ [ ] ' 由于各种Agent代理,比如各种网关的不安全处理,使用受限
< > " 不安全;这些字符在URL范围之外通常是有意义的,比如在文档中对URL自身进行定界,所以应该对其进行编码
0x00-0x1F,0x7F 受限,这些十六进制范围内的字符都在US-ASCII字符集的不可打印区间内
>0x7F 受限,十六进制值在此范围内的字符都不在US-ASCII字符集的7比特范围内
相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习