urllib.parse
— 將 URL 解析為元件¶
原始碼: Lib/urllib/parse.py
此模組定義了一個標準介面,用於將統一資源定位符 (URL) 字串分解為各個元件(定址方案、網路位置、路徑等),將這些元件重新組合成一個 URL 字串,並根據“基本 URL”將“相對 URL”轉換為絕對 URL。
此模組旨在與關於相對統一資源定位符的網際網路 RFC 相匹配。它支援以下 URL 方案:file
、ftp
、gopher
、hdl
、http
、https
、imap
、itms-services
、mailto
、mms
、news
、nntp
、prospero
、rsync
、rtsp
、rtsps
、rtspu
、sftp
、shttp
、sip
、sips
、snews
、svn
、svn+ssh
、telnet
、wais
、ws
、wss
。
CPython 實現細節: 包含 itms-services
URL 方案可能會阻止應用程式透過 Apple macOS 和 iOS App Store 的稽核流程。在 iOS 上,itms-services
方案的處理總是會被移除;在 macOS 上,如果 CPython 使用 --with-app-store-compliance
選項構建,則 可能 會被移除。
urllib.parse
模組定義的函式分為兩大類:URL 解析和 URL 引用。這些內容將在以下章節中詳細介紹。
此模組的函式使用了已棄用的術語 netloc
(或 net_loc
),該術語首次出現在 RFC 1808 中。然而,此術語已被 RFC 3986 廢棄,後者引入了術語 authority
作為其替代。出於向後相容性考慮,netloc
的使用仍在繼續。
URL 解析¶
URL 解析函式主要用於將 URL 字串拆分為其元件,或將 URL 元件組合成一個 URL 字串。
- urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)¶
將 URL 解析成六個元件,返回一個包含 6 個元素的命名元組。這對應於 URL 的一般結構:
scheme://netloc/path;parameters?query#fragment
。每個元組項都是一個字串,可能為空。元件不會被分解成更小的部分(例如,網路位置是一個單一的字串),並且不會展開百分比轉義。如上所示的分隔符不屬於結果的一部分,除了路徑元件中的前導斜槓,如果存在則保留。例如>>> from urllib.parse import urlparse >>> urlparse("scheme://netloc/path;parameters?query#fragment") ParseResult(scheme='scheme', netloc='netloc', path='/path;parameters', params='', query='query', fragment='fragment') >>> o = urlparse("https://docs.python.club.tw:80/3/library/urllib.parse.html?" ... "highlight=params#url-parsing") >>> o ParseResult(scheme='http', netloc='docs.python.org:80', path='/3/library/urllib.parse.html', params='', query='highlight=params', fragment='url-parsing') >>> o.scheme 'http' >>> o.netloc 'docs.python.org:80' >>> o.hostname 'docs.python.org' >>> o.port 80 >>> o._replace(fragment="").geturl() 'https://docs.python.club.tw:80/3/library/urllib.parse.html?highlight=params'
根據 RFC 1808 中的語法規範,urlparse 僅在網路位置由“//”正確引入時才識別它。否則,輸入被假定為相對 URL,因此以路徑元件開頭。
>>> from urllib.parse import urlparse >>> urlparse('//www.cwi.nl:80/%7Eguido/Python.html') ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('www.cwi.nl/%7Eguido/Python.html') ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html', params='', query='', fragment='') >>> urlparse('help/Python.html') ParseResult(scheme='', netloc='', path='help/Python.html', params='', query='', fragment='')
scheme 引數給出預設定址方案,僅在 URL 未指定時使用。它應該與 urlstring 具有相同型別(文字或位元組),但預設值
''
始終允許,並在適當時候自動轉換為b''
。如果 allow_fragments 引數為 false,則不識別片段識別符號。相反,它們被解析為路徑、引數或查詢元件的一部分,並且返回值中的
fragment
被設定為空字串。返回值是一個命名元組,這意味著它的項可以透過索引或命名屬性訪問,這些屬性是
屬性
索引
值
如果不存在則返回的值
方案
0
URL 方案說明符
scheme 引數
網路位置
1
網路位置部分
空字串
路徑
2
分層路徑
空字串
引數
3
最後一個路徑元素的引數
空字串
查詢
4
查詢元件
空字串
片段
5
片段識別符號
空字串
使用者名稱
使用者名稱
密碼
密碼
主機名
主機名(小寫)
埠
埠號(如果存在,為整數)
如果在 URL 中指定了無效埠,讀取
port
屬性將引發ValueError
。有關結果物件的更多資訊,請參見結構化解析結果部分。netloc
屬性中不匹配的方括號將引發ValueError
。netloc
屬性中在 NFKC 規範化下(如 IDNA 編碼所用)分解為/
、?
、#
、@
或:
任何字元都將引發ValueError
。如果在解析之前 URL 被分解,則不會引發錯誤。與所有命名元組一樣,子類具有一些特別有用的附加方法和屬性。其中一個方法是
_replace()
。_replace()
方法將返回一個新的 ParseResult 物件,用新值替換指定的欄位。>>> from urllib.parse import urlparse >>> u = urlparse('//www.cwi.nl:80/%7Eguido/Python.html') >>> u ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='') >>> u._replace(scheme='http') ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html', params='', query='', fragment='')
警告
urlparse()
不執行驗證。詳細資訊請參閱URL 解析安全性。3.2 版本中已更改: 增加了 IPv6 URL 解析功能。
3.3 版本中已更改: 現在所有 URL 方案都解析片段(除非 allow_fragments 為 false),這符合 RFC 3986。此前,存在一個支援片段的方案白名單。
3.6 版本中已更改: 超出範圍的埠號現在會引發
ValueError
,而不是返回None
。3.8 版本中已更改: 在 NFKC 規範化下影響 netloc 解析的字元現在會引發
ValueError
。
- urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')¶
解析作為字串引數給出的查詢字串(application/x-www-form-urlencoded 型別的資料)。資料以字典形式返回。字典鍵是唯一的查詢變數名,值是每個名稱的值列表。
可選引數 keep_blank_values 是一個標誌,指示百分號編碼查詢中的空白值是否應被視為空字串。真值表示空白應保留為空字串。預設的假值表示應忽略空白值,並將其視為未包含在內。
可選引數 strict_parsing 是一個標誌,指示如何處理解析錯誤。如果為 false(預設),則靜默忽略錯誤。如果為 true,則錯誤會引發
ValueError
異常。可選的 encoding 和 errors 引數指定如何將百分號編碼序列解碼為 Unicode 字元,這與
bytes.decode()
方法所接受的方式相同。可選引數 max_num_fields 是要讀取的最大欄位數。如果設定,則如果讀取的欄位數超過 max_num_fields,則會引發
ValueError
。可選引數 separator 是用於分隔查詢引數的符號。它預設為
&
。使用
urllib.parse.urlencode()
函式(將doseq
引數設定為True
)將此類字典轉換為查詢字串。3.2 版本中已更改: 添加了 encoding 和 errors 引數。
3.8 版本中已更改: 添加了 max_num_fields 引數。
3.10 版本中已更改: 添加了 separator 引數,預設值為
&
。Python 3.10 之前的版本允許使用;
和&
作為查詢引數分隔符。此行為已更改為僅允許單個分隔符鍵,預設分隔符為&
。自 3.14 版本棄用: 接受除空字串、位元組類物件和
None
之外的假值物件(如0
和[]
)現已棄用。
- urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')¶
解析作為字串引數給出的查詢字串(application/x-www-form-urlencoded 型別的資料)。資料以名稱、值對列表的形式返回。
可選引數 keep_blank_values 是一個標誌,指示百分號編碼查詢中的空白值是否應被視為空字串。真值表示空白應保留為空字串。預設的假值表示應忽略空白值,並將其視為未包含在內。
可選引數 strict_parsing 是一個標誌,指示如何處理解析錯誤。如果為 false(預設),則靜默忽略錯誤。如果為 true,則錯誤會引發
ValueError
異常。可選的 encoding 和 errors 引數指定如何將百分號編碼序列解碼為 Unicode 字元,這與
bytes.decode()
方法所接受的方式相同。可選引數 max_num_fields 是要讀取的最大欄位數。如果設定,則如果讀取的欄位數超過 max_num_fields,則會引發
ValueError
。可選引數 separator 是用於分隔查詢引數的符號。它預設為
&
。使用
urllib.parse.urlencode()
函式將此類對列表轉換為查詢字串。3.2 版本中已更改: 添加了 encoding 和 errors 引數。
3.8 版本中已更改: 添加了 max_num_fields 引數。
3.10 版本中已更改: 添加了 separator 引數,預設值為
&
。Python 3.10 之前的版本允許使用;
和&
作為查詢引數分隔符。此行為已更改為僅允許單個分隔符鍵,預設分隔符為&
。
- urllib.parse.urlunparse(parts)¶
從
urlparse()
返回的元組構造一個 URL。parts 引數可以是任何六項可迭代物件。這可能會導致 URL 略有不同但等效,如果原始解析的 URL 具有不必要的分隔符(例如,帶空查詢的?
;RFC 指出這些是等效的)。
- urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)¶
這與
urlparse()
類似,但不會將引數從 URL 中分離。如果需要更近的 URL 語法,允許將引數應用於 URL path 部分的每個片段(參見 RFC 2396),則通常應使用此函式而不是urlparse()
。需要一個單獨的函式來分離路徑片段和引數。此函式返回一個包含 5 個元素的命名元組(addressing scheme, network location, path, query, fragment identifier).
返回值是一個命名元組,它的項可以透過索引或命名屬性訪問
屬性
索引
值
如果不存在則返回的值
方案
0
URL 方案說明符
scheme 引數
網路位置
1
網路位置部分
空字串
路徑
2
分層路徑
空字串
查詢
3
查詢元件
空字串
片段
4
片段識別符號
空字串
使用者名稱
使用者名稱
密碼
密碼
主機名
主機名(小寫)
埠
埠號(如果存在,為整數)
如果在 URL 中指定了無效埠,讀取
port
屬性將引發ValueError
。有關結果物件的更多資訊,請參見結構化解析結果部分。netloc
屬性中不匹配的方括號將引發ValueError
。netloc
屬性中在 NFKC 規範化下(如 IDNA 編碼所用)分解為/
、?
、#
、@
或:
任何字元都將引發ValueError
。如果在解析之前 URL 被分解,則不會引發錯誤。遵循更新 RFC 3986 的 WHATWG 規範 的某些部分,URL 中開頭的 C0 控制字元和空格字元將被剝離。URL 中任何位置的
\n
、\r
和製表符\t
字元將被移除。警告
urlsplit()
不執行驗證。詳細資訊請參閱URL 解析安全性。3.6 版本中已更改: 超出範圍的埠號現在會引發
ValueError
,而不是返回None
。3.8 版本中已更改: 在 NFKC 規範化下影響 netloc 解析的字元現在會引發
ValueError
。3.10 版本中已更改: ASCII 換行符和製表符從 URL 中去除。
3.12 版本中已更改: URL 中開頭的 WHATWG C0 控制字元和空格字元將被剝離。
- urllib.parse.urlunsplit(parts)¶
將
urlsplit()
返回的元組元素組合成一個完整的 URL 字串。parts 引數可以是任何五項可迭代物件。這可能會導致 URL 略有不同但等效,如果原始解析的 URL 具有不必要的分隔符(例如,帶空查詢的 ?;RFC 指出這些是等效的)。
- urllib.parse.urljoin(base, url, allow_fragments=True)¶
透過將“基本 URL”(base)與另一個 URL(url)組合來構造一個完整的(“絕對”)URL。非正式地,這使用基本 URL 的元件,特別是定址方案、網路位置和(部分)路徑,來提供相對 URL 中缺失的元件。例如
>>> from urllib.parse import urljoin >>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html') 'http://www.cwi.nl/%7Eguido/FAQ.html'
allow_fragments 引數與
urlparse()
的含義和預設值相同。備註
如果 url 是一個絕對 URL(即,它以
//
或scheme://
開頭),則 url 的主機名和/或方案將出現在結果中。例如>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', ... '//python.club.tw/%7Eguido') 'https://python.club.tw/%7Eguido'
如果你不想這種行為,請使用
urlsplit()
和urlunsplit()
預處理 url,刪除可能的 scheme 和 netloc 部分。警告
由於絕對 URL 可以作為
url
引數傳入,因此使用攻擊者控制的url
呼叫urljoin
通常是 不安全 的。例如,在urljoin("https://website.com/users/", username)
中,如果username
可以包含一個絕對 URL,則urljoin
的結果將是該絕對 URL。3.5 版本中已更改: 行為已更新以匹配 RFC 3986 中定義的語義。
- urllib.parse.urldefrag(url)¶
如果 url 包含片段識別符號,則返回一個不帶片段識別符號的修改版 url,並將片段識別符號作為單獨的字串。如果 url 中沒有片段識別符號,則返回未修改的 url 和一個空字串。
返回值是一個命名元組,它的項可以透過索引或命名屬性訪問
屬性
索引
值
如果不存在則返回的值
網址
0
不帶片段的 URL
空字串
片段
1
片段識別符號
空字串
有關結果物件的更多資訊,請參見結構化解析結果部分。
3.2 版本中已更改: 結果是一個結構化物件而不是簡單的 2-元組。
- urllib.parse.unwrap(url)¶
從封裝的 URL 中提取 URL(即,格式為
<URL:scheme://host/path>
、<scheme://host/path>
、URL:scheme://host/path
或scheme://host/path
的字串)。如果 url 不是封裝的 URL,則原樣返回。
URL 解析安全性¶
urlsplit()
和 urlparse()
API 不執行輸入 驗證。它們可能不會對其他應用程式認為無效的輸入引發錯誤。它們也可能在其他地方可能不被視為 URL 的某些輸入上成功。
它們不是在異常輸入上引發異常,而是可能返回某些元件部分作為空字串。或者元件可能包含超出其應有的內容。
我們建議這些 API 的使用者,在返回的值可能在任何具有安全隱患的地方使用時,進行防禦性編碼。在信任返回的元件部分之前,在您的程式碼中進行一些驗證。該 scheme
有意義嗎?這是一個合理的 path
嗎?那個 hostname
有什麼奇怪之處嗎?等等。
URL 的構成並未普遍明確定義。不同的應用程式有不同的需求和期望約束。例如,當前的 WHATWG 規範 描述了面向使用者的 Web 客戶端(如 Web 瀏覽器)所需的內容。而 RFC 3986 更通用。這些函式結合了兩者的某些方面,但不能聲稱完全符合其中任何一個。API 和現有使用者程式碼對特定行為的期望早於這兩個標準,這使得我們對 API 行為的更改非常謹慎。
解析 ASCII 編碼位元組¶
URL 解析函式最初設計為僅對字串操作。實際上,能夠將正確引用和編碼的 URL 作為 ASCII 位元組序列進行操作是很有用的。因此,此模組中的所有 URL 解析函式除了 str
物件外,還對 bytes
和 bytearray
物件進行操作。
如果傳入 str
資料,結果也將只包含 str
資料。如果傳入 bytes
或 bytearray
資料,結果將只包含 bytes
資料。
嘗試在單個函式呼叫中混合 str
資料與 bytes
或 bytearray
將導致引發 TypeError
,而嘗試傳入非 ASCII 位元組值將觸發 UnicodeDecodeError
。
為了支援 str
和 bytes
之間結果物件的輕鬆轉換,所有 URL 解析函式的返回值都提供了一個 encode()
方法(當結果包含 str
資料時)或一個 decode()
方法(當結果包含 bytes
資料時)。這些方法的簽名與相應的 str
和 bytes
方法的簽名相同(除了預設編碼是 'ascii'
而不是 'utf-8'
)。每個方法都生成一個相應型別的值,其中包含 bytes
資料(對於 encode()
方法)或 str
資料(對於 decode()
方法)。
需要處理可能包含非 ASCII 資料的未正確引用的 URL 的應用程式,需要在使用 URL 解析方法之前自行將位元組解碼為字元。
本節所述行為僅適用於 URL 解析函式。URL 引用函式在生成或使用位元組序列時,將遵循其自己的規則,具體細節將在各個 URL 引用函式的文件中詳細說明。
3.2 版本中已更改: URL 解析函式現在接受 ASCII 編碼的位元組序列
結構化解析結果¶
來自 urlparse()
、urlsplit()
和 urldefrag()
函式的結果物件是 tuple
型別的子類。這些子類添加了這些函式文件中列出的屬性、上一節中描述的編碼和解碼支援,以及一個附加方法
- urllib.parse.SplitResult.geturl()¶
以字串形式返回原始 URL 的重新組合版本。這可能與原始 URL 略有不同,因為方案可能會規範化為小寫,並且空元件可能會被刪除。具體來說,空引數、查詢和片段識別符號將被刪除。
對於
urldefrag()
結果,只會刪除空的片段識別符號。對於urlsplit()
和urlparse()
結果,所有註明的更改都將應用於此方法返回的 URL。如果此方法的結果重新透過原始解析函式,則結果保持不變。
>>> from urllib.parse import urlsplit >>> url = 'https://python.club.tw/doc/#' >>> r1 = urlsplit(url) >>> r1.geturl() 'https://python.club.tw/doc/' >>> r2 = urlsplit(r1.geturl()) >>> r2.geturl() 'https://python.club.tw/doc/'
以下類提供了在操作 str
物件時結構化解析結果的實現
- class urllib.parse.DefragResult(url, fragment)¶
包含
str
資料的urldefrag()
結果的具體類。encode()
方法返回一個DefragResultBytes
例項。在 3.2 版本加入。
- class urllib.parse.ParseResult(scheme, netloc, path, params, query, fragment)¶
包含
str
資料的urlparse()
結果的具體類。encode()
方法返回一個ParseResultBytes
例項。
- class urllib.parse.SplitResult(scheme, netloc, path, query, fragment)¶
包含
str
資料的urlsplit()
結果的具體類。encode()
方法返回一個SplitResultBytes
例項。
以下類提供了在操作 bytes
或 bytearray
物件時解析結果的實現
- class urllib.parse.DefragResultBytes(url, fragment)¶
包含
bytes
資料的urldefrag()
結果的具體類。decode()
方法返回一個DefragResult
例項。在 3.2 版本加入。
- class urllib.parse.ParseResultBytes(scheme, netloc, path, params, query, fragment)¶
包含
bytes
資料的urlparse()
結果的具體類。decode()
方法返回一個ParseResult
例項。在 3.2 版本加入。
- class urllib.parse.SplitResultBytes(scheme, netloc, path, query, fragment)¶
包含
bytes
資料的urlsplit()
結果的具體類。decode()
方法返回一個SplitResult
例項。在 3.2 版本加入。
URL 引用¶
URL 引用函式主要用於獲取程式資料並透過引用特殊字元和適當編碼非 ASCII 文字,使其可以安全地用作 URL 元件。它們還支援反轉這些操作,以從 URL 元件的內容重新建立原始資料(如果此任務尚未被上述 URL 解析函式涵蓋)。
- urllib.parse.quote(string, safe='/', encoding=None, errors=None)¶
使用
%xx
轉義替換 string 中的特殊字元。字母、數字和字元'_.-~'
永不引用。預設情況下,此函式旨在引用 URL 的路徑部分。可選的 safe 引數指定不應引用的附加 ASCII 字元 — 其預設值為'/'
。可選的 encoding 和 errors 引數指定如何處理非 ASCII 字元,其方式與
str.encode()
方法所接受的方式相同。encoding 預設為'utf-8'
。errors 預設為'strict'
,這意味著不支援的字元會引發UnicodeEncodeError
。如果 string 是bytes
,則不能提供 encoding 和 errors,否則會引發TypeError
。請注意
quote(string, safe, encoding, errors)
等同於quote_from_bytes(string.encode(encoding, errors), safe)
。示例:
quote('/El Niño/')
得到'/El%20Ni%C3%B1o/'
。
- urllib.parse.quote_plus(string, safe='', encoding=None, errors=None)¶
類似於
quote()
,但也將空格替換為加號,這是在構建用於 URL 的查詢字串時引用 HTML 表單值所必需的。原始字串中的加號會轉義,除非它們包含在 safe 中。它也沒有將 safe 預設為'/'
。示例:
quote_plus('/El Niño/')
得到'%2FEl+Ni%C3%B1o%2F'
。
- urllib.parse.quote_from_bytes(bytes, safe='/')¶
與
quote()
類似,但接受bytes
物件而不是str
,並且不執行字串到位元組的編碼。示例:
quote_from_bytes(b'a&\xef')
得到'a%26%EF'
。
- urllib.parse.unquote(string, encoding='utf-8', errors='replace')¶
用它們的單字元等效項替換
%xx
轉義。可選的 encoding 和 errors 引數指定如何將百分號編碼序列解碼為 Unicode 字元,這與bytes.decode()
方法所接受的方式相同。encoding 預設為
'utf-8'
。errors 預設為'replace'
,這意味著無效序列將替換為佔位符字元。示例:
unquote('/El%20Ni%C3%B1o/')
得到'/El Niño/'
。3.9 版本中已更改: string 引數支援位元組和字串物件(以前只支援字串)。
- urllib.parse.unquote_plus(string, encoding='utf-8', errors='replace')¶
類似於
unquote()
,但也將加號替換為空格,這是取消引用 HTML 表單值所必需的。string 必須是
str
。示例:
unquote_plus('/El+Ni%C3%B1o/')
得到'/El Niño/'
。
- urllib.parse.unquote_to_bytes(string)¶
將
%xx
轉義替換為其單位元組等效項,並返回一個bytes
物件。如果 string 是
str
,則 string 中未轉義的非 ASCII 字元將被編碼為 UTF-8 位元組。示例:
unquote_to_bytes('a%26%EF')
得到b'a&\xef'
。
- urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)¶
將對映物件或兩元素元組序列(可能包含
str
或bytes
物件)轉換為百分號編碼的 ASCII 文字字串。如果生成的字串要用作urlopen()
函式的 POST 操作的 data,則應將其編碼為位元組,否則會引發TypeError
。結果字串是一系列由
'&'
字元分隔的key=value
對,其中 key 和 value 都使用 quote_via 函式進行引用。預設情況下,使用quote_plus()
引用值,這意味著空格被引用為'+'
字元,並且 '/' 字元被編碼為%2F
,這遵循 GET 請求的標準(application/x-www-form-urlencoded
)。另一個可以作為 quote_via 傳遞的函式是quote()
,它將空格編碼為%20
並且不編碼 '/' 字元。為了最大程度地控制引用內容,請使用quote
併為 safe 指定一個值。當兩元素元組序列用作 query 引數時,每個元組的第一個元素是鍵,第二個元素是值。值元素本身可以是一個序列,在這種情況下,如果可選引數 doseq 評估為
True
,則對於鍵的值序列的每個元素,將生成由'&'
分隔的單獨key=value
對。編碼字串中引數的順序將與序列中引數元組的順序匹配。safe、encoding 和 errors 引數傳遞給 quote_via(encoding 和 errors 引數僅在查詢元素為
str
時傳遞)。要反轉此編碼過程,此模組中提供了
parse_qs()
和parse_qsl()
,用於將查詢字串解析為 Python 資料結構。請參閱 urllib 示例,瞭解如何使用
urllib.parse.urlencode()
方法生成 URL 的查詢字串或 POST 請求的資料。3.2 版本中已更改: query 支援位元組和字串物件。
3.5 版本中已更改: 添加了 quote_via 引數。
自 3.14 版本棄用: 接受除空字串、位元組類物件和
None
之外的假值物件(如0
和[]
)現已棄用。
參見
- WHATWG - URL 即時標準
URL 標準工作組,定義 URL、域名、IP 地址、application/x-www-form-urlencoded 格式及其 API。
- RFC 3986 - 統一資源識別符號
這是當前的標準 (STD66)。對 urllib.parse 模組的任何更改都應符合此標準。可能會觀察到某些偏差,這主要是為了向後相容性以及主要瀏覽器中常見的某些事實上的解析要求。
- RFC 2732 - URL 中 IPv6 字面地址的格式。
這指定了 IPv6 URL 的解析要求。
- RFC 2396 - 統一資源識別符號 (URI):通用語法
描述統一資源名稱(URN)和統一資源定位符(URL)通用語法要求的文件。
- RFC 2368 - mailto URL 方案。
mailto URL 方案的解析要求。
- RFC 1808 - 相對統一資源定位符
這份請求評論(Request For Comments)包含了用於連線絕對URL和相對URL的規則,其中包括大量用於處理邊界情況的“異常示例”。
- RFC 1738 - 統一資源定位符 (URL)
這規定了絕對URL的正式語法和語義。