精品欧美一区二区三区在线观看 _久久久久国色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)

亚洲色图都市激情| 久久久久中文字幕| 久久人人爽av| a视频在线观看| 成人美女视频在线观看| 日韩免费观看av| 暗呦丨小u女国产精品| 久草在线综合| 欧美怡红院视频| www.欧美黄色| 1024免费在线视频| www.欧美色图| 成人av资源在线播放| 日本三级视频在线| 99精品在线免费在线观看| 精品sm捆绑视频| av在线网址导航| 日韩深夜视频| 亚洲综合自拍偷拍| 亚洲日本精品一区| 亚洲色图另类小说| 国产精品影音先锋| 国产精品久久久久久久久久免费 | 中文字幕在线免费不卡| 狠狠色噜噜狠狠色综合久| 亚洲中文字幕在线一区| 亚洲免费影视| 欧美黑人巨大xxx极品| 国产成人精品视频免费| 亚洲丝袜啪啪| 亚洲国产精品va在线| 天天干天天色天天干| 亚洲日本在线观看视频| 黄色一区二区在线观看| 日本aa在线观看| 麻豆传媒在线完整视频| 欧美激情综合五月色丁香| 久久精品99久久| 人人妻人人玩人人澡人人爽| 国产酒店精品激情| 成人网址在线观看| 中文字幕第三页| 首页综合国产亚洲丝袜| 91超碰中文字幕久久精品| 国产在线一区视频| 国内视频精品| 欧美极品少妇与黑人| 中文字幕av久久爽av| 国产精品不卡| 久久精品中文字幕电影| 国精品人伦一区二区三区蜜桃| 欧美日韩激情在线一区二区三区| 亚洲欧美精品在线| 国产aⅴ激情无码久久久无码| 欧洲亚洲成人| 亚洲欧美制服第一页| 在线免费观看成年人视频| 欧美丝袜美腿| 日韩国产精品视频| 欧美成人午夜精品免费| 制服丝袜日韩| 亚洲色图激情小说| 四季av中文字幕| 欧美hentaied在线观看| www.亚洲免费视频| 亚洲二区在线播放| 综合天天久久| 海角国产乱辈乱精品视频| 精品午夜福利视频| 最新成人av网站| 7m精品福利视频导航| 亚洲欧美日韩激情| 秋霞电影网一区二区| 国产一区二区丝袜高跟鞋图片| 一级黄色a视频| 国产美女娇喘av呻吟久久| 风间由美久久久| 神马亚洲视频| 中文字幕欧美三区| 国内外成人激情免费视频| 久久www人成免费看片中文| 精品国产成人在线| 亚洲一区二区三区四区五区xx| 少妇高潮一区二区三区99| 日韩欧美的一区| 自拍视频一区二区| 欧美gayvideo| 久久免费精品视频| 无码日韩精品一区二区| 狠狠色狠狠色综合系列| 激情一区二区三区| 999国产在线视频| 亚洲综合色在线| 妞干网在线免费视频| 在线免费成人| 亚洲激情中文字幕| 中文字幕91视频| 亚洲精品社区| 国产啪精品视频| 午夜性色福利视频| 中文字幕一区二区三区色视频| 欧美乱大交xxxxx潮喷l头像| 欧美free嫩15| 精品国产乱码久久久久久蜜臀 | 欧美精品国产精品日韩精品| 欧产日产国产69| 国产麻豆精品在线| 欧美日韩一区二区三| 欧美性猛交xxx乱大交3蜜桃| 午夜激情久久久| 成人日韩在线视频| 日韩精品免费一区二区夜夜嗨| www.日韩欧美| 无码任你躁久久久久久久| 高清成人在线观看| 一区二区精品在线| 少妇一区视频| 日韩精品影音先锋| 大地资源高清在线视频观看| 亚洲欧美日本视频在线观看| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 欧美三级一区| 在线日韩第一页| 国产精品suv一区二区三区| 国内精品视频一区二区三区八戒| 欧美久久久久久| 俄罗斯一级**毛片在线播放| 欧美人xxxx| 日本一道本视频| 亚洲在线日韩| 激情一区二区三区| 韩国日本一区| 欧美va亚洲va| 欧美成欧美va| 国产精品一级在线| 中文字幕色一区二区| 国产精品诱惑| 中文字幕欧美日韩va免费视频| 日韩在线视频不卡| 久久这里只有精品6| 久久国产精品视频在线观看| 精品中文字幕一区二区三区| 日韩一区二区av| 涩涩视频在线观看| 亚洲国产成人自拍| 中文字幕国产免费| 欧美激情偷拍自拍| 成人欧美一区二区三区黑人孕妇 | 国产女主播在线一区二区| 日本在线视频www| 羞羞答答一区二区| 欧美一二三视频| 你懂的视频在线| 日韩欧美在线国产| 欧美成人国产精品一区二区| 日韩国产在线一| 污视频在线免费观看一区二区三区| 在线毛片观看| 一区二区欧美激情| 国产精品51麻豆cm传媒| 国产精品欧美综合在线| www午夜视频| 亚洲啊v在线观看| 岛国视频一区免费观看| 不卡视频观看| 亚洲欧美国产一区二区三区| 人妻中文字幕一区二区三区| 国产精品久久久久久久久久久免费看 | 91大神在线观看线路一区| 色一区av在线| 朝桐光av在线一区二区三区| 婷婷开心激情综合| 人人妻人人藻人人爽欧美一区| 日韩在线一二三区| 日韩视频在线免费播放| 6080亚洲理论片在线观看| 午夜精品久久久久久久久久久久久| 视频国产在线观看| 欧美精品日韩一本| 久久精品视频日本| 久久久www成人免费无遮挡大片| 欧美午夜性生活| 永久亚洲成a人片777777| 国产精品对白一区二区三区| 欧美成人h版| 久久综合久久88| 污视频在线免费| 欧美日韩久久不卡| 欧美一级高潮片| 国产视频一区二区在线观看| 国产九九九视频| 香蕉久久国产| 自拍偷拍一区二区三区| 欧美电影在线观看完整版| 国产精品三级美女白浆呻吟 | 日韩成人a**站| 国产精品国产三级国产专区53| 唐人社导航福利精品| 欧美成人一二三| 黄色在线播放| 欧美www视频| 夜夜躁很很躁日日躁麻豆| 黄色精品一区二区| 一区二区视频免费看| 久久久国产精品麻豆| 风韵丰满熟妇啪啪区老熟熟女| 视频一区二区欧美| 欧美日韩不卡在线视频| 日韩在线观看一区| 久久riav| 91精品入口| 91精品国产综合久久久久久久久| 亚洲电影观看| 欧美精品成人在线| 精品麻豆一区二区三区| 亚洲人成电影网站色xx| 色香蕉在线视频| 日韩视频一区二区| 一区二区国产欧美| 日本久久一区二区三区| 日韩精品在线免费看| 一区二区三区.www| 最新黄色av网址| 久久久99精品免费观看不卡| 久久福利小视频| 成人一区二区三区在线观看| www.涩涩涩| 久久久久中文| 人妻少妇被粗大爽9797pw| 亚洲无线视频| 国产午夜精品视频一区二区三区| 欧美oldwomenvideos| 亚洲一区二区高清视频| 精品国产日韩欧美| 欧洲精品亚洲精品| 在线日韩一区| 日本欧美精品久久久| 神马香蕉久久| 久久久久久久免费| 日韩美脚连裤袜丝袜在线| 国产高清精品一区二区三区| 中文字幕一区二区三区四区久久 | 无码日韩人妻精品久久蜜桃| 久久成人一区| 88av.com| 蜜臂av日日欢夜夜爽一区| 我看黄色一级片| 美女在线一区二区| 久久黄色片网站| 精品一区二区免费视频| 小明看看成人免费视频| 另类小说视频一区二区| 91亚洲精品久久久蜜桃借种| 裸体在线国模精品偷拍| 日本网站在线看| 国产毛片精品国产一区二区三区| 少妇欧美激情一区二区三区| 成熟亚洲日本毛茸茸凸凹| 精品国产乱码久久久久夜深人妻| 丁香网亚洲国际| 捆绑裸体绳奴bdsm亚洲| 久久久亚洲精品一区二区三区 | 亚洲综合男人的天堂| 久久久久久久黄色| 欧美日韩视频免费播放| 日本中文字幕第一页| 在线精品视频免费播放| 一本大道伊人av久久综合| 欧美一级在线观看| 天堂在线资源网| 亚洲欧美日韩在线高清直播| 国产黄在线看| 久久的精品视频| 91福利在线尤物| 国产精品xxxxx| 日韩色性视频| 高清视频在线观看一区| 女优一区二区三区| 在线码字幕一区| 日韩视频一区二区三区在线播放免费观看| 日本中文字幕片| 九一九一国产精品| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 人人狠狠综合久久亚洲婷| 在线天堂一区av电影| 亚洲大片av| 香蕉视频网站入口| 国产91对白在线观看九色| 永久免费成人代码| 亚洲免费在线观看视频| 91在线视频在线观看| 欧美人狂配大交3d怪物一区| 殴美一级特黄aaaaaa| 亚洲性视频网址| sis001亚洲原创区| 国产日韩换脸av一区在线观看| 激情视频极品美女日韩| 亚洲综合欧美日韩| 亚洲一区二区三区免费在线观看| 亚洲最大综合网| 99视频一区二区三区| 一级免费黄色录像| 色播五月激情综合网| 国产成人无码www免费视频播放| 亚洲一级黄色av| 极品av在线| 亚洲伊人一本大道中文字幕| 国产精品美女久久久久久不卡| 国产欧美久久久久| 国产午夜大地久久| 国产美女精品一区二区三区| 国产人妻大战黑人20p| 亚洲va天堂va国产va久| 国产又黄又猛又爽| 亚洲一二在线观看| 一个人www视频在线免费观看| 91欧美激情另类亚洲| 国内精品伊人久久久| 999在线观看视频| 国产成人亚洲综合a∨猫咪| 日本午夜精品视频| 日韩欧美国产中文字幕| 人人妻人人澡人人爽精品日本 | 亚洲精品福利在线观看| 日韩影视在线| 亚洲bt欧美bt日本bt| 日本a口亚洲| 亚洲一区在线不卡| 国产亚洲婷婷免费| 性无码专区无码| 亚洲电影免费观看| а√天堂中文资源在线bt| 97超级碰碰| 午夜欧美精品| 手机在线观看日韩av| 亚洲免费伊人电影| 国产视频手机在线| 久久成人av网站| 国产精品日韩精品在线播放| 一区二区三区在线观看www| 免费一级片91| 久久久免费看片| 欧美日韩一区高清| 91社区在线观看| 国产美女搞久久| 久久中文字幕av一区二区不卡| 91香蕉视频污版| 国产欧美日本一区视频| 瑟瑟视频在线免费观看| 中文字幕亚洲一区| 四虎国产精品免费久久5151| 亚洲综合欧美日韩| 国产精品一级在线| 久久精品这里有| 亚洲精品美女网站| www.成人影院| 亚洲人成网站在线播放2019| 老色鬼精品视频在线观看播放| 999精品视频在线观看播放| 制服丝袜亚洲精品中文字幕| av网站导航在线观看免费| 国产精品久久久久久久久久直播| 日韩午夜一区| 俄罗斯毛片基地| 日韩欧美二区三区| 制服丝袜专区在线| 亚洲欧美综合一区| 国产黑丝在线一区二区三区| 国产午夜福利片| 国产亚洲欧洲高清| 久久精品免视看国产成人| 欧美一级片免费播放| 久久欧美一区二区| 在线观看不卡的av| 欧美高清视频一区二区| 欧美在线关看| 亚洲欧美aaa| 精品久久久久久中文字幕一区奶水 | 懂色av.com| 这里只有精品丝袜| 免费观看亚洲天堂| 国产午夜福利视频在线观看| 国产精品美女一区二区在线观看| 国产精品美女一区| 91成人性视频| 天天久久综合| 日本性生活一级片| 欧美午夜电影在线播放| 日韩激情av| 亚洲黄色一区二区三区| 国v精品久久久网| 中文字幕一区2区3区| 欧美激情精品久久久久久久变态| 久久93精品国产91久久综合| 亚洲制服在线观看| 在线一区二区三区做爰视频网站| а√中文在线8| 日本免费高清不卡| 不卡av在线免费观看| 91午夜交换视频|