導(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ī)則媚值,從而獲得我們需要的重寫效果。