|
|
新聞詳情
企業(yè)官網(wǎng)301重定向的編寫及更改22
發(fā)表時(shí)間:2021-03-03 18:22作者:蕪湖網(wǎng)絡(luò)推廣 實(shí)現(xiàn)重定向有許多可能的方法,在Apache網(wǎng)絡(luò)服務(wù)器上(通常作為操作系統(tǒng)呈現(xiàn)在運(yùn)行UNIX或Linux的機(jī)器中),我們能夠在一個(gè)名為.htacess的標(biāo)準(zhǔn)文件中使用Redirect和RedirectMatch指令輕松地進(jìn)行重定向。另外,你還可以使用一些稱為rewire rules的高級(jí)指令,使用稱為mod_rewrite的Apache組件進(jìn)行重定向,我們稍后將對(duì)此進(jìn)行講解。 在運(yùn)行Microsoft IIS的網(wǎng)絡(luò)服務(wù)器中,提供了多種執(zhí)行重定向的方法。正如我們?cè)?/span>“IIS Redirects-301,302”中所描述的那樣,最基本的方法是使用IIS控制臺(tái)。具有IIS服務(wù)器的用戶還可以使用一個(gè)帶有指令的文本文件,假設(shè)他們使用ISAPI插件,如ISAPI_Rewrite,這一腳本語言具有與Apache mod_rewrite組件相類似的功能。 許多程序員會(huì)使用其他的技巧執(zhí)行重定向,如直接在程序語言中運(yùn)行,如Perl、PHP、ASP和JavaScript。如果以這種形式運(yùn)行重定向,那么程序員必須確保網(wǎng)絡(luò)服務(wù)器返回的HTTP狀態(tài)碼是301。你可以使用Firefox插件Live HTTP Headers、Chrome擴(kuò)展或基于網(wǎng)絡(luò)的服務(wù)器標(biāo)題檢測(cè)工具檢查返回的標(biāo)題。 另外一種執(zhí)行重定向的方法是在頁面層面通過使用元refresh標(biāo)簽執(zhí)行的,該標(biāo)簽看起來像下面這樣:在content部分的第一個(gè)參數(shù)5表示網(wǎng)絡(luò)服務(wù)器在將用戶重定向至指定頁面前需等待的時(shí)間,發(fā)布者可能會(huì)使用這一方法展示頁面,讓用戶知道他們將被重定向至一個(gè)與其目標(biāo)頁面不同的頁面。 但問題是,大部分元新標(biāo)簽都會(huì)被看作302重定向,唯一的例外情況是你將重定向延遲設(shè)置為0秒。你需要放棄能夠告知用戶你在進(jìn)行重定向的幫助頁面,但搜索引擎可能會(huì)把它看作301重定向(為安全起見,最好的做法是盡量使用301重定向)。 網(wǎng)址重寫和重定向的mod_rewrite和ISAPI_Rewrite 對(duì)于該話題,有大量的內(nèi)容可寫,本書僅呈現(xiàn)一部分。下面的描述僅是一個(gè)簡單的描述,旨在幫助一些包括網(wǎng)絡(luò)設(shè)計(jì)者和網(wǎng)站管理者在內(nèi)的專業(yè)人員了解重寫和重定向是如何運(yùn)行的。要跳過這一技術(shù)性話題,“如何在無循環(huán)的情況下重定向主頁索引文件”。 Apache的mod_rewrite及Microsoft IIS服務(wù)器的ISAPI_Rewrite均為網(wǎng)址重寫提供了很好的途徑,使用這些工具的原因如下: 你已經(jīng)改變了網(wǎng)站中的網(wǎng)址結(jié)構(gòu),所以內(nèi)容也從一個(gè)位置移動(dòng)到了另一個(gè)位置,當(dāng)你出于某些原因而改變CMS或網(wǎng)站體制時(shí),便會(huì)出現(xiàn)這種情況。 你想將一些不適應(yīng)搜索引擎的網(wǎng)址替換為搜索引擎友好型網(wǎng)址。 如果你將Apache作為自己的網(wǎng)絡(luò)服務(wù)器,那么你會(huì)在.htaccess文件或Apache配置文件中放置一個(gè)稱為rewrite rules的指令(如sites_conf目錄中的httpd.conf或站點(diǎn)特定的配置文件)。同樣地,如果你使用的是IIS服務(wù)器,那么你會(huì)使用一個(gè)ISAPI插件,如ISAPI_Rewrite,而將規(guī)則放在httpd.ini配置文件中。 需要注意的是,ISAPI_Rewrite和mod_rewrite的規(guī)則可能有所不同,而下面的討論主要圍繞mod_rewrite展開,你的.htaccess文件可能這樣開頭: 如果你要將rewrite添加到服務(wù)器配置文件中,則需要?jiǎng)h除第二行,因?yàn)橹挥?/span>.htaccess支持RewriteBase。我們?cè)谶@里使用的是RewriteBase,這樣你便不需要在所有規(guī)則的開頭都輸入^/,而只要輸入^即可(我們稍后會(huì)介紹正則表達(dá)式)。 完成這一步之后,重寫規(guī)則便會(huì)被運(yùn)行,或許你要求在不改變用戶瀏覽器位置欄的網(wǎng)址和不重新編碼get_product.php腳本的情況下,http://www.yourdomain.com/products/123格式下的產(chǎn)品頁面網(wǎng)址能夠顯示http://www.yourdomain.com/get_product.php?id=123中的內(nèi)容。當(dāng)然,這不能取代所有出現(xiàn)在網(wǎng)站頁面鏈接中的動(dòng)態(tài)網(wǎng)址,那屬于另一個(gè)話題范圍了。你可以使用一個(gè)簡單的重寫規(guī)則實(shí)現(xiàn)第一部分的要求,類似于: 這個(gè)例子告訴網(wǎng)絡(luò)服務(wù)器所有進(jìn)入/product/目錄的搜索請(qǐng)求都應(yīng)被映射到/get_product.php請(qǐng)求,同時(shí)使用/product/的子文件夾作為PHP腳本的參數(shù)。 ^符號(hào)表示域名網(wǎng)址的開頭,$符號(hào)表示網(wǎng)址的結(jié)尾,[0-9]表示數(shù)位,而緊隨其后的+符號(hào)表示數(shù)位的一次或多次出現(xiàn)。同樣地,/后面的?表示斜杠符號(hào)出現(xiàn)0次或1次,()符號(hào)會(huì)記住所有括號(hào)內(nèi)的內(nèi)容,之后,你可以使用$1訪問緩存中的內(nèi)容(如,第一組括號(hào)內(nèi)的全部內(nèi)容)。不足為奇的是,如果規(guī)則中包含第二組括號(hào),那么你可以使用$2訪問第二組括號(hào)的所有內(nèi)容,依次類推。[L]標(biāo)志保存在服務(wù)器進(jìn)程中,指示重寫引擎一旦匹配該規(guī)則便停止運(yùn)行,否則,所有剩下的規(guī)則就會(huì)被運(yùn)行。 下面是一個(gè)稍微復(fù)雜點(diǎn)的例子,http://www.yourdo-main.com/webapp/wcs/stores/servlet/ProductDisplay?storeId=10001&catalogId=10001&langId=-1&categoryID=4&productID=123格式的網(wǎng)址將被重寫為http://www.yourdomain.com/4/123.htm: [^/]表示除了斜線之外的任一符號(hào),這是因?yàn)?/span>^在方括號(hào)內(nèi)被理解為不。[QSA]標(biāo)志是表示你不希望搜索請(qǐng)求字符串被緩存(就像你不希望追蹤參數(shù)被保存一樣)。 要撰寫優(yōu)質(zhì)的重寫規(guī)則,你需要變成一個(gè)模式匹配大師(這是描述正則表達(dá)式功能的另一種方式),下面列舉一些最重要的特殊符號(hào)及重寫引擎對(duì)這些符號(hào)的解讀。 *:當(dāng)前字符匹配0次或n次。 +:當(dāng)前字符匹配1次或n次。 ?:當(dāng)前字符出現(xiàn)0次或1次。 ^:字符串的開始。 $:字符串的結(jié)尾。 .:任意符號(hào)(如作為通配符)。 \:“避開”后面的字符,如\.表示點(diǎn)不是一個(gè)通配符而是一個(gè)實(shí)際的字符。 ^:在[]括號(hào)內(nèi)表示非,例如,[^/]表示非斜杠。 在正則表達(dá)式中,輕易便會(huì)犯下錯(cuò)誤,一些常見的、導(dǎo)致無意子字符串匹配的錯(cuò)誤包括如下: ·在應(yīng)該使用.+的地方使用了.*(因?yàn)?/span>.*什么都不匹配)。 ·沒有使用反斜杠換碼一個(gè)你不想表達(dá)的特殊符號(hào),因?yàn)楫?dāng)你指定.代替\.時(shí),你確實(shí)指的是點(diǎn)這個(gè)符號(hào)而不是任意字符(因此,default.htm會(huì)匹配defaultthtm,而default\.htm會(huì)只匹配default.htm)。 ·在開頭或結(jié)尾通過隱含方式確定的前提下,省略^或$(因此,default\.htm會(huì)匹配mydefault.html,而^default\.htm$只匹配default.htm)。 ·使用“貪婪”表達(dá)式,匹配所有出現(xiàn)的次數(shù)而不是在第一次出現(xiàn)之后停止。 ·詮釋“貪婪”最簡單的方式是給出一個(gè)例子: 該表達(dá)式將重定向所有從http://www.yourdomain.com/blah/index.html向http://www.yourdomain.com/blah/的請(qǐng)求,這可能并不是其本意,但為什么會(huì)出現(xiàn)這種情況?因?yàn)?/span>.*會(huì)在/?看到斜線符號(hào)之前將其采集,謝天謝地,我們有一個(gè)簡單的解決方案。使用[^或.*?代替.*來進(jìn)行匹配,例如,使用^(.*?)/?代替^(.*)/?,或使用[^/]+/[^/]代替.*/.*。 因此,要改正上述規(guī)則,你可以使用以下表達(dá)式: 為什么不用下面這個(gè)呢?它比較有限,因?yàn)樗荒芷ヅ浒粋€(gè)目錄的網(wǎng)址,而包含多個(gè)子目錄的網(wǎng)址則不能匹配,如http://www.yourdomain.com/store/cheese/swiss/wheel/index.html。 你可能也想過,測(cè)試或調(diào)試應(yīng)是網(wǎng)址重寫中比較重要的部分,當(dāng)你進(jìn)行調(diào)試時(shí),RewriteLog和RewriteLogLevel指令便是你最好的伙伴!將RewriteLogLevel設(shè)置為4或以上值,然后查看重寫引擎在詮釋你的規(guī)則時(shí)會(huì)做什么。 順便說一下,在后面幾個(gè)例子中的[R=301]標(biāo)志——你可能也猜到了——是告訴重寫引擎進(jìn)行301重定向而不是標(biāo)準(zhǔn)的重寫。 還有另外一個(gè)與RewriteRule連用的指令,稱為RewriteCond。你可能會(huì)使用RewriteCond匹配搜索請(qǐng)求字符串中的內(nèi)容、域名或其他未出現(xiàn)在域名和網(wǎng)址問號(hào)之間的元素(這正是RewriteCond所關(guān)注的內(nèi)容)。 需要注意的是,RewriteRule和RewriteCond都不能訪問網(wǎng)址錨節(jié)點(diǎn)中的內(nèi)容——即#后面的內(nèi)容,因?yàn)樵摬糠謨?nèi)容本質(zhì)上是被瀏覽器所用的,是不會(huì)被作為請(qǐng)求的一部分發(fā)送到服務(wù)器的。下面的RewriteCond案例是在其允許執(zhí)行重寫規(guī)則之前,尋找一個(gè)正面匹配的主機(jī)名: 注意正則表達(dá)式開頭的感嘆號(hào),重寫引擎把它理解為非。 對(duì)于除了http://www.yourdomain.com之外的任何一個(gè)主機(jī)名來說,301重定向相當(dāng)于www子域名中的標(biāo)準(zhǔn)網(wǎng)址。[NC]標(biāo)志使重寫條件區(qū)分大小寫。你可能會(huì)問,保存搜索請(qǐng)求字符串的[QSA]標(biāo)志去哪兒了?重定向不需要它,它是隱含的。 如果你不希望搜索請(qǐng)求字符串留存在含有重定向的重寫規(guī)則中,那么可以在規(guī)則中的目標(biāo)網(wǎng)址末端添加一個(gè)問號(hào),類似于: 為什么不用^yourdomain\.com$?想一下:該表達(dá)式不匹配typo域名,如yourdoamin.com,DNS服務(wù)器和虛擬主機(jī)將被設(shè)置為響應(yīng)typo域名(假設(shè)錯(cuò)誤拼寫是一個(gè)你注冊(cè)和擁有的域名)。 在什么情況下,你會(huì)希望從重定向的網(wǎng)址中省略搜索請(qǐng)求字符串,如我們?cè)谏厦鎯蓚€(gè)例子中那樣呢?當(dāng)會(huì)話ID或追蹤參數(shù)(如source=banner_ad1)需要被放棄時(shí)。沒有必要在重定向之后保留追蹤參數(shù)(因?yàn)榘创a的原始網(wǎng)址在被訪問之后,會(huì)被記錄到訪問日志文件中),而且從規(guī)范化角度來看,你也沒必要那樣做。如果你希望從重定向的網(wǎng)址中刪除追蹤參數(shù),但同時(shí)又想保留搜索請(qǐng)求字符串中的其他參數(shù),你應(yīng)該怎么做呢?下面是針對(duì)靜態(tài)網(wǎng)址的做法: 而對(duì)于動(dòng)態(tài)網(wǎng)址:在重定向用戶之前,需要用cookie做一些奇妙的事情嗎?調(diào)用一個(gè)跟蹤用戶的腳本,然后301重定向該用戶至標(biāo)準(zhǔn)網(wǎng)址: 注意上述代碼中沒有[R=301]標(biāo)志,這是故意的,因?yàn)闆]有必要將該腳本展示給用戶,該腳本完成它的使命之后,使用重寫,讓它自己發(fā)送301重定向。 其他值得用重寫規(guī)則和[R=301]標(biāo)志修改的標(biāo)準(zhǔn)化問題包括:搜索引擎索引HTTPS網(wǎng)址下的在線目錄頁面時(shí)及網(wǎng)址漏掉一個(gè)本應(yīng)有的尾斜杠時(shí)。首先,HTTPS解決方案是: 需要注意的是,如果你的安全服務(wù)器與主服務(wù)器分離,那么你可以跳過RewriteCond行。 現(xiàn)在添加尾斜杠: 完成網(wǎng)址重寫工作,將動(dòng)態(tài)網(wǎng)址替換成靜態(tài)網(wǎng)址之后,你可能想逐步淘汰動(dòng)態(tài)網(wǎng)址,你可能會(huì)替代網(wǎng)站中所有出現(xiàn)的遺留網(wǎng)址,也可能會(huì)使用301重定向遺留的動(dòng)態(tài)網(wǎng)址至其靜態(tài)對(duì)應(yīng)頁面。這樣一來,所有指向廢棄網(wǎng)址的導(dǎo)入鏈接便不會(huì)再引導(dǎo)搜索爬蟲和人類用戶進(jìn)入正確的新網(wǎng)址——因此,確保新的網(wǎng)址是被索引、引用、鏈接和標(biāo)記的,而將原有網(wǎng)址從索引中刪除。通常來講,下面是你的做法: 不過,如果你不小心,便可能會(huì)陷入無限循環(huán)重定向的怪圈,避免該局面的一個(gè)應(yīng)急方案是在重寫的目標(biāo)網(wǎng)址中添加一個(gè)無意義的參數(shù),而且要確保這個(gè)無意義的參數(shù)不會(huì)在你進(jìn)行重定向之前出現(xiàn),具體是:需要注意的是,該案例使用了兩個(gè)堆在一起的RedirectCond行,在同一區(qū)塊中列出的所有重定向條件都是“ANDed”(并列)一起的,如果你希望條件是“Ored”,那么你需要使用[OR]標(biāo)志。 |