高峰 高級(jí)前端進(jìn)階 1周前
作為前端開(kāi)發(fā),,大家對(duì)重定向一定不陌生,,不就是永久重定向和臨時(shí)重定向嘛,誰(shuí)還不知道呢 ??,。 那么大家是否知道永久重定向和臨時(shí)重定向的區(qū)別呢,?如果不小心設(shè)置了永久重定向該如何取消呢?如何優(yōu)雅地使用重定向呢,?接下來(lái)就讓我們來(lái)一探究竟吧,。 URL 重定向,能夠?qū)⒍鄠€(gè) URL 指向同一個(gè)頁(yè)面,,這一技術(shù)有著多種用途,。在 HTTP 中有一個(gè)專門的響應(yīng),叫做 HTTP 重定向,,也就是所有 3 開(kāi)頭的響應(yīng)(這個(gè)相信大家都背過(guò)),。 除了 HTTP 重定向,還有其他方式能夠進(jìn)行重定向,,本文也會(huì)介紹,。 內(nèi)容較長(zhǎng),我們先看一下本文的內(nèi)容架構(gòu):
1. HTTP 重定向在 HTTP 中,,服務(wù)器可以通過(guò)返回一個(gè)重定向響應(yīng)來(lái)進(jìn)行重定向,。這個(gè)重定向響應(yīng)有一個(gè)以 3 開(kāi)頭的狀態(tài)碼 ,并且有一個(gè) 瀏覽器接收到這個(gè)重定向之后,,會(huì)立即加載 重定向過(guò)程如下圖所示: 1.1 重定向狀態(tài)碼及含義前面提到,重定向相關(guān)的狀態(tài)碼都是以 3 開(kāi)頭的,,主要有以下 9 種狀態(tài)碼:
總共有 9 個(gè)與重定向相關(guān)的狀態(tài)碼,其中 301/302/304 都比較常見(jiàn),,305/306 使用較少,,本文不做介紹(其實(shí)我也不懂,也沒(méi)用過(guò) ??),。這 9 種狀態(tài)碼可以分成 3 大類,,分別是:永久重定向、臨時(shí)重定向以及特殊重定向,。 1.2 永久重定向類301 和 308 都屬于永久重定向,。永久重定向意味著原始 URL 不再可用,替換成了一個(gè)新的內(nèi)容,。所以搜索引擎,、聚合內(nèi)容閱讀器以及其他爬蟲識(shí)別這兩個(gè)狀態(tài)碼時(shí),會(huì)更新舊 URL 的資源,。 劃重點(diǎn):這個(gè)就是永久重定向和臨時(shí)重定向的區(qū)別,。
1.3 臨時(shí)重定向類302/303/307 都屬于臨時(shí)重定向。有時(shí),,當(dāng)原有資源因?yàn)橐恍┎豢深A(yù)測(cè)的原因而臨時(shí)無(wú)法訪問(wèn)時(shí),,可以通過(guò)臨時(shí)重定向的方式將請(qǐng)求轉(zhuǎn)移到另一個(gè)地方。搜索引擎和爬蟲不應(yīng)該記住這個(gè)臨時(shí)的連接,。 此外,,臨時(shí)重定向還可以用來(lái)在創(chuàng)建、修改和刪除時(shí)展示臨時(shí)的進(jìn)度頁(yè),,這里通常使用 303,。
1.4 特殊重定向類除此之外,,300/304/305/306 可以歸屬到特殊重定向類。這里重點(diǎn)說(shuō)一下 304,,304 是 HTTP 緩存中的一個(gè)重要內(nèi)容,,表示資源未修改,相當(dāng)于將資源重定向到本地緩存,。 關(guān)于 HTTP 緩存的詳細(xì)內(nèi)容,,可以查看這篇文章:瀏覽器緩存策略之掃盲篇 2. 其他類型的重定向方式HTTP 是最簡(jiǎn)易使用的重定向方式,但是有些時(shí)候我們并不能夠操作服務(wù)端,。好在,,除了 HTTP 重定向外,還有兩種方式:通過(guò) 2.1 HTML 重定向如下代碼所示,,我們可以通過(guò)在
2.2 JavaScript 重定向這個(gè)大家都用過(guò),,使用
上述所介紹的三種重定向方式中,,按照優(yōu)先級(jí)順序如下:HTTP > HTML > JavaScript,。這和我們所知道的文件的請(qǐng)求處理順序一致,不過(guò)多解釋,。 3. 重定向的使用場(chǎng)景不同類別的重定向有不同的使用場(chǎng)景,,大致可以分為以下幾類:
4. 如何優(yōu)雅地使用 301有些時(shí)候,我們對(duì)于永久重定向的理解并不夠,,在倉(cāng)促之中使用了 301 永久重定向時(shí)就會(huì)遇到這樣的一個(gè)坑,,那就是不管我們?cè)趺粗匦略O(shè)置,(有些)瀏覽器都仍然使用最開(kāi)始設(shè)置的 301 永久重定向,。 這時(shí),,我們的用戶甚至是我們自己的狀態(tài)大概是這樣的:
往往在錯(cuò)誤配置了 301 之后,,我們需要面臨的問(wèn)題就是取消最初的 301? 然而,,很不幸的是,,似乎并沒(méi)有好的辦法能夠快速的清除用戶端已經(jīng)使用過(guò)的錯(cuò)誤 301 重定向。 如果用戶足夠聰明的話,,還可以讓用戶按照我們的說(shuō)明進(jìn)行處理,。 所以最好的做法是能夠搞懂并優(yōu)雅地使用 301,這樣才能避免這一問(wèn)題,。 下面,,我們先來(lái)復(fù)現(xiàn)問(wèn)題,然后再解釋問(wèn)題,。 4.1 準(zhǔn)備:使用 Nginx 配置 301 永久重定向在 Nginx 中,,我們可以創(chuàng)建一個(gè) server 塊來(lái)指定所有內(nèi)容都進(jìn)行重定向:
也可以通過(guò)
比如我準(zhǔn)備了下面這樣一個(gè)
現(xiàn)在我們假設(shè)不小心將初始頁(yè)面永久重定向到了 301 頁(yè)面,,現(xiàn)在想取消這一行為,,臨時(shí)重定向到 302 頁(yè)面。
至此,,我們會(huì)發(fā)現(xiàn),301 之后,,瀏覽器會(huì)記住第一次的 301,,忽略之后的其他重定向。那這樣到底是為什么呢,? 4.2 瀏覽器會(huì)緩存“301”永久重定向這所以會(huì)這樣,,這是因?yàn)闉g覽器會(huì)緩存“301”永久重定向。 經(jīng)不完全測(cè)試,,各瀏覽器的緩存情況如下:
可以看出除了 Safari 重啟/修改時(shí)間之后,,能夠使用新的重定向,,Chrome/Firefox 都會(huì)無(wú)限期的緩存 301 重定向。 在 FireFox 中我們也可以簡(jiǎn)單驗(yàn)證下,,輸入 瀏覽器為什么會(huì)緩存 301 重定向呢,?其實(shí),,HTTP RFC 中規(guī)定 301 是一個(gè)可緩存的響應(yīng),所以瀏覽器會(huì)根據(jù)響應(yīng)中的 HTTP 緩存頭進(jìn)行緩存,。如果我們沒(méi)有提供明確的緩存頭,,瀏覽器就會(huì)默認(rèn)永久緩存 301 響應(yīng),因?yàn)?301 是永久重定向的意思,。 這里筆者偷懶沒(méi)有測(cè)試 IE,,但是鑒于有瀏覽器(Chrome/Firefox)會(huì)無(wú)限期緩存 301 重定向,那么我們就需要試著去解決這一問(wèn)題 —— 如何清除 301 重定向緩存,。 4.3 如何清除 301 重定向緩存
既然是緩存行為,那么我們就可以通過(guò)常規(guī)的緩存清理方式來(lái)處理,,包括但不限于以下幾種方式:
這里大家可以自行嘗試以下,,如果不行的話,記得多試 1-2 遍就行(至于為什么要多試,,我也很奇怪,有的時(shí)候就是清兩遍就好了),。 如果大家驗(yàn)證了上面的幾種清除方式,,就會(huì)發(fā)現(xiàn)確實(shí)是行之有效的。那為什么我會(huì)說(shuō)沒(méi)有很好地方式去清除呢,? 大家細(xì)想,,當(dāng)我們將錯(cuò)誤的 301 請(qǐng)求發(fā)布到線上環(huán)境了,并且影響了數(shù)以萬(wàn)計(jì)的用戶時(shí),,我們要怎么通知并教會(huì)用戶按照我們的方式去清除緩存呢,?當(dāng)然,清除歷史記錄算是最便捷的方式了,,如果真的不行遇到了這種情況,,那就通知用戶這么清除吧 ??。 4.4 優(yōu)雅地使用 301為了避免上面需要清除的情況,,最好的做法是優(yōu)雅地使用 301,。 前面解釋瀏覽器為什么會(huì)緩存 301 重定向時(shí),,已經(jīng)隱晦地提到了這一方法。 既然瀏覽器認(rèn)為這是一個(gè)可以緩存的資源,,并且我們可以通過(guò)緩存頭來(lái)控制,。那么在使用 301 時(shí),我們將其設(shè)置為不緩存就可以了,。比如設(shè)置
這樣設(shè)置之后,如果我們?cè)賹⒅囟ㄏ蚯袚Q成 302,,會(huì)發(fā)現(xiàn)瀏覽器不會(huì)緩存 301 了,,新的重定向可以立即生效了。 總結(jié)以上就是重定向相關(guān)的內(nèi)容,。301 使用需謹(jǐn)慎,,一定要設(shè)緩存頭 ??。 The End |
|
來(lái)自: 風(fēng)聲之家 > 《電腦》