《高性能網(wǎng)站建設(shè)指南》閱讀筆記_規(guī)則11-?避免重定向
發(fā)布時(shí)間:2013-11-22 瀏覽:437打印字號(hào):大中小
重定向就是從一個(gè)URL到另一個(gè)URL,它會(huì)使你的頁(yè)面變慢。重定向有很多種,“301 Moved Permancenty”和“302 Moved Temporarily”是最常用的兩種。
301: 用戶請(qǐng)求的文檔在其他的地方,新的URL在Location中給出,瀏覽器自動(dòng)訪問(wèn)新的URL。,并且是永久性轉(zhuǎn)移。
302:搜索引擎返回302錯(cuò)誤表示被請(qǐng)求的資源暫時(shí)轉(zhuǎn)移(Moved temporatily),然后會(huì)給出一個(gè)轉(zhuǎn)移后的URL,而瀏覽器在處理服務(wù)器返回的302錯(cuò)誤時(shí),原則上會(huì)重新建立一個(gè)TCP連接,然后再取重定向后的URL的頁(yè)面;但是如果頁(yè)面存在于緩存中,則不重新獲取。(存在濫用情況)
擴(kuò)展: 301重定向是一種非常重要的自動(dòng)轉(zhuǎn)向技術(shù)。在更換域名的時(shí)候起著不可替代的作用,他不僅可以實(shí)現(xiàn)網(wǎng)頁(yè)的批量指定轉(zhuǎn)跳,還可促進(jìn)搜索引擎優(yōu)化效果。不同于302,從搜索引擎優(yōu)化角度出發(fā),301重定向是網(wǎng)址重定向最為可行的一種辦法。當(dāng)網(wǎng)站的域名發(fā)生變更后,搜索引擎只對(duì)新網(wǎng)址進(jìn)行索引,同時(shí)又會(huì)把舊地址下原有的外部鏈接如數(shù)轉(zhuǎn)移到新地址下,從而不會(huì)讓網(wǎng)站的排名因?yàn)榫W(wǎng)址變更而受到絲毫影響。當(dāng)然各個(gè)搜索引擎對(duì)301的處理方式是不一樣的。
302的三大危害:
一:黑帽SEO濫用
302重定向代表著暫時(shí)性轉(zhuǎn)移,程序員設(shè)計(jì)一段代碼,使點(diǎn)擊訪問(wèn)的目標(biāo)網(wǎng)址出現(xiàn)在黑帽SEO所要優(yōu)化的網(wǎng)址之內(nèi),形成一段由“優(yōu)化網(wǎng)址+目標(biāo)網(wǎng)址”組合而成的302網(wǎng)址,藉此接獲用戶點(diǎn)擊,騙取網(wǎng)頁(yè)權(quán)重。目前,302重定向已經(jīng)被視為垃圾信息,遭到各大搜索引擎的打擊。
二:消耗優(yōu)化網(wǎng)址資源
302重定向的排列組合,有些站長(zhǎng)使用302重定向并不是為了欺騙搜索引擎,僅僅是為了防止自己網(wǎng)站的通過(guò)外部鏈接流向其他權(quán)重。這種302重定向很容易遭到惡意訪問(wèn),訪問(wèn)者將“優(yōu)化網(wǎng)址”與任意網(wǎng)址甚至是一段字符串組合,濫用網(wǎng)站本身的302重定向功能消耗服務(wù)器資源,返回大量的302、404代碼,影響網(wǎng)站的穩(wěn)定性。
三:跨站腳本攻擊
跨站腳本攻擊漏洞,根據(jù)網(wǎng)站安全監(jiān)測(cè)工具的報(bào)告,這種302重定向?qū)嶋H上是一種跨站腳本攻擊漏洞,惡意用戶可以使用該漏洞來(lái)盜取用戶賬戶信息、模擬其他用戶身份登錄,更甚至可以修改網(wǎng)頁(yè)呈現(xiàn)給其他用戶的內(nèi)容。極大的妨害了網(wǎng)絡(luò)安全和用戶體驗(yàn)。
除了301到302,還有其他方法實(shí)現(xiàn)重定向。HTML文檔的頭中包含的meta refresh標(biāo)簽可以在content屬性所指定的秒數(shù)之后重定向到url屬性的地址。就是的document.location可以設(shè)置。但是如果必須采用重定向,作者推薦使用標(biāo)準(zhǔn)的3**HTTP狀態(tài)碼,這主要是為了確保后退按鈕可以正常工作。
重定向是如何損傷性能的
如果第一個(gè)請(qǐng)求就是重定向,在重定向完畢并且HTML文檔下載完畢之前,是沒(méi)有任何東西顯示給用戶的,就像js和css引起的白屏一樣。在用戶和HTML之間插入的重定向延遲了延遲了頁(yè)面中的所有東西。
為什么使用重定向
用處:網(wǎng)站重新設(shè)計(jì),跟蹤流量,記錄廣告點(diǎn)擊,建立已于記憶的url。
下面是一些使用重定向的典型解決方案:
1.缺少結(jié)尾的斜線:我們?cè)谡?qǐng)求http://www.taoche.com/buycar時(shí)會(huì)引起重定向url變?yōu)?span style="color:#0000FF;font-family:Calibri;">http://www.taoche.com/buycar/ (多了一個(gè)杠),這是一種最為浪費(fèi),發(fā)生也最為頻繁的重定向。原因是:它允許自動(dòng)索引(autoindexing,自動(dòng)轉(zhuǎn)到默認(rèn)的index.html上)并且能夠獲得與當(dāng)前目錄相關(guān)的URL(如logo.gif)然而,很多流行的web頁(yè)面并不依賴于自動(dòng)索引,而是依賴特定的URL和處理器。另外,URL通常也與根目錄相關(guān)而不是和當(dāng)前目錄相關(guān)。
注意當(dāng)主機(jī)名后缺少皆為斜線時(shí)是不會(huì)發(fā)生重定向的,例如http://www.taoche.com不會(huì)產(chǎn)生重定向,但是也會(huì)加上斜杠http://www.taoche.com/。原因是,瀏覽區(qū)在進(jìn)行GET請(qǐng)求時(shí)必須指定一些路徑,如果沒(méi)有路徑,就會(huì)簡(jiǎn)單的使用文檔根(/)。
2.連接網(wǎng)站:當(dāng)我們改變網(wǎng)站后端邏輯的時(shí)候,很可能所需的url也變了,這時(shí)候就需要將用戶從舊的url轉(zhuǎn)移到新的url,這個(gè)時(shí)候我們往往使用最多的也是重定向。我們應(yīng)該盡量去避免。如果整合兩個(gè)后端可以避免,但是需要更多的開(kāi)發(fā)工作。
3.跟蹤站內(nèi)流量:使用Referer日志,referrer網(wǎng)站來(lái)路;訪問(wèn)者進(jìn)入網(wǎng)站任何途徑。HTTP Referer是header的一部分,當(dāng)瀏覽器向web服務(wù)器發(fā)出請(qǐng)求的時(shí)候,一般會(huì)帶上Referer,告訴服務(wù)器用戶從那個(gè)頁(yè)面連接過(guò)來(lái)的,服務(wù)器藉此可以獲得一些信息用于處理。
4.跟蹤出站流量:跟蹤出站流量的時(shí)候不能使用使用referrer。我們打開(kāi)百度,搜索一個(gè)關(guān)鍵詞,連到其他網(wǎng)站,發(fā)現(xiàn)就會(huì)有一次重定向。但是重定向是耗費(fèi)性能的,所以我們看雅虎搜索http://www.yahoo.cn/,相同的操作并沒(méi)有重定向,雅虎使用的是信標(biāo),信標(biāo)(beacon):
可以在HTTP請(qǐng)求的URL中包含跟蹤信息。跟蹤信息可以從信標(biāo)web服務(wù)器的訪問(wèn)日志中提取出來(lái)。信標(biāo)響應(yīng)通常是一個(gè)1px*1px的透明圖片。書(shū)中還提到一個(gè)更為優(yōu)秀的204響應(yīng),因?yàn)樗?,從?lái)不會(huì)被緩存,而且絕不會(huì)改變?yōu)g覽器的狀態(tài)。但是我沒(méi)有查到相關(guān)的資料。
在雅虎搜索中,目標(biāo)是無(wú)論任何用戶單擊搜索結(jié)果連接時(shí)都要發(fā)送一個(gè)信標(biāo),在通過(guò)為這個(gè)連接提供的onclick處理器來(lái)完成。
注意,發(fā)送信標(biāo)和頁(yè)面自身卸載之間存在竟態(tài)情形,圖片信標(biāo)的onload處理器可以確保在卸載文檔之前信標(biāo)傳送完畢。
代碼實(shí)例:
Performance - Wikipedia="" 這樣的寫(xiě)法可能會(huì)和使用重定向一樣慢,因?yàn)閮煞N技巧都必須一個(gè)額外的HTTP請(qǐng)求。穩(wěn)重還提到一種XMLHttpRequest來(lái)發(fā)送信標(biāo),非常的復(fù)雜。說(shuō)到這里,可能會(huì)覺(jué)得信標(biāo)無(wú)用,但是對(duì)于有target=”_bank”屬性的連接而言,信標(biāo)能很好的工作,因?yàn)檫@種情下不會(huì)出現(xiàn)竟態(tài)情形,簡(jiǎn)單的信標(biāo)就能很好的工作,彈出新的頁(yè)面或者彈出式廣告不回卸載前文檔,圖片信標(biāo)的請(qǐng)求能夠順利完成而不會(huì)被中斷,雅虎搜索就是這個(gè)道理。
5.美化url:有的時(shí)候某個(gè)url很復(fù)雜,不利用用戶去輸入,我們就提供一個(gè)友好的url來(lái)給用戶,這個(gè)時(shí)候也會(huì)發(fā)生重定向。我們也是用了url的重寫(xiě),使用的是ISAPI_REWRITE,URL重寫(xiě)組件。


