在Nginx中設置反向代理,實現Vue訪問同一IP地址內的后端接口


最近在接觸前后端分離的Springboot+vue框架。相較於之前用的ASP .NET MVC框架,Springboot+vue將前后端分離得更加徹底,並且將前后端分別置於不同的服務器:Nginx和Tomcat中。

因此,用ASP .NET MVC的思想讓前端訪問后端接口時就會出現一些小問題。本文記錄如何設置反向代理,讓vue訪問同一IP地址內的后端接口。

  -- By Brisk

不同於ASP .NET MVC直接localhost一擼到底,如果在vue中的axios中設置請求接口為localhost,如下:

axios.defaults.baseURL = 'http://localhost:8081'

則在本地開發時是沒有問題的,但是在發布到雲端后會報錯,如下所示:

 

 

這是因為此時這個POST請求是由瀏覽器直接向localhost這個地址,通俗講就是瀏覽這個頁面的電腦發出的,在這里自然是找不到8081上的接口,因為接口發布在雲端嘛。

解決辦法有3種,最后一種是目前采用的解決辦法。

1)直接在axios中寫后端接口的具體地址

如下:

axios.defaults.baseURL = '接口具體IP地址+端口'
如
axios.defaults.baseURL = 'http://1.2.3.4:8081'

這樣便可以訪問后端的接口地址。但是這樣會將后端的接口地址直接暴露在瀏覽器中,且雲服務器需要開放8081,雖然可以解決問題,但是不是很優美。

 

2)在vue程序中設置反向代理。

在vue工程的index.js中找到ProxyTable,設置反向代理的相關內容。可參考網上資料。這時axios的默認baseURL就可以寫成:

axios.defaults.baseURL = '/api'

在瀏覽器中調用POST接口訪問后端接口時,接口地址就變成:“vue前端服務器地址/api/”,這樣后端接口的地址就不會暴露在瀏覽器中了。如下圖,其中XX.XX.XX.XX:8088/api/就是反向代理后的后端接口,真實接口地址並沒有暴露。

但是這樣依然有缺點:a)仍需要在vue工程中顯示地給出后端接口的地址;b)項目打包后,在Nginx中該方法會失效,具體原因不明。

 

3)在Nginx中設置反向代理

最后采用的解決辦法是在Nginx中使用反向代理。以下理解可能有誤:當在Nginx中設置反向代理后,瀏覽器發出的請求會傳送給Nginx,由Nginx決定請求發送至哪里。這樣就會有一個好處,因為Nginx和Tomcat在同一個IP地址內,因此Nginx可以直接通過127.0.0.1加端口號來訪問后端接口。這樣既無需顯示地給出后端接口地址(只要給個端口號),也可以在生產環境中使用反向代理,雲端同樣無需開放8081端口。

在Nginx中設置反向代理的方法如下,在nginx.conf中輸入(注意api后面有個/):

location /api/ {
            proxy_pass   http://127.0.0.1:8081/;
}

就可以用 “vue前端地址/api/”來訪問位於8081端口的后端接口啦。vue中axios的設置與2)一致:

axios.defaults.baseURL = '/api'

 

補充:

經過上述方法,可以在post請求中訪問到后端的接口了。但是此時若在本地開發,需要修改axios的baseURL,不是很方便。因此,可以在main.js中使用以下代碼,判斷向前端服務器發出請求的是否為localhost,然后改變axios的baseURL:

let host = window.location.host // 主機
let reg = /^localhost+/
if (reg.test(host)) {
  // 若本地項目調試使用
  axios.defaults.baseURL = 'http://localhost:8081'
} else {
  // 遠程訪問 使用代理
  axios.defaults.baseURL = '/api'
}

經過上述方法,就解決了生產環境下,實現vue通過post訪問同一IP地址下的后端接口。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM