绝对URL的解析规则

来源:互联网 发布:匡恩网络太有钱了 编辑:程序博客网 时间:2024/06/11 12:51

参考自:RFC1738

URL最抽象的表示可以用下面的描述来表示:

<URL>= <方案>: <方案描述部分>

其中,方案名称有几个主要规则如下:

  • 方案名称由字母,数字,加号(+),小数点(.),减号(-)组成
  • 方案名称必须以字母打头
  • 方案名称是大小写无关的

不同的方案所对应的方案描述部分会有所差异,下面就几个常用的方案进行描述。

http和https

这两个都是超文本传输协议方案,唯一的区别在于https使用了网景的SSL提供的端到端的加密机制。http的默认端口是80,https的默认端口是443,两者的URL语法类似,如下所示:

(http|https)://<主机名>:<端口号>/<路径>?<查询字段>#<片段>

mailto

这个指向的是邮件地址,它并不指向任何可以直接访问的对象。一般浏览器在处理这类URL的做法往往是直接启动邮件客户端。其语法格式如下所示:

mailto:<电子邮件地址>

ftp

FTP协议可以用来从FTP服务器上下载或上传文件,并获取FTP服务器上的目录结构内容的列表。FTP的URL遵循下面的格式:

ftp://<用户名>:<密码>@<主机名>:<端口>/<路径>;<参数>

rtsp和rtspu

rtsp的URL是可以通过实时流传输协议解析的音频或者视频媒体资源的标识符。其中,rtspu中的u表示它是使用UDP协议来获取资源的。其基本格式如下:

(rtsp|rtspu)://<用户名>:<密码>@<主机名>:<端口号>/<路径>

file

file方案表示一台指定主机(通过本地文件系统、网络文件系统或其它一些文件共享系统)上可以直接访问的文件。各字段都遵循通用格式。如果省略了主机名,就默认使用本地主机。格式如下:

file://<主机名>/<路径>

news

方案news用来访问一些特定的文章或者新闻组。它有一个很独特的性质,那就是news的URL自身包含的信息不足以对资源进行定位。也就是说,news的URL中缺乏到何处获取资源的信息。而这项工作是解释程序的工作。

新闻资源可以从多台服务器中获得。它们被称为位置无关的,因为对它们的访问不依赖于任何一个源服务器。

新闻URL的形式有下面两种:

news:<新闻组名称>

news:<新闻编号>@<新闻组名称>

注意,如果新闻组名称是“*”,则代表所有可用的新闻组。

telnet

telnet方案用于访问交互式业务,它表示的是可以通过telnet协议访问的交互式应用程序。其基本格式为:

telnet://<用户名>:<密码>@<主机名>:<端口号>/

几个常用方案的BNF描述

基本词法规则

ALPHA               =[a-z|A-Z]

DIGIT                 =[0-9]

SAFE                            ="$" | "-" | "_" | "." | "+"

EXTRA                ="!" | "*" | "'" | "(" | ")" |","

NATIONAL        ="{" | "}" | "|" | "\" | "^" |"~" | "[" | "]" | "`"

PUNCTUATION         ="<" | ">" | "#" | "%" |<">

RESERVED        =";" | "/" | "?" | ":" | "@" |"&" | "="

HEX                    =[a-f|A-F|DIGIT]

ESCAPE              ="%" HEX HEX

UNRESERVED  =ALPHA | DIGIT | SAFE | EXTRA

UCHAR              = UNRESERVED | ESCAPE

XCHAR               =UNRESERVED | RESERVED | ESCAPE

DIGITS               =DIGIT+

HTTP(超文本传输协议)

httpurl               =“http://” hostport [ “/” hpath [ “?” search ] [“#” frag]]

hostport            =host [“:” port]

host                    =hostname | hostnumber

hostnumber     =DIGITS “.” DIGITS “.” DIGITS “.” DIGITS

hostname         =[domainlabel “.”]* toplabel

domainlabel     =ALPHADIGIT | ALPHADIGIT [ ALPHADIGIT | "-" ]* ALPHADIGIT

toplabel             =ALPHA | ALPHA [ ALPHADIGIT | "-" ]* ALPHADIGIT

ALPHADIGIT    =ALPHA | DIGIT

port                    = DIGITS

hpath                 =hsegment [“/” hsegment]*

hsegment         =[UCHAR | “;” | “:” | “@” | “&” | “=”]*

search               =[UCHAR | “;” | “:” | “@” | “&” | “=”]*

frag                    =[UCHAR | “;” | “:” | “@” | “&” | “=”]*

FTP(文件传输协议)

ftpurl                  ="ftp://" login [ "/" fpath [ ";type=" ftptype ]]

login                            =[ user [ ":" password ] "@" ] hostport

user                    =[ uchar | ";" | "?" | "&" | "=" ]*

password                   =[ uchar | ";" | "?" | "&" | "=" ]*

hostport            =见HTTP协议中描述

fpath                  =fsegment [ "/" fsegment ]*

fsegment          =[ uchar | "?" | ":" | "@" | "&" |"=" ]*

ftptype              ="A" | "I" | "D" | "a" | "i" |"d"

FILE(文件协议)

fileurl                 ="file://" [ host | "localhost" ] "/" fpath

host                    =见HTTP协议中描述

fpath                  =见FTP协议中描述

 

 


0 0
原创粉丝点击