我的 Chrome 版本 101 允許我打開
https://example.com(https://example.com, 除了https://.)
但不是
https://example.com/test(https://example.com/test, 路徑分隔符/也被編碼。)。
根據最新規范,URL 的哪些部分和哪些字符可以進行 URL 編碼?
“部分”是指方案、用戶名、密碼、主機、埠、路徑、查詢、片段、、、、、、、、.等等。:_ //_ @_?#
我所說的“什么字符”是指“在什么部分具有什么價值的字符”。
uj5u.com熱心網友回復:
按規范
來自RFC 3986。
2.1。百分比編碼
……
pct-encoded = "%" HEXDIG HEXDIG大寫十六進制數字“A”到“F”分別相當于小寫數字“a”到“f”。如果兩個 URI 僅在百分比編碼的八位位元組中使用的十六進制數字不同,則它們是等價的。為了保持一致性,URI 生產者和規范化者應該對所有百分比編碼使用大寫的十六進制數字。
- 百分比編碼不區分大小寫。
2.2. 保留字符
reserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@" sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / " " / "," / ";" / "="保留字符的目的是提供一組可與 URI 中的其他資料區分開來的定界字符。在用相應的百分比編碼八位位元組替換保留字符方面不同的 URI 是不等價的。對保留字符進行百分比編碼,或對與保留字符相對應的百分比編碼八位位元組進行解碼,將改變大多數應用程式解釋 URI 的方式。因此,保留集中的字符不受規范化的影響,因此可以安全地被特定于方案和特定于生產者的演算法用于在 URI 中分隔資料子組件。
保留字符 (
gen-delims) 的子集用作第 3 節中描述的通用 URI 組件的分隔符。組件的 ABNF 語法規則不會gen-delims直接使用保留或規則名稱;相反,每個語法規則都列出了該組件中允許的字符(即,不對其進行定界),并且那些也在保留集中的字符中的任何一個都被“保留”以用作組件內的子組件分隔符。本規范只定義了最常見的子組件;其他子組件可以由 URI 方案的規范定義,或者由 URI 的解參考演算法的特定于實作的語法定義,前提是這些子組件由該組件內允許的保留集中的字符分隔。生成 URI 的應用程式應該對與保留集中的字符相對應的資料位元組進行百分比編碼,除非 URI 方案特別允許這些字符表示該組件中的資料。如果在 URI 組件中找到保留字符并且不知道該字符的定界角色,則必須將其解釋為表示對應于 US-ASCII 中該字符編碼的資料八位位元組。
- 字符“
:/?#[]@!$&'()* ,;=”是保留字符。 - URL 方案規范將語法 URL 定界符定義為保留字符中的一些字符。
- 語法 URL 分隔符不是百分比編碼的。
- 不是語法 URL 分隔符的保留字符可以進行百分比編碼,也可以不進行百分比編碼,但建議進行百分比編碼。
2.3. 無保留字符
URI 中允許但沒有保留用途的字符稱為未保留字符。這些包括大寫和小寫字母、十進制數字、連字符、句點、下劃線和波浪號。
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"在用相應的百分比編碼的 US-ASCII 八位位元組替換未保留字符方面不同的 URI 是等效的:它們標識相同的資源。然而,URI 比較實作并不總是在比較之前執行規范化(參見第 6 節)。為保持一致性, URI 生產者不應創建
ALPHA(A–Z和a–z)、DIGIT(0–9)、連字符 (-)、句點 (.)、下劃線 (_) 或波浪號 ( )范圍內的百分比編碼八位組,并且當在~URI,應該由 URI 規范器解碼為它們相應的未保留字符。
6.歸一化和比較
…URI 比較是為了某些特定目的而執行的。出于不同目的比較 URI 的協議或實作通常會在減少別名識別符號方面花費多少努力方面進行不同的設計權衡。本節介紹可用于比較 URI 的各種方法、它們之間的權衡以及可能使用它們的應用程式型別。
- URL 中允許的而不是保留的字符,即“
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~”,是非保留字符。 - 未保留的字符可以是百分比編碼的,也可以不是,但建議不要。
概括
- 語法 URL 分隔符 → 不能進行百分比編碼。
- 除了那些 → 可以是百分比編碼或不編碼。
- 百分比編碼不區分大小寫。
實作將如何做
一些實作不做完整的、廣泛的 URL 規范化。例如,“ https://example.com”是規范的有效 URL,但 Chrome(101 版)在將其https://example.com放入多功能欄時并未將其規范化為“ ”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/483954.html
上一篇:將帶有斜杠的變數傳遞給nginx
