問web項目的代理,業界常用的方案是nginx做代理,這個是網上最多資料的。
因為我需要做自己的流量轉發,也就是所有訪問都要經過我的一個流量分發微服務,這和nginx作用沖突了。如果再加個nginx來做第一層方向代理和網頁的靜態資源代理的話,那么就多了一層,哪怕都在一臺服務器里,那也是多了一層性能損耗,所以我就在想,golang沒有自己的網頁代理方案嗎?不應該呀,非要依賴nginx?
網上的資料模模糊糊,提到gin框架有靜態資源代理的方法。但是有寫得不是很具體。我實測,是可以做到的。
第一步,打包web項目
打包完后的目錄結構大概是這樣的:
gin 路由編寫
//前期的gin配置和普通項目一樣即可,比如中間件等,該加就加。這里簡寫:router = gin.Default()// 靜態資源代理router.Static("/assets","./dist/assets")router.LoadHTMLFiles("./dist/index.html")router.GET("/", func(c *gin.Context) {// 渲染HTML模板c.HTML(200, "index.html", gin.H{})})
對,就這樣就可以了。瀏覽器直接打開localhost:8080
(假設端口是8080),就可以訪問了。
PS:當然,跨域的問題還是得解決的。不然一樣會提示。
為什么不能在本地直接打開index.html?
經過上面的嘗試,我感覺gin也沒做啥呀,怎么就可以了呢?感覺就是把index.html文件發送給瀏覽器而已。
我就想為什么不能在瀏覽器打開index.html訪問呢?
有疑問總得嘗試下嘛。
直接用瀏覽器打開:
一片空白,打開F12查看:
哦,是因為訪問不到打包的兩個資源,于是我就看看:
這不是路徑不對嗎?那就把index里的路徑引用改為相對路徑:
刷新再看看:
css文件已經可以正常引用了,再看看這個js,一直報cors跨域錯誤:
請求的路徑已經是對的了,就是跨域不允許訪問,也對,瀏覽器為了安全,是不允許這樣加載js文件的。
這個跨域是真的煩,好人也不放過!
于是網上看看有沒有解決辦法,找到這么一個方案
思路就是把瀏覽器的跨域安全給禁用。以chrome瀏覽器為例:
- 復制你的快捷方式一份,然后右鍵,選擇屬性
- 在目標中的后面加上其中參數
--disable-web-security --user-data-dir=c:\chomerdata
,注意有個空格,完整的啟動參數如下:C:\Users\Administrator\AppData\Local\Google\Chrome\Application\chrome.exe --disable-web-security --user-data-dir=c:\chomerdata
- 從這個快捷方式啟動瀏覽器,然后將index.html拖動到瀏覽器打開,就可以解決跨域了
嘗試一下可以,但肯定不是可行的方案,畢竟瀏覽器的安全丟失了。
雖然沒有找到可行的本地啟動web網頁的好方案,但是也幫我了解了,web項目打包之后,就是那么點東西,理論上無需對其他工具有依賴,只需要有瀏覽器即可啟動。