記一次HTTP POST請(qǐng)求變成GET請(qǐng)求

問(wèn)題描述

客戶(hù)端發(fā)起的HTTP POST請(qǐng)求, 到達(dá)服務(wù)器后請(qǐng)求方法莫名其妙變成了GET請(qǐng)求, 導(dǎo)致客戶(hù)端收到的是404烤宙。

問(wèn)題定位

  1. 首先檢查代碼, 再三確認(rèn)并且在測(cè)試環(huán)境上驗(yàn)證后確保代碼沒(méi)問(wèn)題嗜愈。

  2. 因?yàn)槭巧a(chǎn)環(huán)境出現(xiàn)的問(wèn)題, 便排查測(cè)試環(huán)境和生產(chǎn)環(huán)境的區(qū)別:

    1. 兩者客戶(hù)端代碼相同
    2. 兩者服務(wù)端代碼相同
    3. 生產(chǎn)環(huán)境用Nginx做了域名轉(zhuǎn)發(fā), 而測(cè)試環(huán)境直接使用的IP訪(fǎng)問(wèn), 未使用代理

于是嘗試將問(wèn)題定位在Nginx轉(zhuǎn)發(fā)上, 馬上重現(xiàn)問(wèn)題, 并且觀察Nginx日志, 發(fā)現(xiàn)轉(zhuǎn)發(fā)時(shí)出現(xiàn)了如下日志:

[27/Jul/2020:15:53:01 +0800] [訪(fǎng)問(wèn)的URL] "POST /api/v/game/query HTTP/1.1" 301 185 "-" "PostmanRuntime/7.25.0" "-"
[27/Jul/2020:15:53:01 +0800] [訪(fǎng)問(wèn)的URL] "GET /api/v/game/query HTTP/1.1" 404 18 "http://訪(fǎng)問(wèn)的URL/api/v/game/query" "PostmanRuntime/7.25.0" "-"

從上面的日志可以看出:

  1. Nginx收到的請(qǐng)求確實(shí)為POST請(qǐng)求, 客戶(hù)端請(qǐng)求沒(méi)有問(wèn)題。
  2. 從Nginx到服務(wù)端請(qǐng)求發(fā)生了變化: POST被轉(zhuǎn)換成了GET請(qǐng)求, 由此服務(wù)端返回404。

由此可以確定: 問(wèn)題的出現(xiàn)是因?yàn)镹ginx的轉(zhuǎn)發(fā)使HTTP方法類(lèi)型發(fā)生了變化颠焦。

問(wèn)題原因

那么Nginx為什么會(huì)把POST請(qǐng)求轉(zhuǎn)換成GET請(qǐng)求呢通今?注意上面的第一行日志中有301的字樣, 301狀態(tài)碼的意思是: 資源位置永久改變, 需要重定向, 通常用于將HTTP請(qǐng)求遷移到HTTPS。

到這里, 回頭看看Nginx的配置文件, 文件中配置了listen 443 ssl, ssl_certificate, ssl_certificate_key等參數(shù), 即Nginx配置的是HTTPS服務(wù), 所有請(qǐng)求將以HTTPS訪(fǎng)問(wèn), 對(duì)于HTTP請(qǐng)求, 將會(huì)被以HTTPS的形式重定向娇妓。

再看看客戶(hù)端發(fā)起請(qǐng)求的URL, 確實(shí)是HTTP請(qǐng)求, 所以觸發(fā)了重定向, 也就導(dǎo)致了問(wèn)題的產(chǎn)生像鸡。

即使通過(guò)Nginx將HTTP轉(zhuǎn)換成了HTTPS, 這里也并沒(méi)有解釋為什么POST會(huì)變成GET請(qǐng)求, 這里就需要祭出著名的《圖解HTTP》中關(guān)于狀態(tài)碼的解釋了:

書(shū)中關(guān)于3xx狀態(tài)碼的解釋:

1. 301-Moved Permanently(永久性重定向), 該狀態(tài)碼表示請(qǐng)求的資源已經(jīng)被分配了新的URI, 以后應(yīng)使用資源現(xiàn)在所指的URI, 也就是說(shuō)如果已經(jīng)把資源對(duì)應(yīng)的URI保存為書(shū)簽了, 這時(shí)應(yīng)該按Location首部字段提示的URI重新保存。

2. 302-Found(臨時(shí)重定向), 該狀態(tài)碼表示請(qǐng)求的資源已經(jīng)被分配了新的URI, 希望用戶(hù)(本次)能使用新的URI訪(fǎng)問(wèn)哈恰。和301不同的是, 302不是永久移動(dòng), 只是臨時(shí)性質(zhì)的, 也就是已移動(dòng)的資源對(duì)應(yīng)的URI將來(lái)還有可能發(fā)生改變, 如果URI被保存為書(shū)簽, 用戶(hù)不需要更新書(shū)簽只估。

3. 303-See Other(存在另一個(gè)URI), 該狀態(tài)碼表示請(qǐng)求的資源存在著另一個(gè)URI, 應(yīng)使用GET方法定向獲取請(qǐng)求的資源。303和302功能相同, 但303明確表示客戶(hù)端應(yīng)當(dāng)采用GET方法獲取資源着绷。比如, 當(dāng)使用POST方法訪(fǎng)問(wèn)時(shí), 其執(zhí)行后的處理結(jié)果是希望客戶(hù)端能以GET方法重定向到另一個(gè)URI上去, 則返回303狀態(tài)碼蛔钙。

4. 304-Not Modified(未滿(mǎn)足條件的URI), 該狀態(tài)碼表示客戶(hù)端發(fā)送附帶條件的請(qǐng)求時(shí), 服務(wù)器允許請(qǐng)求訪(fǎng)問(wèn)資源, 如果未滿(mǎn)足條件, 則返回304。

5. 307-Temporary Redirect(臨時(shí)重定向), 該狀態(tài)碼與302有相同的意義, 302禁止POST變換成GET, 但是在實(shí)際使用中, 大家并不遵循, 仍然將POST轉(zhuǎn)換成了GET荠医。307會(huì)遵照標(biāo)準(zhǔn), 不會(huì)從POST變成GET吁脱。

注: 當(dāng)301、302彬向、303狀態(tài)碼返回時(shí), 幾乎所有的瀏覽器都會(huì)把POST改成GET, 并刪除請(qǐng)求報(bào)文內(nèi)的主體, 之后請(qǐng)求會(huì)自動(dòng)再次發(fā)送兼贡。即使301, 302禁止將POST方法改成GET方法, 但實(shí)際使用中大家仍然將其改成了GET。

到這里, 原因已經(jīng)很明了了娃胆。

問(wèn)題解決

對(duì)于這里的問(wèn)題場(chǎng)景, 我們不希望POST請(qǐng)求被改成GET請(qǐng)求, 則解決方法有:

  1. 如果可以, 將客戶(hù)端發(fā)起的HTTP請(qǐng)求改為HTTPS請(qǐng)求, 這樣便不會(huì)重定向紧显。

  2. 將Nginx配置文件中的return 301 $URI永久重定向改為return 307 $URI臨時(shí)重定向。

參考資料

  1. stack overflow

  2. 《維基百科》

  3. 《圖解HTTP》

原文鏈接

記一次HTTP POST請(qǐng)求變成GET請(qǐng)求

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末缕棵,一起剝皮案震驚了整個(gè)濱河市孵班,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌招驴,老刑警劉巖篙程,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異别厘,居然都是意外死亡虱饿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)触趴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)氮发,“玉大人,你說(shuō)我怎么就攤上這事冗懦∷幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵披蕉,是天一觀的道長(zhǎng)颈畸。 經(jīng)常有香客問(wèn)我乌奇,道長(zhǎng),這世上最難降的妖魔是什么眯娱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任礁苗,我火速辦了婚禮,結(jié)果婚禮上徙缴,老公的妹妹穿的比我還像新娘试伙。我一直安慰自己,他們只是感情好于样,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布迁霎。 她就那樣靜靜地躺著,像睡著了一般百宇。 火紅的嫁衣襯著肌膚如雪考廉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天携御,我揣著相機(jī)與錄音昌粤,去河邊找鬼。 笑死啄刹,一個(gè)胖子當(dāng)著我的面吹牛涮坐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播誓军,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼袱讹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了昵时?” 一聲冷哼從身側(cè)響起捷雕,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壹甥,沒(méi)想到半個(gè)月后救巷,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡句柠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年浦译,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溯职。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡精盅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谜酒,到底是詐尸還是另有隱情叹俏,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布甚带,位于F島的核電站她肯,受9級(jí)特大地震影響佳头,放射性物質(zhì)發(fā)生泄漏鹰贵。R本人自食惡果不足惜晴氨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碉输。 院中可真熱鬧籽前,春花似錦、人聲如沸敷钾。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阻荒。三九已至挠锥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侨赡,已是汗流浹背蓖租。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羊壹,地道東北人蓖宦。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像油猫,于是被迫代替她去往敵國(guó)和親稠茂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348