2015-09-11 51 views
0

在URL的PATH段中允許使用「&」符號還是應該轉義?URL中的PATH段是否允許「&」符號?

根據NU W3C驗證(https://validator.w3.org/nu/) 我:

Error: & did not start a character reference. (& probably should have been escaped as &.) 
At line 407, column 52 
<a href="/Bags-&-Purses/c/wome 

但是,如果我試圖編碼通過Java URI類的網址我得到了所有的空間和等編碼,但不是&符號。

URI u = new URI(request.getScheme(), null, 
          request.getServerName(), request.getServerPort(), 
          request.getContextPath() + url, 
          query, null); 
u.toURL().toString(); 

其中URL字符串是:/袋子 - & - 錢包/ C /女裝,配飾,包包

結果是:https://localhost:8112/storefront/Bags-&-Purses/c/womens-accessories-bags - 不編碼

的問題是,爲什麼&不逃脫..這是有效的嗎? 我想它應該用%26轉義,但它看起來不會被轉義。

回答

1

&,而保留字符,似乎是URI中路徑段的有效字符。據

path   = path-abempty ; begins with "/" or is empty 
       /path-absolute ; begins with "/" but not "//" 
       /path-noscheme ; begins with a non-colon segment 
       /path-rootless ; begins with a segment 
       /path-empty  ; zero characters 

    path-abempty = *("/" segment) 
    path-absolute = "/" [ segment-nz *("/" segment) ] 
    path-noscheme = segment-nz-nc *("/" segment) 
    path-rootless = segment-nz *("/" segment) 
    path-empty = 0<pchar> 

    segment  = *pchar 
    segment-nz = 1*pchar 
    segment-nz-nc = 1*(unreserved/pct-encoded/sub-delims/"@") 
       ; non-zero-length segment without any colon ":" 

    pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 

(...) 

    reserved = gen-delims/sub-delims 

    gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

    sub-delims = "!"/"$"/"&"/"'"/"("/")" 
       /"*"/"+"/","/";"/"=" 

當你詢問的網址,而不是更一般的URI,如果你看一下在RFC3986, section 3.3路徑段給出的語法,&被允許作爲子delims組的一部分我可以告訴,URL不會對路徑段造成額外的限制。相同的RFC的Section 2.2然後繼續說明保留字符應該百分比編碼,除非它們在該組件中特別允許。但是對於這種情況,根據上面的語法,子定界組中的所有字符(包括&)似乎都特別允許在路徑段中。

但是,您在此處遇到的問題與網址本身無關,但與HTML文檔中包含的文本表示形式無關。 &符號不能單獨顯示在HTML中,並且必須始終進行編碼。相關問題:Do I really need to encode '&' as '&amp;'?