标准URI格式:
scheme:[//[user[:password]@]host[:port]][/path][?query][#fragment]
包含:
-
scheme: 命名以字母开头,字母、数字、加号(
+
)、句点(.
)、短横线(-
)都是合法字符。不区分大小写,但是推荐全用小写。名字后面跟着一个冒号(:
)。举例:http(s)、ftp、mailto、file、data和irc。URI的scheme应该在Internet Assigned Numbers Authority注册,但是实际上也有没有注册的scheme正在使用中。 - <span id="double_slash">双斜杠</span>(
//
):有些scheme需要有些不需要。authority部分空缺的时候,path部分不能以双斜杠开始。 -
authority:
- 由用户名和密码组成的身份认证部分,用户名和密码以冒号隔开,后面跟着
@
-
host是注册名(包括但不限于主机名)或IP地址中的一个。IPv4必须为点分十进制格式,IPv6必须用
[]
括起来。 - 可选的port number,用冒号和host隔开
- 由用户名和密码组成的身份认证部分,用户名和密码以冒号隔开,后面跟着
-
path包含数据信息,通常为层级式结构的序列,每层之间以斜杠(
/
)分割开。这个序列类似于文件系统,或者就是对应于真实的文件系统。如果authority存在的话,path必须以斜杠(/
)开始。如果authority空缺的话,path也是以斜杠(/
)开始,但是不能以双斜杠(//
)开始。path一定存在,尽管有时候长度为0,因此path后面没有斜杠。path的最后可能会跟一个slug。 - 可选的query,用
?
与前面的部分隔开。query的文法没有很好的定义,但是一般来说都是用分隔符分开的键值对。 - 可选的fragment,用
#
和前面分开。fragment部分通常含有一个标识符用来指定二级资源,比如章节标题。当一级资源为HTML时,二级资源通常为某一个元素的id,网页会自动定位到元素的位置。
URI中的字符可以用ASCII表示大小写字母、数字、-
、.
、_
和~
。其他字符需要百分号编码。
ASCII中的: / ? # [ ] @
是URI中的保留字,所以也需要百分号编码。! $ & ' ( ) * + , ; =
在用作用户信息、host和path分隔符时可以不用编码。另外,:
和@
在path、query和fragment中时可以不编码;?
和/
在query和fragment的数据中可以不编码。
以下两个例子:
hierarchical part
┌───────────────────┴─────────────────────┐
authority path
┌───────────────┴───────────────┐┌───┴────┐
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
└┬┘ └───────┬───────┘ └────┬────┘ └┬┘ └─────────┬─────────┘ └──┬──┘
scheme user information host port query fragment
urn:example:mammal:monotreme:echidna
└┬┘ └──────────────┬───────────────┘
scheme path
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。