HTTP重定向帶來(lái)的三次坑
時(shí)間:2023-02-09 13:09:01 | 來(lái)源:建站知識(shí)
時(shí)間:2023-02-09 13:09:01 來(lái)源:建站知識(shí)
老司機(jī)啊!恥辱啊!被坑一次也就算了,那時(shí)候還年輕。。這三次就很蛋疼了。。。我們來(lái)看三次被坑的經(jīng)歷。都和HTTP重定向有關(guān)
第一次的場(chǎng)景:
線下測(cè)試一切正常,上線后功能失效,提不上去??刂婆_(tái)顯示的是 從https發(fā)起了http請(qǐng)求。
按照常理分析,俺們的ajax不會(huì)直接跨度那么大。。。仔細(xì)看了一下里面出現(xiàn)了一個(gè)重定向。。。算是粗心造成的:對(duì)一些設(shè)置時(shí)寫了斜杠/ 的地址,但請(qǐng)求時(shí)不加這個(gè)斜杠,Django默認(rèn)會(huì)使用重定向 放到帶斜杠的/的地址上。而Django在默認(rèn)不配置的時(shí)候,這個(gè)重定向的location會(huì)放在http協(xié)議上(因?yàn)閔ttps的請(qǐng)求在nginx那層就被剝開了,往后面的upstream轉(zhuǎn)的時(shí)候已經(jīng)變成了http)
第二次的場(chǎng)景:
內(nèi)部服務(wù)間HTTP 調(diào)用接口,發(fā)現(xiàn)發(fā)出去的時(shí)候請(qǐng)求體還各種正常,但接收方收到的時(shí)候請(qǐng)求體全沒(méi)了。。。
第三次的場(chǎng)景:
使用SSO進(jìn)行登錄,恰逢域名遷移(且沒(méi)有收到通知,淡淡的憂傷,這就是沒(méi)有存在感),登陸完進(jìn)行回調(diào)的時(shí)候,原域名使用301重定向,把POST回調(diào)請(qǐng)求重定向了。結(jié)果導(dǎo)致使用了GET方法訪問(wèn)了回調(diào)地址,并且請(qǐng)求體全沒(méi)了。
從HTTP標(biāo)準(zhǔn)來(lái)說(shuō):
301: Permanent redirect. Clients making subsequent requests for this resource should use the new URI. Clients should
not follow the redirect automatically for POST/PUT/DELETE requests.
302: Redirect for undefined reason. Clients making subsequent requests for this resource should
not use the new URI. Clients should
not follow the redirect automatically for POST/PUT/DELETE requests.
303: The resource can be retrieved by following other URI using the GET method. When received in response to a POST, PUT, or DELETE, it can usually be assumed that the server processed the request successfully and is sending the client to an informational endpoint.
307: HTTP 1.1. The request should be
repeated with the URI provided in the response, but future requests should still call the original URI.
301和302在PUT、POST、DELETE方法的時(shí)候,雖然標(biāo)準(zhǔn)里說(shuō)不應(yīng)該自動(dòng)跟隨,不過(guò)現(xiàn)在的httpclient庫(kù)和瀏覽器通常都做成跟隨,但第二個(gè)請(qǐng)求都會(huì)改成GET方法,請(qǐng)求體自然的就失去了
303沒(méi)試過(guò),照這個(gè)意思,客戶端是當(dāng)做服務(wù)器端已經(jīng)處理完了這個(gè)請(qǐng)求,那么請(qǐng)求體按道理應(yīng)該也是不帶過(guò)去的
307和302都是臨時(shí)重定向,區(qū)別是307會(huì)換個(gè)地址,重復(fù)對(duì)應(yīng)的那個(gè)請(qǐng)求。
得到的教訓(xùn)就是:
- 服務(wù)器端發(fā)重定向的時(shí)候,想一想是否允許對(duì)POST 進(jìn)行重定向,請(qǐng)求又是否允許重放
- 客戶端發(fā)請(qǐng)求的時(shí)候,盡量避免被重定向。。