Yslow性能測試前端調(diào)優(yōu)23大規(guī)則(11)避免重定向

性能測試前端優(yōu)化

URL 重定向(Redirects)和敬,也稱為 URL 轉(zhuǎn)發(fā)咽袜,是一種當(dāng)實(shí)際資源胸完,如單個(gè)頁面傲醉、表單或者整個(gè) Web 應(yīng)用被遷移到新的 URL 下的時(shí)候呈础,保持(原有)鏈接可用的技術(shù)旋恼。HTTP 協(xié)議提供了一種特殊形式的響應(yīng)—— HTTP 重定向(HTTP redirects)來執(zhí)行此類操作未舟,該操作可以應(yīng)用于多種多樣的目標(biāo):網(wǎng)站維護(hù)期間的臨時(shí)跳轉(zhuǎn)祈噪,網(wǎng)站架構(gòu)改變后為了保持外部鏈接繼續(xù)可用的永久重定向辐棒,上傳文件時(shí)的表示進(jìn)度的頁面等等病曾。

在 HTTP 協(xié)議中,重定向操作由服務(wù)器通過發(fā)送特殊的響應(yīng)(即 redirects)而觸發(fā)漾根。HTTP 協(xié)議的重定向響應(yīng)的狀態(tài)碼為 3xx 泰涂。瀏覽器在接收到重定向響應(yīng)的時(shí)候,會(huì)采用該響應(yīng)提供的新的 URL 辐怕,并立即進(jìn)行加載逼蒙;大多數(shù)情況下,除了會(huì)有一小部分性能損失之外寄疏,重定向操作對(duì)于用戶來說是不可見的是牢。重定向的原理如圖所示。

關(guān)于重定向通常有以下幾種類型:

1) 301

如果返回的狀態(tài)碼為301陕截,表示被請(qǐng)求的資源已永久移動(dòng)(Moved Permanently)驳棱,永久移動(dòng)到新位置,任何對(duì)此資源的引用都應(yīng)該使用本響應(yīng)返回的若干個(gè)URI之一农曲。如果可能社搅,擁有鏈接編輯功能的客戶端應(yīng)當(dāng)自動(dòng)把請(qǐng)求的地址修改為從服務(wù)器反饋回來的地址驻债。正常這個(gè)響應(yīng)是可緩存的,除非額外指定形葬。新的永久性的URI應(yīng)當(dāng)在響應(yīng)的Location域中返回合呐,正常實(shí)體中應(yīng)當(dāng)包含指向新的URL的超鏈接及簡短說明,除非是HEAD類的請(qǐng)求笙以。

2) 302

如果返回狀態(tài)碼302淌实,表示要求客戶端臨時(shí)重寶向(Moved Temporarily)。由于是臨時(shí)重定向猖腕,客戶端應(yīng)當(dāng)繼續(xù)向原有地址發(fā)送以后的請(qǐng)求拆祈,并且只有在Cache-Control或Expires中指定的情況下,響應(yīng)才可以緩存倘感。注意:雖然RFC 1945和RFC 2068規(guī)范不允許客戶端在重定向時(shí)改變請(qǐng)求的方法缘屹,但是很多現(xiàn)存的瀏覽器將302響應(yīng)視作為303響應(yīng),并且使用GET方式訪問在Location中規(guī)定的URI侠仇,而無視原先請(qǐng)求的方法。因此狀態(tài)碼303和307被添加了進(jìn)來犁珠,用以明確服務(wù)器期待客戶端進(jìn)行何種反應(yīng)逻炊。

3) 303

如果返回狀態(tài)碼303,表示對(duì)應(yīng)當(dāng)前請(qǐng)求的響應(yīng)可以在另一個(gè)URI上被找到犁享,客戶端假定服務(wù)器已經(jīng)收到數(shù)據(jù)余素,并且應(yīng)該使用單獨(dú)的GET消息發(fā)出重定向。這個(gè)方法的存在主要是為了允許由腳本激活的POST請(qǐng)求輸出重定向到一個(gè)新的資源炊昆。這個(gè)新的URI不是原始資源的替代引用桨吊。同時(shí),303響應(yīng)禁止被緩存凤巨。當(dāng)然视乐,第二個(gè)請(qǐng)求(重定向)可能被緩存。新的URI應(yīng)當(dāng)在響應(yīng)的Location域中返回敢茁。除非這是一個(gè)HEAD請(qǐng)求佑淀,否則響應(yīng)的實(shí)體中應(yīng)當(dāng)包含指向新的URI的超鏈接及簡短說明。注意:許多HTTP/1.1版以前的瀏覽器不能正確理解303狀態(tài)彰檬。如果需要考慮與這些瀏覽器之間的互動(dòng)伸刃,302狀態(tài)碼應(yīng)該可以勝任,因?yàn)榇蠖鄶?shù)的瀏覽器處理302響應(yīng)時(shí)的方式恰恰就是上述規(guī)范要求客戶端處理303響應(yīng)時(shí)應(yīng)當(dāng)做的逢倍。

4) 307

307狀態(tài)碼也是表示臨時(shí)從不同的URI響應(yīng)請(qǐng)求捧颅,請(qǐng)求應(yīng)該與另一個(gè)URI重復(fù),這個(gè)與302類似较雕,但307不允許更好請(qǐng)求方法碉哑,但后續(xù)的請(qǐng)求應(yīng)仍使用原始的URI。 例如,應(yīng)該使用另一個(gè)POST請(qǐng)求來重復(fù)POST請(qǐng)求谭梗。

5) 304

如果返回狀態(tài)碼304忘晤,表示客戶端在請(qǐng)求一個(gè)文件的時(shí)候,發(fā)現(xiàn)自己緩存的文件有Last Modified激捏,此時(shí)請(qǐng)求中會(huì)包含If Modified Since设塔,這個(gè)時(shí)間就是緩存文件的Last Modified。因此远舅,如果請(qǐng)求中包含If Modified Since闰蛔,就說明已經(jīng)有緩存在客戶端。服務(wù)端只要判斷這個(gè)時(shí)間和當(dāng)前請(qǐng)求的文件的修改時(shí)間就可以確定是返回304還是200图柏。

對(duì)于靜態(tài)文件(如:CSS序六、圖片等),服務(wù)器會(huì)自動(dòng)完成Last Modified和If Modified Since的比較完成緩存或者更新蚤吹。但是對(duì)于動(dòng)態(tài)頁面例诀,就是動(dòng)態(tài)產(chǎn)生的頁面,往往沒有包含Last Modified信息裁着,瀏覽器繁涂、網(wǎng)關(guān)等都不會(huì)做緩存,也就是在每次請(qǐng)求的時(shí)候都完成一個(gè)200的請(qǐng)求二驰。因此扔罪,對(duì)于動(dòng)態(tài)頁面做緩存加速,首先要在Response的HTTP Header中增加Last Modified定義桶雀,其次根據(jù)Request中的If Modified Since和被請(qǐng)求內(nèi)容的更新時(shí)間來返回200或者304矿酵。雖然在返回304的時(shí)候已經(jīng)做了一次數(shù)據(jù)庫查詢,但是可以避免接下來更多的數(shù)據(jù)庫查詢矗积,并且沒有返回頁面內(nèi)容而只是一個(gè)HTTP Header全肮,從而大大的降低帶寬的消耗,對(duì)于用戶的感覺也是提高棘捣。

6) 300

如果返回狀態(tài)碼304倔矾,表示被請(qǐng)求的資源有一系列可供選擇的回饋信息,每個(gè)都有自己特定的地址和瀏覽器驅(qū)動(dòng)的商議信息柱锹。用戶或?yàn)g覽器能夠自行選擇一個(gè)首選的地址進(jìn)行重定向哪自。除非這是一個(gè)HEAD請(qǐng)求,否則該響應(yīng)應(yīng)當(dāng)包括一個(gè)資源特性及地址的列表的實(shí)體禁熏,以便用戶或?yàn)g覽器從中選擇最合適的重定向地址壤巷。這個(gè)實(shí)體的格式由Content-Type定義的格式所決定。瀏覽器可能根據(jù)響應(yīng)的格式以及瀏覽器自身能力瞧毙,自動(dòng)作出最合適的選擇胧华。當(dāng)然寄症,RFC 2616規(guī)范并沒有規(guī)定這樣的自動(dòng)選擇該如何進(jìn)行。如果服務(wù)器本身已經(jīng)有了首選的回饋選擇矩动,那么在Location中應(yīng)當(dāng)指明這個(gè)回饋的URI有巧;瀏覽器可能會(huì)將這個(gè)Location值作為自動(dòng)重定向的地址。此外悲没,除非額外指定篮迎,否則這個(gè)響應(yīng)也是可緩存的。

不同類型的重定向映射可以劃分為三個(gè)類別:永久重定向示姿、臨時(shí)重定向和特殊重定向甜橱。上面的重定向類型中301屬于永久重定向類型,302栈戳、303和307屬于臨時(shí)重定向類型岂傲,300和304是特殊重定向類型。

重定向是如何損傷性能的呢子檀?如下圖13-10所示是一個(gè)重定的實(shí)例镊掖,第一個(gè)HTTP請(qǐng)求就是重定向,在重定向頁面加載完成后才會(huì)下載其它的組件褂痰,直到HTML文檔整個(gè)下載完成后堰乔,用戶才會(huì)在界面看到顯示的內(nèi)容。

如果要檢測頁面是否有重定向脐恩,可以使用重定向映射工具檢查頁面上的重定向(它會(huì)檢測并顯示301和302重定向)。檢查所有網(wǎng)頁重定向并查看網(wǎng)站侦讨,考慮如何更改網(wǎng)頁驶冒,衡量影響頁面性能變慢的可能性。

關(guān)于如何避免重定向或者將重定向的影響降低到最小化通常有以下幾種方法:

a) 刪除并非絕對(duì)必要的重定向

刪除并非絕對(duì)必要的重定向韵卤,再通過其它的方式進(jìn)行重定向骗污。永遠(yuǎn)不要鏈接你已經(jīng)知道的重定向的頁面,永遠(yuǎn)不要訪問經(jīng)過多次重定向才能訪問的資源沈条。

b) 結(jié)尾的斜線

通常需忿,帶有結(jié)尾帶有斜線的URL表示目錄,而沒有帶斜線的URL表示文件蜡歹。

http://http://example.com/foo/表示目錄屋厘。

http://http://example.com/foo表示文件。

即使有區(qū)別月而,但很多網(wǎng)站并不區(qū)分這兩者的不同汗洒,然后搜索引擎確實(shí)會(huì)將這兩種情況視為不同的實(shí)體。用戶發(fā)現(xiàn)這兩種URL的方式可能導(dǎo)致內(nèi)容混亂父款。對(duì)于用戶定向到相同內(nèi)容的URL溢谤,必須進(jìn)行某種類型的重定向瞻凤,要確定從哪 個(gè)URL重定向到哪個(gè)URL,并檢查哪個(gè)URL返回的HTTP響應(yīng)代碼為200世杀,哪個(gè)URL 返回的HTTP響應(yīng)碼為30X阀参。

通常,您不希望篡改此類重定向瞻坝,但在網(wǎng)頁上配置鏈接時(shí)蛛壳,您將需要知道哪個(gè)站點(diǎn)是主站點(diǎn),哪個(gè)站點(diǎn)導(dǎo)致重定向湿镀。通過直接鏈接到站點(diǎn)炕吸,您可以減少在網(wǎng)頁上使用重定向。

c) 重定向的不僅僅是HTML

在加載頁面時(shí)其實(shí)不僅僅是HTML文檔勉痴,還有很多其它的組件赫模。那么如果HTML中沒有重定向就表示這整個(gè)頁面都沒有重定向嗎?那不一定HTML中沒有重定向蒸矛,但CSS文件瀑罗、圖像、外部JavaScript文件也可能有重定向雏掠,所以需要確保頁面在調(diào)用時(shí)加載了哪些資源斩祭,可以使用頁面的相關(guān)工具來測試。確保不創(chuàng)建重定向的方式調(diào)用所有資源乡话。

d) 檢查舊的重定向

檢查舊的重定向的使用情況摧玫,我們可以通過檢查.htaccess文件或其他服務(wù)器配置文件來檢查舊的重定向,這些舊的重定向可能是以前某個(gè)頁面或某個(gè)部件添加的绑青,需要檢查這些舊的重定向還在使用诬像,有的基礎(chǔ)可能不存在的,但這個(gè)并不是很容易去發(fā)現(xiàn)闸婴。

e) 刪除不需要的重定向

刪除不需要的重定向坏挠,通常使用以下步驟:

第一步:查找重定向。

第二步:了解重定向存在的原因邪乍。

第三步:確定它是如何影響或受其他重定向影響的降狠。

第四步:如果不需要,則刪除這個(gè)重定向庇楞。

第五步:如果它影響或受其它重定向影響榜配,那么需要對(duì)這個(gè)重定向進(jìn)行更新。

第六步:如果站點(diǎn)是安全的吕晌,那么可以考慮使用HSTS刪除SSL重定向芥牌。

f) 清理重定向鏈

除了需要?jiǎng)h除重定向之外,還需要清理重定向鏈聂使。將所有站點(diǎn)重定向從非www版本到www版本壁拉,然后再重定向到https版本谬俄。例如鍵入“test.com”的用戶重定向到“www.test.com”然后再重定向到“https:// www.test.com”,這種情況經(jīng)常有發(fā)生弃理。解決的方案是確保舊的全站點(diǎn)重定向不會(huì)從非www到www溃论,而是從非www到https://www

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痘昌,一起剝皮案震驚了整個(gè)濱河市钥勋,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌辆苔,老刑警劉巖算灸,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異驻啤,居然都是意外死亡菲驴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門骑冗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赊瞬,“玉大人,你說我怎么就攤上這事贼涩∏山В” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵遥倦,是天一觀的道長谤绳。 經(jīng)常有香客問我,道長袒哥,這世上最難降的妖魔是什么缩筛? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮统诺,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疑俭。我一直安慰自己粮呢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布钞艇。 她就那樣靜靜地躺著啄寡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪哩照。 梳的紋絲不亂的頭發(fā)上挺物,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音飘弧,去河邊找鬼识藤。 笑死砚著,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的痴昧。 我是一名探鬼主播稽穆,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼赶撰!你這毒婦竟也來了舌镶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤豪娜,失蹤者是張志新(化名)和其女友劉穎餐胀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘤载,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡否灾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了惕虑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片坟冲。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖溃蔫,靈堂內(nèi)的尸體忽然破棺而出健提,到底是詐尸還是另有隱情,我是刑警寧澤伟叛,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布私痹,位于F島的核電站,受9級(jí)特大地震影響统刮,放射性物質(zhì)發(fā)生泄漏紊遵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一侥蒙、第九天 我趴在偏房一處隱蔽的房頂上張望暗膜。 院中可真熱鬧,春花似錦鞭衩、人聲如沸学搜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瑞佩。三九已至,卻和暖如春坯台,著一層夾襖步出監(jiān)牢的瞬間炬丸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工蜒蕾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留稠炬,地道東北人焕阿。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像酸纲,于是被迫代替她去往敵國和親捣鲸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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