URN+URL=>URI
用来 locator 或 name 互联网上的一个资源
自 2005 年的 RFC 3986 以来,术语 URN 和 URL 已经在技术标准中被弃用了,取而代之的是 URI。
URI 是 2001 年在 W3C 和 IETF 开联合会议的时候提出的,它是一个字符串,用来 identify(标识)或 name(命名)互联网上的一个资源。
URI,Uniform Resource Identifier,统一资源标识符。包含了 URL 和 URN:
URL,Uniform Resource Locator,统一资源定位符
是 locator(定位器),可以和指定的协议一起解析为相应的资源
URN,Uniform Resource Name,统一资源名称
不是 locator,也不需要可解析
与位置无关,不需要和特定的协议或访问方法相关联
目前,在 IETF 的正式技术标准中,已经不区分 URL 和 URN 了。技术出版物,尤其是 IETF 和 W3C 制定的标准,通常会使用通用术语 URI。而 WHATWG 制定的规范更喜欢用 URL 而不是 URI,因此 HTML5 API 使用的也是 URL。
IETF,Internet Engineering Task Force,互联网工程任务组(比如 TCP/IP 协议栈)
W3C,World Wide Web Consortium,万维网联盟,又称 W3C 联盟、W3C 理事会
WHATWG,Web Hypertext Application Technology Working Group,网页超文本应用技术工作小组
1994 年 Tim Berners-Lee 创立了 W3C,该联盟于 1996 年创建了 XML,并建议用更严格的 XHTML 代替 HTML。 与此同时,开发人员开始利用 IE 的功能 XMLHttpRequest 来制作 Ajax 应用程序并启动了 Web 2.0 革命。 Mozilla、Opera 和 Apple 拒绝了 XHTML,并创建了开发 HTML5 的 WHATWG。 2009 年,W3C 承认并放弃了 XHTML,并在 2019 年将 HTML 规范的控制权让给了 WHATWG。
在前端领域,W3C 和 WHATWG 各自负责的标准详见 Web 技术 / Web API 一览表。
1. URI
URI,Uniform Resource Identifier,统一资源标识符。
URI 是一个唯一的字符串,用来 identify(标识)web 技术使用的逻辑资源和物理资源。URI 可以用来标识任何事物。可以是现实世界中的物品,比如人、地方、概念;也可以是信息资源,比如网页、书籍。
一些 URI 提供了 locate(定位)和 retrieve(检索)网络资源的方法,它们是 URL;另一些 URI 仅提供资源的唯一 name 而没法定位和检索,它们是 URN。
1.1 URN
URN,Uniform Resource Name,统一资源名称。
URN 能 identify(标识)一个资源,是通过特定 namespace 中的 name。它可以用来谈论一个资源,而不暗示其位置以及如何访问它。比如,在国际标准书号(ISBN)系统中,ISBN 0-486-27557-4
标识莎士比亚戏剧《罗密欧与朱丽叶》的特定版本,该版本的 URN 就是 urn:isbn:0-486-27557-4
,然而它没提供去哪可以找到该书副本的信息。
术语 URN 现在继续作为诸多 URI 协议(scheme)中的一种。urn
协议的语法如下:
为了保证 URN 命名空间的全球唯一性,它们的标识符 NID 需要在 IANA 注册。
1.2 URL
URL,Uniform Resource Locator,统一资源定位符。
URL,俗称网址(web address),是对 web 资源的引用,它指定了资源的 access mechanism 和 network location。比如 http://example.org/wiki/Main_Page
指的是标识为 /wiki/Main_Page
的资源,它可以通过 HTTP 协议从域名是 example.org
的 network host(网络主机)上获取。
除了引用 web page(HTTP http
),URL 还可以用于文件传输(ftp
)、电子邮件(mailto
)、数据库访问(Java Database Connectivity)以及许多其它应用程序。
每个 URL 都符合 URI 的通用语法。
1.3 URN vs URL
URN 类似于一个人的身份证号码,而 URL 类似于他们的街道地址。
换句话说,URN 标识(identify)一个项目(item),而 URL 提供一种查找它的方法。
2. URI 的通用语法
URI 有一个 scheme(协议),它指向在该 scheme 内分配 identifier(标识符)的规范。所以,URI 语法是一个联合的和可扩展的命名系统,其中每个 scheme 的规范都可以进一步规定使用 identifier 的语法和语义。
URI 的通用语法是所有 URI scheme 语法的超集,它定义于 1998 年 8 月发布的 RFC 2396,定稿于 2005 年 1 月发布的 RFC 3986。
2.1 字符组成
URI 由一组允许的 ASCII 字符组成,包括:
非保留字符:大小写字母、十进制数字,以及
-._~
保留字符
通用分隔符
:/?#[]@
特定于 scheme 及其实现的
!$&'()*+,;=
2.2 语法结构
URI 的通用语法由五部分组成,其顺序是按照重要性从左到右依次递减的。如下:
两个必需的部分:
scheme 不能为空
一个新 scheme 应该在 IANA 那里注册,虽然在实践中也会使用非注册 scheme
推荐小写:指定 scheme 的文档必须使用小写字母,尽管 sheme 本身是不区分大小写的
path 不能为空
在实践中如果省略了,则默认是根目录
/
IANA,Internet Assigned Numbers Authority,互联网号码分配局。IANA 是一个标准组织,负责监督全球的 IP address 分配、自治系统编号分配、DNS 中的 root zone 管理、media types 以及其它与 internet protocol 相关的 symbols 和 internet numbers。
2.3 通用分隔符
generic syntax(通用语法)使用 :/?#
等字符来分隔 generic parser 的重要组件。
:
用来分隔 scheme 和 authority因为 scheme 不能为空,所以通常
:
也是必须的。有时也会看到 scheme 这样写
https:
,mailto:
,data:
,file:
,ftp:
//
作为 authority 的前缀字符URL 在定义之初结合了已存在的 domain name 系统(创建于 1985 年)和 file path 语法(用
/
来分隔 directory 和 filename)。当时的惯例是,完整的 file path 是以 server name 为前缀,且前面有个双斜杠//
不过,Berners-Lee 后来有提到,URI 里的
//
有些没必要
:
在 authority 中分隔host:port
?
作为 query 的前缀字符#
作为 fragment 的前缀字符[]@
在 authority 中分隔 userinfo(出于安全考虑,已经不推荐使用了)
2.4 scheme
许多 URI scheme 都在 IANA 注册过了,然而也存在很多非官方的 URI scheme。
2.4.1 已注册的
这里列一些常见的 scheme,比如:
http
https
view-source
查看网页源码
view-source:<absolute-URI>
mailto
电子邮件
mailto:<address>[?<header1>=<value1>[&<header2>=<value2>]]
mailto:jsmith@example.com?subject=A%20Test&body=My%20idea%20is%3A%20%0A
tel
电话号码
tel:<phonenumber>
tel:+1-816-555-1212
data
内嵌小数据项
data:<mediatype>[;base64],<data>
file
本地系统文件
file://host/path
file:///path
是 empty hostname
file:/path
是 no hostname
file://localhost/etc/fstab
file:///etc/fstab
file:/etc/fstab
file:///Users/username/Desktop/git.png
file:/Users/username/Desktop/git.png
ftp
File Transfer Protocol
ftp://ftp.is.co.za/rfc/rfc1808.txt
jar
压缩包
jar:<url>!/[<entry>]
telnet
teletype network
telnet://<user>:<password>@<host>[:<port>/]
ssh
Secure Shell Protocol
ssh://[<user>[;fingerprint=<host-key fingerprint>]@]<host>[:<port>]
git
git 仓库
git://github.com/user/project-name.git
svn
dns
域名解析系统
dns:[//<host>[:<port>]/]<dnsname>[?<dnsquery>]
dns:example?TYPE=A;CLASS=IN
dns://192.168.1.1/ftp.example.org?type=A
udp
about
显示产品信息和内部信息
about:
about:about
about:blank
about:plugins
about:cache
chrome
指定在基于 Mozilla 的浏览器中使用 XUL 构建的用户界面
chrome://<package>/<section>/<path>
用于管理 Google Chrome 的设置
chrome://<settings>/<path>/[<specificSetting>]
chrome-extension
管理已安装 extension 的设置
chrome-extension://<extensionID>/<pageName>.html
feed
网络订阅
feed:<absolute_uri>
feed://<hierarchical part>
feed://example.com/rss.xml
feed:https://example.com/rss.xml
irc
连接到 Internet Relay chat 服务器以加入某个 channel
irc://<host>[:<port>]/[<channel>[?<password>]]
facetime
视频会议软件
facetime://<address>|<MSISDN>|<mobile number>
facetime://+19995551234
callto
skype
启动 Skype 通话
callto:<screenname>
callto:<phonenumber>
skype:<username|phonenumber>[?[add|call|chat|sendfile|userinfo]]
fax
用于传真号码
fax:<phonenumber>
urn
urn:<namespace>:<specificpart>
2.4.2 非官方的
这里列一些非官方但常见的 scheme,比如:
javascript
执行 JS 代码
javascript:<javascript to execute>
app
mobile deep link,能直接打开一个 mobile app
app://<application>/<path>
app://com.foo.bar/index.html
admin
更安全地访问具有管理权限的文件,而不是不安全的 sudo, gksu, gksudo
admin:/<path>/<to>/<file>
gedit admin:/etc/default/grub
odbc
打开数据库连接
jdbc
Java 连接数据库
jdbc:somejdbcvendor:other_data...
jdbc:oracle:oci:@host:port(sid or [/service])?params...
jdbc:sqlserver://serverName\instanceName:portNumber;params...
jdbc:mysql://host:port/database?params...
2.5 port
service name 和 port number 用来区分运行在 TCP、UDP、DCCP 和 SCTP 等传输协议上的不同服务。
service name 的分配是按照先到先得的流程,port number 的分配是基于以下三个范围:
0-1023,system port,只能由 root 用户使用
1024-49151,user port
49152-65535,dynamic port 或 private port
下面列一些常见的:
tcpmux
1
tcp
udp
TCP Port Service Multiplexer
echo
7
tcp
udp
Echo
ftp
21
tcp
udp
sctp
File Transfer Protocol
ssh
22
tcp
udp
sctp
The Secure Shell (SSH) Protocol
telnet
23
tcp
udp
Telnet
time
37
tcp
udp
Time
domain
53
tcp
udp
Domain Name Server
whoispp
63
tcp
udp
whois++
sql-net
66
tcp
udp
Oracle SQL*NET
tftp
69
tcp
udp
Trivial File Transfer
http
www
www-http
80
tcp
udp
World Wide Web HTTP
hostname
101
tcp
udp
NIC Host Name Server
sftp
115
tcp
udp
Simple File Transfer Protocol
sqlserv
118
tcp
udp
SQL Services
sql-net
150
tcp
udp
SQL-NET
sqlsrv
156
tcp
udp
SQL Service
irc
194
tcp
udp
Internet Relay Chat Protocol
https
443
tcp
udp
sctp
说明:www
, www-http
是 http
service 的副本,不应该用于 discovery 的目的。
3. 主要参考
Last updated