URL易容術(shù)

導(dǎo)言

每一個(gè)網(wǎng)頁開發(fā)者都想讓自己的網(wǎng)站擁有一個(gè)或狂拽酷炫,或標(biāo)新立異酿炸,或清新文藝的URL地址瘫絮。就像每一對父母即使費(fèi)盡心機(jī)、絞盡腦汁填硕,也要給自己的孩子起一個(gè)有個(gè)性的好名字一樣麦萤。一個(gè)好的網(wǎng)站地址不僅能夠讓來訪用戶在還沒進(jìn)入網(wǎng)站之前就知曉網(wǎng)站的主要內(nèi)容(比如,知名在線編程教學(xué)網(wǎng)站www.codecademy.com扁眯,只看這個(gè)URL就知道是與編程相關(guān))壮莹,更重要的是,一個(gè)簡潔直觀且達(dá)意的URL將大大的利于搜索引擎優(yōu)化(SEO, Search Engine Optimization)姻檀,讓搜索引擎能夠更好的識別網(wǎng)站的信息與內(nèi)容命满,從而提升網(wǎng)站在搜索引擎出現(xiàn)的位置以獲取更多的訪問量(谷歌君看完這句話給我點(diǎn)了一個(gè)贊,而度娘沒有任何反應(yīng)绣版。于是我問她:“女神胶台,我不知道你是怎么看待SEO這件事的狭莱,但為什么你們家的搜索結(jié)果總是給人一種欽定的感覺呢。概作。∧梗” )讯榕。今天,我們就來探討一下如何“PS”網(wǎng)站的URL匙睹,讓它們看起來更“美麗動(dòng)人”愚屁。

URL重寫

1. 什么是URL重寫?(URL Rewriting)

URL重寫就是利用服務(wù)器端的URL重寫模塊(URL Rewriting Module)以及基于Perl語言的正則表達(dá)式,將真實(shí)的URL隱藏起來痕檬,跳轉(zhuǎn)到另外指定的URL霎槐。
比如,我們擁有一家網(wǎng)上水果商店梦谜,它的網(wǎng)址是:

http://www.freshfruits.com/

當(dāng)一位用戶在該網(wǎng)站選擇了蘋果這個(gè)類別時(shí)丘跌,URL變?yōu)椋?/p>

http://www.freshfruits.com/get_fruits_by_name.php?fruit_name=apple

可是我們并不想也不需要讓用戶看見這個(gè)冗長“丑陋”的URL出現(xiàn)在瀏覽器地址欄,我們想給用戶看的是這樣的一個(gè)簡單明了“顏值高”的URL:

http://www.freshfruits.com/apple

利用URL重寫模塊唁桩,我們就可以實(shí)現(xiàn)這個(gè)目標(biāo)闭树。換句話說,當(dāng)用戶看到www.freshfruits.com/apple這個(gè)網(wǎng)址時(shí)荒澡,事實(shí)上瀏覽器渲染的真實(shí)頁面是www.freshfruits.com/get\_fruits\_by\_name.php?fruit_name=apple”报辱。這樣,就完成了對用戶隱藏真實(shí)的URL单山,讓另外一個(gè)更“好看”的URL顯示在用戶的瀏覽器地址欄的任務(wù)碍现。
對于最常用的兩種Web服務(wù)器Apache和IIS來說,Apache本身就內(nèi)置了URL重寫模塊米奸,而IIS則需要使用相關(guān)插件來實(shí)現(xiàn)昼接。本文的所有代碼和實(shí)例都基于Apache服務(wù)器。

2. 正則表達(dá)式

沒有正則表達(dá)式躏升,就沒有URL重寫辩棒。在我的印象里,正則表達(dá)式就跟它的名字一樣膨疏,古怪一睁,神秘,但聽起來又逼格十足佃却。它常常出沒于需要對字符進(jìn)行匹配查找替換等情境中者吁,強(qiáng)大到超乎想象。如果想要深入的學(xué)習(xí)它饲帅,就自行上網(wǎng)搜索一下吧复凳,精彩的教程多到令人目不暇接瘤泪。如果不感興趣也沒關(guān)系,只要記住下面這些基本的元字符就足以Hold住大部分的URL重寫了育八。

.  (匹配任意單個(gè)字符)
*  (匹配前面的子表達(dá)式0次或多次对途,即任意次)
+  (匹配前面的子表達(dá)式至少1次)
^  (匹配輸入字符串的開始位置)
{} (限定匹配次數(shù))
?  (非貪婪匹配,即匹配前面的子表達(dá)式0次或1次)
!  (相當(dāng)于邏輯"非")
$  (匹配輸入字符串的結(jié)束位置)
[] (匹配所包含的任意字符)
() (將括號間的表達(dá)式定義為"組")
|  (邏輯"或")
\\  (轉(zhuǎn)義字符)
3. URL重寫的基本步驟

先舉一個(gè)簡單的例子:
我們要把這個(gè)URL隱藏起來:

http://www.freshfruits.com/apple_product_info.php

而我們想要瀏覽器地址欄顯示的是這個(gè)URL:

http://www.freshfruits.com/apple/

首先髓棋,我們需要到Web服務(wù)器的根目錄下新建一個(gè)“.htaccess”文本文件(與apple\_product\_info.php在同一級目錄实檀,這里需要注意,新建的文件名稱就叫“.htaccess”按声,句點(diǎn)前不要加任何前綴)膳犹。“.htaccess”是一個(gè)簡單的服務(wù)器配置文件签则。如果在根目錄下已經(jīng)有了一個(gè)“.htaccess”文件(通常為隱藏文件)须床,我們只需要打開修改里面的內(nèi)容就好了。
接下來渐裂,用任意一種文本文檔編輯器打開.htaccess文件豺旬,在里面添加下面這兩行代碼:

RewriteEngine On    # 打開URL重寫引擎
RewriteRule  ^apple/?$   apple_product_info.php    [NC,L]   # 創(chuàng)建重寫規(guī)則,在這里我們讓服務(wù)器把滿足匹配^apple/?$模式的URL請求轉(zhuǎn)向apple_product_info.php芯义。想知道[NC, L]是什么哈垢,接著往下看。扛拨。耘分。

利用最基本的正則表達(dá)式 "^apple/?$"及重寫規(guī)則,我們就完成了對URL的"易容"绑警。

4. 立"Flag"要慎重

你沒有看錯(cuò)求泰,我們就是要立Flag。Flag是URL重寫里很重要的一個(gè)概念计盒,是它告訴Apache服務(wù)器該怎樣去理解和處理重寫規(guī)則渴频。上面的例子中,[NC, L]里的NC和L就是兩個(gè)Flag北启。那么卜朗,就讓我們通過下面的總結(jié)來看看這些Flag到底是什么意思吧。

C (chained with next rule) 關(guān)聯(lián)下一個(gè)規(guī)則
CO = cookie (set specified cookie)  設(shè)置指定的cookie
E=var:value (set environment variable var to value) 設(shè)置環(huán)境變量
F (forbidden - sends a 403 header to the user)  禁用URL并返回403HTTP狀態(tài)碼
G (gone - no longer exists)  強(qiáng)制URL為gone并返回410HTTP狀態(tài)碼
L (last - stop processing rules)  指定當(dāng)前規(guī)則為最后執(zhí)行的一條規(guī)則咕村,之后的規(guī)則將被忽略
N (next - continue processing rules)  從第一條規(guī)則重新開始重寫
NC (case insensitive)    不區(qū)分大小寫
NE (do not escape special URL characters in output)  不再輸出特殊字符场钉,如轉(zhuǎn)義字符
NS (ignore this rule if the request is a subrequest) 忽略子請求
P (proxy - i.e., apache should grab the remote content specified in the substitution section and return it)  強(qiáng)制使用代理
PT (pass through - use when processing URLs with additional handlers, e.g., mod_alias)  傳遞處理
R (temporary redirect to new URL)  暫時(shí)重定向
R=301 (permanent redirect to new URL) 永久重定向
QSA (append query string from request to substituted URL)  追加請求字符串
S=x (skip next x rules)  跳過接下來的x條規(guī)則
T=mime-type (force specified mime type) 強(qiáng)制MIME類型

讓我們對照著這份Flag總結(jié)再次回到上面那個(gè)例子中。[NC, L]就是告訴服務(wù)器懈涛,不需要區(qū)分大小寫逛万,然后忽略其他的規(guī)則。所以批钠,即使你輸入了大寫的地址宇植,比如"www.freshfruits.com/Apple/"得封,服務(wù)器也能夠返回正確的頁面信息。

5. 不只是為了好看

可能你會(huì)問指郁,我們?yōu)槭裁匆獙RL進(jìn)行重寫呢忙上,難道只是因?yàn)楹每矗课业幕卮鹗窍锌玻堑某亢幔褪菫榱撕每?。好吧箫柳,我錯(cuò)了。各位看官別走啥供,我哪有這么膚淺悯恍。。伙狐。
對于簡單的單頁網(wǎng)頁應(yīng)用(某些小的Landing Page)來說涮毫,沒有那些復(fù)雜的功能,一個(gè)固定的靜態(tài)URL就可以代表一切贷屎。而從那些稍微復(fù)雜的網(wǎng)站開始罢防,比如有多頁面需要頁面間的跳轉(zhuǎn),有用戶信息的登錄登出唉侄,有網(wǎng)頁內(nèi)表格的提交等等咒吐,就必須使用動(dòng)態(tài)URL來實(shí)現(xiàn)這些功能。所以属划,我們看到的URL就變成了這樣:

http://www.fruits.com/users.php?user_name=主席&user_gender=男&user_birthday=1926

然而恬叹,這樣的URL真的好嘛,把用戶的名字性別生日等個(gè)人信息徹底暴露同眯,甚至還可能會(huì)泄露用戶的個(gè)人密碼绽昼。而這個(gè)時(shí)候,利用URL重寫規(guī)則须蜗,我們不僅僅能讓URL變得好看硅确,更重要的是可以使用戶的信息得到更好的保護(hù)。
這才是URL重寫的主要目的:動(dòng)態(tài)URL的偽靜態(tài)化明肮。

總結(jié)

利用重寫規(guī)則我們可以做很多復(fù)雜且高效的URL重寫菱农,譬如,我們還可以添加Rewrite Conditions(重寫條件)來控制允許URL重寫的條件晤愧。限于篇幅(其實(shí)是我不想寫了大莫,規(guī)則太多寫不下去了。官份。只厘。逃烙丛。。羔味。)河咽,本文只展示了一個(gè)極其簡單到令人發(fā)指想打作者的重寫實(shí)例。然而赋元,窺一斑而知全豹忘蟹。在遇到自己開發(fā)的網(wǎng)頁需要對URL進(jìn)行修飾的時(shí)候,我們便會(huì)想到利用服務(wù)器的URL重寫模塊搁凸,并且深入學(xué)習(xí)強(qiáng)大的URL重寫規(guī)則媚值,從而獲得我們需要的重寫效果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末护糖,一起剝皮案震驚了整個(gè)濱河市褥芒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嫡良,老刑警劉巖锰扶,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異寝受,居然都是意外死亡坷牛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進(jìn)店門很澄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來京闰,“玉大人,你說我怎么就攤上這事甩苛∶Ω桑” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵浪藻,是天一觀的道長捐迫。 經(jīng)常有香客問我,道長爱葵,這世上最難降的妖魔是什么施戴? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮萌丈,結(jié)果婚禮上赞哗,老公的妹妹穿的比我還像新娘。我一直安慰自己辆雾,他們只是感情好肪笋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般藤乙。 火紅的嫁衣襯著肌膚如雪猜揪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天坛梁,我揣著相機(jī)與錄音而姐,去河邊找鬼。 笑死划咐,一個(gè)胖子當(dāng)著我的面吹牛拴念,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播褐缠,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼政鼠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了队魏?” 一聲冷哼從身側(cè)響起缔俄,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎器躏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蟹略,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡登失,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挖炬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揽浙。...
    茶點(diǎn)故事閱讀 38,117評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖意敛,靈堂內(nèi)的尸體忽然破棺而出馅巷,到底是詐尸還是另有隱情,我是刑警寧澤草姻,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布钓猬,位于F島的核電站,受9級特大地震影響撩独,放射性物質(zhì)發(fā)生泄漏敞曹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一综膀、第九天 我趴在偏房一處隱蔽的房頂上張望澳迫。 院中可真熱鬧,春花似錦剧劝、人聲如沸橄登。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拢锹。三九已至谣妻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間面褐,已是汗流浹背拌禾。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留展哭,地道東北人湃窍。 一個(gè)月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像匪傍,于是被迫代替她去往敵國和親您市。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 此文章轉(zhuǎn)載~ Apache偽靜態(tài)(Rewrite).htaccess文件詳解 Htaccess(超文本訪問)是一個(gè)...
    bornfreekiss閱讀 4,107評論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理役衡,服務(wù)發(fā)現(xiàn)茵休,斷路器,智...
    卡卡羅2017閱讀 134,600評論 18 139
  • 上一篇《WEB請求處理一:瀏覽器請求發(fā)起處理》手蝎,我們講述了瀏覽器端請求發(fā)起過程榕莺,通過DNS域名解析服務(wù)器IP,并建...
    七寸知架構(gòu)閱讀 80,925評論 21 356
  • 《 微習(xí)慣》簡單到不能失敗的自我管理法則棵介,這書名一下吸引了我的注意擎颖,我有很多很多計(jì)劃可是實(shí)施一段時(shí)間我就堅(jiān)持不...
    D016pudding閱讀 185評論 0 0
  • 人活多少歲最為合適呢吨述?這還真是個(gè)難題岩睁。康熙王朝的主題曲中揣云,有句歌詞捕儒,“我真的還想再活五百年”。作為統(tǒng)治者邓夕,九五之尊...
    皇氏三墳閱讀 2,048評論 0 1