精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

每個(gè)Web開(kāi)發(fā)者都應(yīng)該知道的URL編碼知識(shí)

開(kāi)發(fā) 前端
本文首先闡述了人們關(guān)于統(tǒng)一資源定位符(URL)編碼的普遍的誤讀,其后通過(guò)闡明HTTP場(chǎng)景下的URL encoding 來(lái)引出我們經(jīng)常遇到的問(wèn)題及其解決方案。本文并不特定于某類(lèi)編程語(yǔ)言,我們?cè)贘ava環(huán)境下闡釋問(wèn)題,最后從Web應(yīng)用的多個(gè)層次描述如何解決URL編碼的問(wèn)題來(lái)結(jié)尾。

本文首先闡述了人們關(guān)于統(tǒng)一資源定位符(URL)編碼的普遍的誤讀,其后通過(guò)闡明HTTP場(chǎng)景下的URL encoding 來(lái)引出我們經(jīng)常遇到的問(wèn)題及其解決方案。本文并不特定于某類(lèi)編程語(yǔ)言,我們?cè)?a rel="nofollow" >Java環(huán)境下闡釋問(wèn)題,***從Web應(yīng)用的多個(gè)層次描述如何解決URL編碼的問(wèn)題來(lái)結(jié)尾。

簡(jiǎn)介

當(dāng)我們每天上網(wǎng)沖浪時(shí),有一些技術(shù)我們無(wú)時(shí)無(wú)刻不在面對(duì)。有數(shù)據(jù)本身(網(wǎng)頁(yè)),數(shù)據(jù)的格式化,能夠讓我們獲取數(shù)據(jù)的傳輸機(jī)制,以及讓W(xué)eb網(wǎng)絡(luò)能夠真正成為Web的基礎(chǔ)及根本:從一頁(yè)到另一頁(yè)的鏈接。這些鏈接都是URL。

通用URL語(yǔ)法

我敢說(shuō)每個(gè)人在其一生中至少見(jiàn)過(guò)一次URL。比如"http://www.google.com",就是一個(gè)URL。一個(gè)URL是一個(gè)統(tǒng)一資源定位器 ,事實(shí)上它指向了一個(gè)網(wǎng)頁(yè)(大多數(shù)情況下)。實(shí)際上,自從1994年的***版規(guī)范開(kāi)始,URL就有了一個(gè)良好定義的結(jié)構(gòu)。

我們能從"http://www.google.com" 這個(gè)URL中讀出下列詳細(xì)信息:

Part Data
Scheme http
Host address www.google.com

如果我們看一個(gè)更復(fù)雜的URL,比如 "https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third" 我們就能獲取到下列信息:

Part Data
Scheme https
User bob
Password bobby
Host address www.lunatech.com
Port 8080
Path /file
Path parameters p=1
Query parameters q=2
Fragment third

協(xié)議 (即scheme,如上面的httphttps (安全HTTP)) 定義了URL中其余部分的結(jié)構(gòu)。大多數(shù)互聯(lián)網(wǎng)URL協(xié)議 擁有通用的開(kāi)頭,包括用戶(hù),密碼,主機(jī)名和端口,后面才是每個(gè)協(xié)議具體的部分。這個(gè)通用的部分負(fù)責(zé)處理認(rèn)證,同時(shí)它也有能力知道為了請(qǐng)求數(shù)據(jù)應(yīng)該鏈接到哪兒。

HTTP URL語(yǔ)法

對(duì)于HTTP URL (使用httphttps 協(xié)議),URL的scheme描述部分定義了數(shù)據(jù)的路徑(path),后面是可選的queryfragment

path 部分看上去是一個(gè)分層的結(jié)構(gòu),類(lèi)似于文件系統(tǒng)中文件夾和文件的分層結(jié)構(gòu)。path由"/"字符開(kāi)始,每一個(gè)文件夾由"/"分隔,***是文件。例如" /photos/egypt/cairo/first.jpg"有四個(gè)路徑片段(segment):"photos"、"egypt"、"cairo" 和 "first.jpg",可以由此推出:"first.jpg" 文件在文件夾"cairo"中,而"egypt" 文件夾位于web站點(diǎn)的根文件夾"photos"里面。

每一個(gè)path片段 可以有可選的 path參數(shù) (也叫 matrix參數(shù)),這是在path片段的***由";"開(kāi)始的一些字符。每個(gè)參數(shù)名和值由"="字符分隔,像這樣:"/file;p=1",這定義了path片段 "file"有一個(gè) path參數(shù) "p",其值為"1"。這些參數(shù)并不常用 — 這得清楚 — 但是它們確實(shí)是存在,而且從 Yahoo RESTful API 文檔我們能找到很好的理由去使用它們:

 Matrix參數(shù)可以讓程序在GET請(qǐng)求中可以獲取部分的數(shù)據(jù)集。參考數(shù)據(jù)集的分頁(yè)。因?yàn)閙atrix參數(shù)可以跟任何數(shù)據(jù)集的URI格式的path片段,它們可以在內(nèi)部的path片段中被使用。

路徑(path)部分之后是 查詢(xún) (query)部分,它和 路徑 之間由一個(gè)“?”隔開(kāi), 查詢(xún)部分包含了一個(gè)由“&”分隔開(kāi)的參數(shù)列表,每一個(gè)參數(shù)由參數(shù)名稱(chēng)、“=”號(hào)以及參數(shù)值組成。比如"/file?q=2"定義了一個(gè) 查詢(xún)參數(shù) "q" ,它的值是"2"。這在提交 HTML表單時(shí),或者當(dāng)你使用諸如Google搜索等應(yīng)用時(shí), 用的非常多

一個(gè)HTTP URL的***部分是一個(gè)段落(fragment)部分,用來(lái)指向HTML文件中具體的某個(gè)部分,而不是整個(gè)HTML頁(yè)面。比如說(shuō),當(dāng)你點(diǎn)擊鏈接時(shí)瀏覽器自動(dòng)滾屏到某個(gè)部分而不是從頁(yè)面最頂部開(kāi)始展示,就說(shuō)明你點(diǎn)擊了一個(gè)擁有段落部分的URL。

URL 語(yǔ)法

http URL 方案最初由 RFC 1738 定義(實(shí)際上,在之前的 RFC 1630也有涉及),而在 http URL 方案被重新定義之前,整個(gè) URL 語(yǔ)法就已經(jīng)由擴(kuò)展幾次 以適應(yīng)發(fā)展的規(guī)范進(jìn)化為一套 統(tǒng)一資源標(biāo)識(shí)符(Uniform Resource Identifiers 即 URIs)

對(duì)于 URLs 如何拼裝,各部分如何分隔有一套語(yǔ)法。例如:"://"分隔方案主機(jī)部分。主機(jī)路徑片段部分由"/"分隔,而查詢(xún)部分緊跟在"?"之后。這意味著有些字符為語(yǔ)法保留。有些為整個(gè)URIs保留,而有些則被特定方案保留。所有出現(xiàn)在不應(yīng)出現(xiàn)位置的 保留符(例如路徑片段——以文件名為例——可能包含"?")必須被URL 編碼

URL 編碼將字符轉(zhuǎn)變成對(duì) URL 解析無(wú)意義的無(wú)害形式。它將字符轉(zhuǎn)化成為一種特定字符編碼的字節(jié)序列,然后將字節(jié)轉(zhuǎn)換為16進(jìn)制形式,并將其前面加上"%"。問(wèn)號(hào)的 URL 編碼形式為"%3F"。

我們可以將指向 "to_be_or_not_to_be?.jpg"圖片的 URL 寫(xiě)成:"http://example.com/to_be_or_not_to_be%3F.jpg",這樣就沒(méi)有人會(huì)認(rèn)為這兒可能由一個(gè)查詢(xún)部分了。

現(xiàn)今多數(shù)瀏覽器顯示 URLs 前都會(huì)對(duì)其解碼(將百分號(hào)編碼字節(jié)轉(zhuǎn)回其原本字符),并在獲取其網(wǎng)絡(luò)資源的時(shí)候重新編碼。這樣一來(lái),很多用戶(hù)從未意識(shí)到編碼的存在。

另一方面,網(wǎng)頁(yè)作者,開(kāi)發(fā)者必須明確認(rèn)識(shí)到這一點(diǎn),因?yàn)檫@里存在著很多陷阱。

URL常見(jiàn)陷阱

如果你正和URL打交道,了解下能夠避免的常見(jiàn)陷阱絕對(duì)是值得的。現(xiàn)在我們給大家介紹下不僅限于此的一些常見(jiàn)陷阱。

使用哪類(lèi)字符編碼?

URL編碼規(guī)范并沒(méi)有定義使用何種字符編碼形式去編碼字節(jié)。一般的ASCII字母數(shù)字字符并不需要轉(zhuǎn)義,但是ASCII之外的保留字需要(例如法語(yǔ)單詞“nœud”中的"œ")。我們必須提出疑問(wèn),應(yīng)該使用哪類(lèi)字符編碼來(lái)編碼URL字節(jié)。

當(dāng)然如果只有Unicode的話,這個(gè)世界就會(huì)清凈很多。因?yàn)槊總€(gè)字符都包含其中,但是它只是一個(gè)集合,或者說(shuō)是列表如果你愿意,它本身并不是一中編碼。Unicode可以使用多種方式進(jìn)行編碼,譬如UTF-8或者UTF-16(也有其它格式),但是問(wèn)題并沒(méi)有解決:我們應(yīng)該使用哪類(lèi)字符來(lái)編碼URL(通常也指URI)。

標(biāo)準(zhǔn)并沒(méi)有定義一個(gè)URI應(yīng)該以何種方式指定其編碼,所以其必須從環(huán)境信息中進(jìn)行推導(dǎo)。對(duì)于HTTP URL,它可以是HTML頁(yè)面的編碼格式,或HTTP頭的。這通常會(huì)讓人迷惑,也是許多錯(cuò)誤的根源。事實(shí)上,***版的URI標(biāo)準(zhǔn) 定義了新的URI scheme將采用UTF-8,host(甚至已有的scheme)也使用UTF-8,這讓我更加懷疑:難道host和path真的可以使用不同的編碼方式?

每一部分的保留字都是不同。

是的,他們是,是的,他們,是的,他們是。。。

對(duì)于一個(gè)httpd連接,路徑片段部分中的空格被編碼為"%20"(不,完全沒(méi)有"+"),而“+”字符在路徑片段部分可以保持不編碼。

現(xiàn)在,在查詢(xún)部分,一個(gè)空格可能會(huì)被編碼為“+”(為了向后兼容:不要試圖在URI標(biāo)準(zhǔn)去搜索他)或者“%20”,當(dāng)作為“+”字符(作為個(gè)統(tǒng)配符的結(jié)果)會(huì)被編譯為“%2B”。

這意味著“blue+light blue”字串,如果在路徑部分或者查詢(xún)部分,將會(huì)有不同的編碼。比如得到"http://example.com /blue+light%20blue?blue%2Blight+blue"這樣的編碼形式,這樣我們不需從語(yǔ)法上分析url結(jié)構(gòu),就可以推導(dǎo)這個(gè) url的整個(gè)結(jié)構(gòu)是可能

考慮如下組裝URL的Java代碼片段

  1. String str = "blue+light blue";  
  2. String url = "http://example.com/" + str + "?" + str; 

編碼URL并不是為了轉(zhuǎn)義保留字而進(jìn)行的簡(jiǎn)單字符迭代,我們需要確切的知道哪個(gè)URL部份有哪些保留字,而有針對(duì)性的進(jìn)行編碼。

這也意味著URL重寫(xiě)過(guò)濾器如果不考慮合適的編碼細(xì)節(jié)而對(duì)URL直接進(jìn)行分段轉(zhuǎn)換通常是有問(wèn)題的。對(duì)URL進(jìn)行編碼而不考慮具體的分段規(guī)則是不切實(shí)際的。

#p#

保留字不是你想象的那樣

大多數(shù)人不知道"+"在路徑部分是被允許的并且特指正號(hào)而不是空格。其他類(lèi)似的有:

  • "?"在查詢(xún)部分允許不被轉(zhuǎn)義,
     
  • "/"在查詢(xún)部分允許不被轉(zhuǎn)義,
     
  • "="在作為路徑參數(shù)或者查詢(xún)參數(shù)值以及在路徑部分允許不被轉(zhuǎn)義,
     
  • ":@-._~!$&'()*+,;="等字符在路徑部分允許不被轉(zhuǎn)義,
     
  • "/?:@-._~!$&'()*+,;="等字符在任何段中允許不被轉(zhuǎn)義。

這樣下面的地址雖然看起來(lái)有點(diǎn)混亂:""

按照上面的規(guī)則,其實(shí)上是一個(gè)合法的地址。

不用奇怪,上面路徑可以被解析為:

部分
 

 
協(xié)議
 
http
主機(jī)
 
example.com
路徑
 
/:@-._~!$&'()*+,=
路徑參數(shù)名 :@-._~!$&'()*+,
路徑參數(shù)值 :@-._~!$&'()*+,==
查詢(xún)參數(shù)名 /?:@-._~!$'()* ,;
查詢(xún)參數(shù)值 /?:@-._~!$'()* ,;==
/?:@-._~!$&'()*+,;=

不能分析解碼后的URL

URL的語(yǔ)法只在它被解碼前是有意義的,一旦解碼就可能出現(xiàn)保留字。

例如"http://example.com/blue%2Fred%3Fand+green" 在解碼前由如下部分組成:

Part Value
Scheme http
Host example.com
Path segment blue%2Fred%3Fand+green
Decoded Path segment blue/red?and+green

這樣看來(lái), 我們是在請(qǐng)求一個(gè)名為"blue/red?and+green"的文件,而不是一個(gè)位于"blue"文件夾下的名為"red?and+green"的文件。

如果我們把它解碼為"http://example.com/blue/red?and+green",我們將得到如下部分:

Part Value
Scheme http
Host example.com
Path segment blue
Path segment red
Query parameter name and green

這明顯是錯(cuò)誤的,所以,對(duì)保留字和URL各部分的分析必須在URL解碼之前完成。這意味著URL重寫(xiě)過(guò)濾器不應(yīng)當(dāng)在嘗試匹配之前解碼URL,當(dāng)且僅當(dāng)保留字允許進(jìn)行URL編碼時(shí)才可以(有時(shí)符合這種情形,有時(shí)不符合,這取決于你的應(yīng)用)。

解碼后的URL不能被再編碼為同樣的形式

如果你解碼"http://example.com/blue%2Fred%3Fand+green" 為"http://example.com/blue/red?and+green",然后對(duì)它進(jìn)行編碼(哪怕使用一個(gè)對(duì)URL每一部分都很了解的編碼器),你將會(huì)得到"http://example.com/blue/red?and+green",這是因?yàn)樗呀?jīng)是一個(gè)有效的URL。它跟我們解碼之前的URL非常的不同。

用Java正確處理URL

當(dāng)你覺(jué)得自己已經(jīng)拿到了URL的黑腰帶(柔道中的***級(jí)別--譯者注),你將會(huì)發(fā)現(xiàn)仍有一些Java里特有的、URL相關(guān)的陷阱。如果沒(méi)有一個(gè)強(qiáng)大的心臟,你很難正確的處理URL。

不要用java.net.URLEncoder或者java.net.URLDecoder來(lái)處理整個(gè)URL

不開(kāi)玩笑。這些類(lèi)不是用來(lái)編碼或解碼URL的,API文檔中清楚的寫(xiě)著:

Utility class for HTML form encoding. This class contains static methods for converting a String to theapplication/x-www-form-urlencodedMIME format. For more information about HTML form encoding, consult the HTML specification.

這不是給URL用的。充其量它類(lèi)似于查詢(xún) 部分的編碼方式。使用它來(lái)編碼或解碼整個(gè)URL是錯(cuò)誤的。你肯定以為標(biāo)準(zhǔn)的JDK一定會(huì)有一個(gè)標(biāo)準(zhǔn)的類(lèi)來(lái)正確的處理URL編碼(是這樣,只不過(guò)是各部分分開(kāi)處理的),但是要么是壓根沒(méi)有,要么是我們還沒(méi)有發(fā)現(xiàn)。不過(guò),這種臆測(cè)導(dǎo)致許多人錯(cuò)了URLEncoder。

在對(duì)每一部分編碼之前不要拼裝URL

正如我們已經(jīng)講過(guò)的:完整構(gòu)建后的URL不能再被編碼。

以下面的代碼為例:

  1. String pathSegment = "a/b?c";  
  2. String url = "http://example.com/" + pathSegment; 

如果"a/b?c" 是一個(gè)路徑片段,那么不可能把"http://example.com/a/b?c" 轉(zhuǎn)換回之前它的原樣,因?yàn)樗銮墒且粋€(gè)有效的URL。之前我們已經(jīng)解釋過(guò)這一點(diǎn)。

下面是正確的代碼:

  1. String pathSegment = "a/b?c";  
  2. String url = "http://example.com/" 
  3.             + URLUtils.encodePathSegment(pathSegment);  

這里我們使用了一個(gè)工具類(lèi)URLUtils,它是我們自己開(kāi)發(fā)的,因?yàn)榫W(wǎng)絡(luò)上找不到一個(gè)詳盡的足夠快的工具類(lèi)。上面的代碼會(huì)帶給你正確編碼的URL "http://example.com/a%2Fb%3Fc"。

注意,同樣的方式也適用于查詢(xún)子串:

  1. String value = "a&b==c";  
  2. String url = "http://example.com/?query=" + value; 

這會(huì)給你"http://example.com/?query=a&b==c",這是個(gè)有效的URL,而不是我們想得到的"http://example.com/?query=a%26b==c"。

不要期望 URI.getPath() 給你結(jié)構(gòu)化的數(shù)據(jù)

因?yàn)橐坏┮粋€(gè)URL被解碼,句法信息就會(huì)丟失,下面這樣的代碼就是錯(cuò)誤的:

  1. URI uri = new URI("http://example.com/a%2Fb%3Fc");  
  2. for(String pathSegment : uri.getPath().split("/"))  
  3.   System.err.println(pathSegment);  

它會(huì)先將路徑 "a%2Fb%3Fc"解碼為 "a/b?c",然后在不應(yīng)該分割的地方將地址分割為地址片段。

正確的代碼使用的是 未解碼的路徑

  1. URI uri = new URI("http://example.com/a%2Fb%3Fc");  
  2.  
  3. for(String pathSegment : uri.getRawPath().split("/"))  
  4.   System.err.println(URLUtils.decodePathSegment(pathSegment));  

注意路徑參數(shù)仍然存在:如果需要的話再處理它們。

不要期望Apache Commons HTTPClient的URI類(lèi)能夠正確的做對(duì)

Apache Commons HTTPClient 3URI 類(lèi)使用了Apache Commons Codec的URLCodec來(lái)做 URL編碼, 正如 API文檔提到的 它是有問(wèn)題的,因?yàn)樗噶撕褪褂胘ava.net.URLEncoder同樣的錯(cuò)誤。它不但使用了錯(cuò)誤的編碼器,還錯(cuò)誤的 按照每一部分都具有同樣的預(yù)定設(shè)置進(jìn)行解碼。

#p#

在web應(yīng)用的每一層修復(fù)URL編碼問(wèn)題

近來(lái)我們已經(jīng)被動(dòng)修復(fù)了許多應(yīng)用中的URL編碼問(wèn)題。從在Java中支持它,到低層次的URL重寫(xiě)。這里我們會(huì)列出一些必要的修改。

總是在創(chuàng)建的時(shí)候進(jìn)行URL編碼

在我們的 HTML文件中,我們將所有出現(xiàn):

  1. var url = "#{vl:encodeURL(contextPath + '/view/' + resource.name)}";  

的地方替換為:

  1. var url = "#{contextPath}/view/#{vl:encodeURLPathSegment(resource.name)}";  

查詢(xún)參數(shù)也是類(lèi)似的。

確保你的URL-rewrite過(guò)濾器正確的處理網(wǎng)址

Url 重寫(xiě)過(guò)濾器是一個(gè)重寫(xiě)過(guò)濾器,我們?cè)趕eam中用于轉(zhuǎn)化漂亮的地址去應(yīng)用依賴(lài)的網(wǎng)址。

例如,我們用它把http://beta.visiblelogistics.com/view/resource/FOO/bar轉(zhuǎn)化為http://beta.visiblelogistics.com/resources/details.seam?owner=FOO&name=bar

很明顯,這個(gè)過(guò)程包含了一些字符串從一個(gè)地址到另一個(gè)地址,這意味著我們要從路徑部分解碼并且把它重新編碼為另一個(gè)查詢(xún)值部分。

我們起初的規(guī)則,如下所示:

  1. <urlrewrite decode-using="utf-8"> 
  2.  <rule> 
  3.   <from>^/view/resource/(.*)/(.*)$</from> 
  4.   <to encode="false">/resources/details.seam?owner=$1&name=$2</to> 
  5.  </rule> 
  6. </urlrewrite> 

從這我們可以看到在重寫(xiě)過(guò)濾器中只有兩種方法處理網(wǎng)址重寫(xiě):每一個(gè)的網(wǎng)址先被解碼去做規(guī)則匹配(<to>模式),或者它不可用,所有規(guī)則去處理解碼。在我們看來(lái)后者是比較好的選擇,特別是當(dāng)你要移動(dòng)網(wǎng)址部分周?chē)蛘呦肴グ琔RL解碼路徑分隔符的匹配路徑部分時(shí)候。

在替換模式中(<to>模式)你可以使用內(nèi)建的函數(shù)escape(String)和unescape(String)處理網(wǎng)站轉(zhuǎn)碼和解碼。

在撰寫(xiě)這個(gè)文章的時(shí)候,Url Rewrite Filter Beta 3.2有一些bugs,限制住我們提高URL-correctness:

  • 網(wǎng)址解碼使用java.net.URLDecoder(這是錯(cuò)誤的),
     
  • escape(String)和unescape(String)內(nèi)建函數(shù)使用java.net.URLDecoder和java.net.URLEncoder(不夠強(qiáng)大,只能用于這個(gè)查詢(xún)字串,所有的"&"或者"="不被轉(zhuǎn)碼)。

We therefore made a big patch fixing a few issues like URL decoding, and adding the inline functionsescapePathSegment(String)andunescapePathSegment(String).

我們因此做了一個(gè)大修正補(bǔ)丁,用于修正諸如網(wǎng)址解碼問(wèn)題以及增加內(nèi)建函建escapePathSegment(String) 和 unescapePathSegment(String)

我們現(xiàn)在可以這樣寫(xiě),幾乎不會(huì)有錯(cuò)誤

  1. <urlrewrite decode-using="null"> 
  2.  <rule> 
  3.   <from>^/view/resource/(.*)/(.*)$</from> 
  4.   <-- Line breaks inserted for readability --> 
  5.   <to encode="false">/resources/details.seam  
  6.                      ?owner=${escape:${unescapePath:$1}}  
  7.                      &name=${escape:${unescapePath:$2}}</to> 
  8.  </rule> 
  9. </urlrewrite> 

唯一可能出問(wèn)題的地方是由于我們的補(bǔ)丁還不能解決以下的問(wèn)題:

  • 內(nèi)建的escaping/unescaping函數(shù)應(yīng)能只能編碼,這已經(jīng)做為下一個(gè)補(bǔ)丁(已經(jīng)做完了),或者能從http請(qǐng)求來(lái)確定(還不支持),
     
  • oldescape(String)和unescape(String)內(nèi)建函數(shù)被保留了,并且仍然調(diào)用java.net.URLDecoder,而這個(gè)包在由于沒(méi)有解決"&"和"="的問(wèn)題,所以仍然有問(wèn)題,
     
  • 我需要增加更多的局部特定的編碼和解碼函數(shù),
     
  • 我們需要增加一個(gè)方法去鑒別per-rule解碼行為,對(duì)照全局在<urlrewrite>。

我們一有時(shí)間,我們就會(huì)發(fā)布第二個(gè)補(bǔ)丁。

正確使用Apache mod-rewrite

Apache mod-rewrite是一個(gè)Apache Web服務(wù)器的網(wǎng)址重寫(xiě)模塊。例如用它來(lái)把   http://beta.visiblelogistics.com/foo 的流量代理到http://our-internal-server:8080/vl/foo

這是***的要修正的事情,就像是Url Rewrite Filter,他默認(rèn)解碼網(wǎng)址給我們,并且從新編碼重寫(xiě)過(guò)得網(wǎng)址給我們,這其實(shí)上是錯(cuò)誤的,因?yàn)?quot;解碼的網(wǎng)址不能被重新編碼"。

有一種方法可以避免這種行為,至少在我們的案例中我們沒(méi)有轉(zhuǎn)化一個(gè)網(wǎng)址部分到另一個(gè)網(wǎng)址,例如,我們不需要解碼一個(gè)路徑部分并且重新編碼它到一個(gè)查詢(xún)部分:沒(méi)有加碼也沒(méi)有重編碼。

我們通過(guò)THE_REQUEST來(lái)網(wǎng)址匹配來(lái)完成工作。他是完全的HTTP請(qǐng)求(包括HTTP方法和版本)聯(lián)合解碼。我們只要取host后面的URL部分,改變host和預(yù)設(shè)的/v/前綴和tada

  1. ...  
  2.  
  3. # This is required if we want to allow URL-encoded slashes a path segment  
  4. AllowEncodedSlashes On  
  5.  
  6. # Enable mod-rewrite  
  7. RewriteEngine on  
  8.  
  9. # Use THE_REQUEST to not decode the URL, since we are not moving  
  10. # any URI part to another part so we do not need to decode/reencode  
  11.  
  12. RewriteCond %{THE_REQUEST} "^[a-zA-Z]+ /(.*) HTTP/\d\.\d$" RewriteRule ^(.*)$ http://our-internal-server:8080/vl/%1 [P,L,NE] 

結(jié)論

我希望闡明一些URL技巧和常見(jiàn)的錯(cuò)誤。簡(jiǎn)而言之,能把它說(shuō)明白就夠了,但這不是一些人想象的那樣簡(jiǎn)單的。我們展示了java常見(jiàn)的錯(cuò)誤和一個(gè)web 應(yīng)用部署的整個(gè)過(guò)程。現(xiàn)在每個(gè)讀者都應(yīng)該是一個(gè)URL專(zhuān)家了,并且我們希望不要在看見(jiàn)相關(guān)bugs再出現(xiàn)。請(qǐng)求SUN公司,請(qǐng)為URL encoding/decoding逐項(xiàng)的增加標(biāo)準(zhǔn)支持。

英文原文:What every web developer must know about URL encoding

譯文鏈接:http://www.oschina.net/translate/what-every-web-developer-must-know-about-url-encoding

責(zé)任編輯:林師授 來(lái)源: OSCHINA編譯
相關(guān)推薦

2025-08-29 07:00:00

Go并發(fā)開(kāi)發(fā)

2023-11-17 14:18:48

開(kāi)發(fā)編程

2019-11-23 23:38:51

開(kāi)發(fā)者微服務(wù)安全

2023-11-27 15:49:55

軟件開(kāi)發(fā)系統(tǒng)設(shè)計(jì)

2025-03-05 09:21:08

2023-08-11 18:11:49

2022-04-27 09:48:56

JS前端開(kāi)發(fā)

2019-11-20 12:09:01

JavaScriptGitHub工具

2018-10-16 11:03:19

API開(kāi)發(fā)者AR

2021-03-09 10:26:24

Python開(kāi)發(fā)工具

2025-01-07 10:01:10

2012-02-28 10:52:13

2018-03-07 12:57:53

2019-05-24 09:04:31

C++編程語(yǔ)言開(kāi)發(fā)

2024-09-02 14:30:43

2016-12-19 15:35:10

Web開(kāi)發(fā)者jQueryi18n

2020-01-14 08:28:50

Linux命令程序

2014-03-07 14:20:30

2017-04-05 12:04:17

python函數(shù)

2020-10-13 18:20:55

TCPHTTP網(wǎng)絡(luò)協(xié)議
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩免费观看高清完整版在线观看| 欧美激情一区二区三区在线| 久久久久久中文字幕| 超碰97在线资源站| 欧美日韩视频免费观看| 亚洲男人的天堂一区二区| 精品久久久久久综合日本| 91丨九色丨海角社区| 欧美久久九九| 亚洲最新中文字幕| 欧美人与性动交α欧美精品| 天天综合av| 亚洲女人小视频在线观看| 久久精品国产精品国产精品污| 中文字幕乱码一区二区| 91久久在线| 久久色精品视频| 精品人妻一区二区三区香蕉 | 性猛交╳xxx乱大交| 日韩性xxx| 亚洲最大的成人av| 亚洲成人午夜在线| 天堂中文资源在线| 国产精品亚洲综合一区在线观看| 国产精品jizz在线观看麻豆| 久久久一二三区| 久久亚洲精品中文字幕蜜潮电影| 亚洲精品wwwww| 4438x全国最大成人| 成人全视频免费观看在线看| 欧美一级成年大片在线观看| 亚洲欧美日韩综合网| 暧暧视频在线免费观看| 中文字幕在线观看一区| 欧美精品亚洲| 亚洲三级黄色片| 国产精品77777| 91免费看国产| 中文字幕人妻一区二区三区视频 | 999在线观看视频| 日本中文在线观看| 欧美激情一区二区三区蜜桃视频| 久久精品magnetxturnbtih| 亚洲国产999| 国产原创一区二区| 成人黄色片在线| 97成人在线观看| 麻豆精品在线观看| 成人www视频在线观看| 影音先锋国产资源| 美女在线观看视频一区二区| 国产精品www色诱视频| 9i精品福利一区二区三区| 国产精品外国| 国产91色在线|免| 无码人妻精品一区二区三区9厂| 99亚洲一区二区| 91国内揄拍国内精品对白| 国产精品 欧美 日韩| 很黄很黄激情成人| 欧美精品第一页在线播放| 久久午夜鲁丝片午夜精品| 国内精品久久久久久久97牛牛| 欧美高清电影在线看| 国产亚洲色婷婷久久99精品| 激情婷婷亚洲| 91av成人在线| 国产精品久久久久久久妇| 日韩图片一区| 国产成人高潮免费观看精品| 午夜一级黄色片| 久久se这里有精品| 成人网在线免费看| 亚洲成人av综合| 成人av网站免费| 日本中文不卡| 国产午夜精品久久久久免费视| 亚洲精品高清视频在线观看| 国产av天堂无码一区二区三区| 芒果视频成人app| 欧美婷婷六月丁香综合色| 天堂av在线8| 亚洲视频一起| 亚洲性生活视频| 日韩视频中文字幕在线观看| 亚洲精一区二区三区| 国产精彩精品视频| 精品人妻午夜一区二区三区四区 | 中文字幕日韩av综合精品| 天天操天天摸天天舔| 国产一区亚洲| 国产不卡av在线| 国产精品久久久久久久一区二区| 国产·精品毛片| 欧美在线视频二区| 丝袜美腿av在线| 在线日韩av片| 国产精品偷伦视频免费观看了| 亚洲综合福利| 欧美成人精品在线视频| 中文字幕精品无码一区二区| 国内成人免费视频| 欧美精品七区| 天堂av资源在线观看| 欧美日韩综合在线免费观看| 丰满岳乱妇一区二区 | 久久亚洲精品无码va白人极品| 极品美女一区| 精品日韩欧美一区二区| 大胸美女被爆操| 亚洲激情专区| 亚洲一区国产精品| 成人在线观看网站| 天天影视网天天综合色在线播放| 色91精品久久久久久久久| 色综合www| 欧美人与性动交| 亚洲熟女乱色一区二区三区久久久| 成人免费看视频| 美女黄色片网站| 久久xxx视频| 亚洲欧美日韩一区二区三区在线| 久久av高潮av无码av喷吹| 六月丁香综合在线视频| 欧美精品一区二区三区久久| 韩日毛片在线观看| 精品久久国产字幕高潮| 久久精品亚洲a| 免费在线观看不卡| 欧美一二三区| 日韩影院在线| 亚洲福利在线视频| 久久精品国产亚洲av麻豆色欲 | 国产嫩草一区二区三区在线观看 | 国产亚洲电影| 91精品国产一区| 国产刺激高潮av| 亚洲精品高清视频在线观看| 色男人天堂av| 中文字幕一区二区精品区| 国产精品视频免费在线| 国产高清视频免费最新在线| 日韩欧美在线看| 无码熟妇人妻av| 国产精品普通话对白| 乱色588欧美| 综合毛片免费视频| 亚洲精品在线视频| 无码人妻丰满熟妇区bbbbxxxx| 久久久美女艺术照精彩视频福利播放| 大j8黑人w巨大888a片| 日本成人a网站| 欧美中文字幕视频| 精品无人乱码| 欧美视频精品在线| 中文字幕资源站| 国产精品自拍毛片| 日本人妻伦在线中文字幕| 高清一区二区三区| 4444欧美成人kkkk| 国内精品在线视频| 欧美精选一区二区| 久久亚洲成人av| 97精品国产97久久久久久久久久久久 | 色综合天天综合狠狠| 久久亚洲无码视频| 美女在线一区二区| 欧美 日韩 国产精品| 盗摄牛牛av影视一区二区| 国内免费精品永久在线视频| 天堂av中文在线资源库| 欧美日韩在线播放三区| 欧美成人免费观看视频 | 91精品国产综合久久婷婷香蕉| 久久久久亚洲av无码专区体验| 波多野结衣在线一区| 国产精品亚洲二区在线观看| 欧美成人直播| 国产高清不卡av| 日韩制服一区| 欧美国产日韩在线| 欧美91精品久久久久国产性生爱| 精品视频全国免费看| 九九免费精品视频| 久久久精品一品道一区| 欧美wwwwwww| 亚洲国内精品| 亚洲一区二区在线免费观看| www国产精品| 国产精品久久久久久久av大片| 粗大黑人巨茎大战欧美成人| 亚洲乱码国产乱码精品精| 一区二区国产欧美| 亚洲成人免费视频| 国产又粗又长又硬| 99久久精品一区二区| 艹b视频在线观看| 日韩视频三区| 国产女人18毛片| 禁断一区二区三区在线| 国产传媒一区二区| 国产香蕉久久| 欧美怡春院一区二区三区| 蜜桃视频网站在线| 亚洲另类图片色| 丰满熟妇乱又伦| 欧美美女bb生活片| 欧美a视频在线观看| 一区二区三区精品久久久| 欧美另类z0zx974| jiyouzz国产精品久久| 天堂中文av在线| 日韩中文字幕亚洲一区二区va在线 | 国产精品美女黄网| 久久久久黄色| 日韩av第一页| 国内激情视频在线观看| 欧美激情小视频| 国产在线高清视频| 一区二区三区视频免费| 日韩一区av| 亚洲变态欧美另类捆绑| 国产99久久九九精品无码免费| 在线观看91精品国产入口| 日韩精品一区二区三| 亚洲综合在线免费观看| 久久免费看少妇高潮v片特黄| 亚洲国产精品精华液ab| av黄色免费网站| 91玉足脚交白嫩脚丫在线播放| 伊人av在线播放| 国产一区二区三区在线观看免费 | 色综合久综合久久综合久鬼88| 91ph在线| 精品国产拍在线观看| 成年网站在线| 中文字幕精品在线视频| 国产鲁鲁视频在线观看免费| 亚洲人a成www在线影院| 日韩福利一区二区| 亚洲另类图片色| 经典三级在线| 亚洲一区二区久久| 国产日韩精品在线看| 一本色道久久88亚洲综合88| 国家队第一季免费高清在线观看| 亚洲精品一区中文| 免费在线黄色电影| 亚洲欧美日韩中文视频| 黄色视屏网站在线免费观看| 亚洲性夜色噜噜噜7777| 日韩av中文| 久久伊人91精品综合网站| 91高清在线观看视频| 欧美精品性视频| 草美女在线观看| 2019中文在线观看| 欧美一级大片| 国产热re99久久6国产精品| 日本亚洲欧洲无免费码在线| 99se婷婷在线视频观看| 大奶一区二区三区| 免费日韩av电影| 欧美日韩水蜜桃| 亚洲综合激情五月| 国产综合婷婷| www黄色在线| 激情综合网av| 亚洲欧美日韩偷拍| 国产欧美一区二区在线| 中文字幕在线观看2018| 亚洲一卡二卡三卡四卡五卡| wwwwww国产| 欧美色大人视频| 亚洲国产精品久久久久久久| 日韩精品极品毛片系列视频| 91在线品视觉盛宴免费| 美女av一区二区三区 | 动漫精品一区二区三区| 中文字幕欧美三区| 欧美日韩精品在线观看视频 | 一级黄色片网站| 精品少妇一区二区三区在线播放| 亚洲av成人精品毛片| 视频在线观看一区二区| 欧美aaaaaaa| 国产精品久久久久久久久久久久 | 国产精品色婷婷| 久久午夜无码鲁丝片| 在线视频观看一区| 亚洲乱码在线观看| 亚洲欧洲在线观看| 99热国产在线| 国产精品美女免费| 澳门久久精品| 亚洲一区二区精品在线| 亚洲美女黄网| 在线观看av免费观看| 久久亚洲影视婷婷| 日本天堂中文字幕| 欧美在线制服丝袜| 色屁屁草草影院ccyycom| 中文字幕亚洲欧美日韩高清| 成av人片在线观看www| 91九色单男在线观看| 国产一区二区精品福利地址| 免费看日本黄色| 美女网站在线免费欧美精品| 中国av免费看| 一区二区欧美精品| 亚洲视频中文字幕在线观看| 日韩成人中文电影| 色yeye免费人成网站在线观看| 国产精品视频区| 亚洲8888| 精品国产一二三四区| 国产a视频精品免费观看| 99成人在线观看| 欧美日韩一区三区| 免费在线视频你懂得| 78m国产成人精品视频| 韩国女主播一区二区三区| 成人区一区二区| 国产精品综合久久| 午夜爽爽爽男女免费观看| 欧美系列亚洲系列| 国产一二三区在线| 欧美制服第一页| 日韩成人动漫在线观看| 黄页网站在线观看视频| 国产.欧美.日韩| 成人免费看片98| 欧美va亚洲va| 污影院在线观看| 99久久精品久久久久久ai换脸| 久久精品久久久| 午夜精品免费看| 亚洲欧美在线观看| 国产美女明星三级做爰| 色久欧美在线视频观看| 免费成人毛片| 一区二区三区三区在线| 免费成人美女在线观看| 欧美日韩生活片| 欧美放荡的少妇| h片在线免费| 99精彩视频在线观看免费| 亚洲性图久久| 污污免费在线观看| 欧美视频在线视频| 国家队第一季免费高清在线观看| 国产精品7m视频| 日韩欧美1区| 日本一区二区三区在线免费观看| 亚洲欧美色综合| 风流老熟女一区二区三区| 久久久免费观看| 伊人久久大香线蕉综合网站| 国产v亚洲v天堂无码久久久 | 99精品一级欧美片免费播放| 国产美女久久久久| 久久视频免费看| 亚洲乱码国产乱码精品精天堂| 中文另类视频| 免费观看国产视频在线| 丁香激情综合五月| 精品不卡一区二区| 中文字幕国内精品| 日韩欧美久久| 欧美老熟妇喷水| 国产精品日日摸夜夜摸av| 精品二区在线观看| 91精品国产九九九久久久亚洲| 国产亚洲电影| gogo亚洲国模私拍人体| 欧美午夜片在线免费观看| av网站无病毒在线| 成人一区二区在线| 免费精品视频| 国产美女久久久久久| 亚洲精品久久久久久下一站 | 亚洲精品一区二区三区影院| 日韩精品美女| 中国一级黄色录像| 91小视频免费观看| 国产精品无码一区二区桃花视频| 久久久亚洲精品视频| 日韩久久精品网| 欧美一级片黄色| 欧美精选午夜久久久乱码6080| av中文字幕在线观看第一页| 亚洲aⅴ天堂av在线电影软件| 国产精品资源站在线| 波多野结衣毛片| 欧美精品videosex牲欧美| 日本一本不卡| 亚洲啪av永久无码精品放毛片| 精品视频免费看| а√在线中文网新版地址在线| 亚洲精品欧美精品|