用proxy_intercept_errors和recursive_error_pages代理多次302
302是HTTP協議中的一個經常被使用狀態碼,是多種重定向方式的一種,其語義經常被解釋為“Moved Temporarily”。這里順帶提一下,現實中用到的302多為誤用(與303,307混用),在HTTP/1.1中,它的語義為“Found”.
302有時候很明顯,有時候又比較隱蔽。最簡單的情況,是當我們在瀏覽器中輸入一個網址A,然后瀏覽器地址欄會自動跳到B,進而打開一個網頁,這種情況就很可能是302。
比較隱蔽的情況經常發生在嵌入到網頁的播放器中。例如,當你打開一個優酷視頻播放頁面時,抓包觀察一下就會經常發現302的影子。但由于這些url并不是直接在瀏覽器中打開的,所以在瀏覽器的地址欄看不到變化,當然,如果將這些具體的url特意挑出來復制到瀏覽器地址欄里,還是可以觀察到的。
上一段提到了優酷。其實現在多數在線視頻網站都會用到302,原因很簡單,視頻網站流量一般較大,都會用到CDN,區別只在于是用自建CDN還是商業CDN。而由于302的重定向語義(再重復一遍,302的語義廣泛的被誤用,在使用302的時候,我們很可能應該使用303或307,但后面都不再糾結這一點),可以與CDN中的調度很好的結合起來。
我們來看一個例子,打開一個網易視頻播放頁面,抓一下包,找到302狀態的那個url。例如:
http://flv.bn.netease.com/tvmrepo/2014/8/5/P/EA3I1J05P/SD/EA3I1J05P-mobile.mp4
我們把它復制到瀏覽器地址欄中,會發現地址欄迅速的變為了另外一個url,這個Url是不定的,有可能為:
http://14.18.140.83/f6c00af500000000-1408987545-236096587/data6/flv.bn.netease.com/tvmrepo/2014/8/5/P/EA3I1J05P/SD/EA3I1J05P-mobile.mp4
用curl工具會更清楚的看到整個過程:
curl -I "http://flv.bn.netease.com/tvmrepo/2014/8/5/P/EA3I1J05P/SD/EA3I1J05P-mobile.mp4" -LHTTP/1.1 302 Moved Temporarily Server: nginx Date: Mon, 25 Aug 2014 14:49:43 GMT Content-Type: text/html Content-Length: 154 Connection: keep-alive NG: CCN-SW-1-5L2 X-Mod-Name: GSLB/3.1.0 Location: http://119.134.254.9/flv.bn.netease.com/tvmrepo/2014/8/5/P/EA3I1J05P/SD/EA3I1J05P-mobile.mp4 HTTP/1.1 302 Moved Temporarily Server: nginx Date: Mon, 25 Aug 2014 14:49:41 GMT Content-Type: text/html Content-Length: 154 Connection: keep-alive X-Mod-Name: Mvod-Server/4.3.3 Location: http://119.134.254.7/cc89fdac00000000-1408983581-2095617481/data4/flv.bn.netease.com/tvmrepo/2014/8/5/P/EA3I1J05P/SD/EA3I1J05P-mobile.mp4 NG: CHN-SW-1-3Y1 HTTP/1.1 200 OK Server: nginx Date: Mon, 25 Aug 2014 14:49:41 GMT Content-Type: video/mp4 Content-Length: 3706468 Last-Modified: Mon, 25 Aug 2014 00:23:50 GMT Connection: keep-alive Cache-Control: no-cache ETag: "53fa8216-388e64" NG: CHN-SW-1-3g6 X-Mod-Name: Mvod-Server/4.3.3 Accept-Ranges: bytes
新聞熱點
疑難解答