nginx rewrite學習
今天,一個後端同僚找到我說,為什麼他vue本地可以運作,結果到了線上确不行了。我一聽到這個情況,那肯定就是nginx配置的問題了。奈何後端同僚對nginx不是那麼了解,于是讓我找運維合作解決一下。我于是找到了運維要到了nginx的配置檔案檢視,看看到底是那兒的問題,畢竟之前自己有過手動搭建過nginx伺服器的經驗,對于一般的nginx配置還是了解的。同僚的問題一看就是代理配置的有問題,才導緻的線上通路報錯的。結果拿到配置檔案左看看右看看硬是沒看出來是那兒的問題。後面對比了一下本地的proxy配置,pathRewrite這個玩意進入了視線中,我項目中正常都是以後端接口的前兩個英文單詞進行代理的,比如後端的接口為 https://www.xxx.com.cn/aa/bb/cc/dd/getUserInfo 我的習慣是以/aa/bb/進行關鍵字進行代理的。
實際上下面的這種寫法也是可以的。但是因為之前都是配置成功的于是就沒有深入了解這邊的配置問題。
也就是pathRewrite 這個玩意到底是幹啥子用的。沒有具體的去了解過。
今天後端同僚的操作讓我對于這個pathRewrite有了一些了解。
後端同僚的本地配置沒有毛病
然後上線的時候找運維配置對應的ng配置,運維就按照我們之前的那種規則配置了,結果就發現有問題了,通路不通了。
運維把腳本給我之後。我左看看右看看沒看出啥子問題,然後嘗試請求了看一下。發現請求也是正常的。然後瞄了一眼,代理之後的真實的請求,發現請求中多了login導緻整個接口調用失敗,于是就在考慮為什麼本地請求中沒有夾帶login,線上确夾帶了login。是不是那兒有操作重新寫了啥的,在看到pathRewrite,這個從英文看就有點可疑,于是搜尋了一下,發現确實是這個重寫了login,把比對的到的login重寫成了“”,這樣的話那麼請求中就不會存在login這個字段了。這樣的話就簡單了,隻要把ng伺服器上面的請求也重新寫一下就行了,查了一下,ng上面的rewrite重寫是通過正則比對實作的,
rewrite "用來比對路徑的正則" 重寫後的路徑 [指令];
常用的指令有2個,分别是:last、break;
(1)last:重寫路徑結束後,将得到的路徑重新進行一次路徑比對;
(2)break:重寫路徑結束後,不再重新比對路徑。
因為對正則不熟悉,寫了三次才寫正确了。
rewrite "^/login/(.*)$" /$1 break;
首先是比對到login開頭的。然後隻取比對到的後面的部分,這樣就實作去掉請求路徑中的login字元串了。