異常現象:
多頁面應用,路由采用hash模式,鏈接帶有"#"。
在微信中分享到朋友圈或好友時,分享出去的路由被破壞,打開分享的鏈接,路由中的“#”會被去掉並追加?fromTimeline之類的后綴參數,這就造成了分享出去的鏈接只能進入首頁,無法正常跳轉到其他路由。
//1. 初始路由鏈接: http://wx.xxx.com/wx/#/classifylist/1 //2. 分享鏈接被打開之后: http://wx.xxx.com/wx/?fromTimeline
解決思路:
最開始的想法就是去掉“#”,但是使用history模式去掉“#”之后,主路由(首頁)可以正常訪問,其他頁面從主路由進入也是OK的,但是進入其他頁面刷新頁面的話就無法正常訪問了。查資料,找大牛,結果還是多頁面應用無法正常使用history模式,這條路走不通。
然后就是考慮使用其他字符替換“#”,然后在路由中對訪問鏈接進行判斷,如果是用戶通過分享鏈接訪問,把鏈接中的替換字符重新換回“#”,這樣也就不會影響路由之間的跳轉了,具體代碼如下:
//在主vue中將路由中的"#"替換為"?",並將#后邊的內容編碼后追加到"?"后邊 var urls=location.href.split('/#')[0]+"?"+encodeURIComponent(location.href.split('/#')[1]) //路由中對訪問url進行判斷,如果是訪問的分享鏈接,對鏈接進行路由還原,再重定向到正確的路由,微信追加的 ?fromtimeline 之類的參數已經被?切割掉了,務需理會 var href = location.href.split("?")[0]+"#"+decodeURIComponent(location.href.split("?")[1]) location.href = href
雖然有點麻煩,還是解決問題了,本地調試OK,測試服務器上也沒問題,傳到阿里雲的服務器上又凌亂了:
后來嘗試了下發現,只要不是項目中的真實路由,就會直接給出這個錯誤提示,也就是說直接被阿里雲給攔下了,根本就到不了服務器,更別提路由中進行路由還原重定向了,繼續探索新的方法!
既然阿里雲不接受非真實路由訪問,那就考慮后端重定向吧——后端提供接口,前端在分享配置中,對要分享出去的url進行編碼,然后作為參數傳遞給后端接口,由后端接口直接把參數解碼,還原前端路由,重定向,搞定!
var UrlAttr = location.href.split('#') var urls = wxShareLinkTransformUrl + "?host=" + encodeURIComponent(UrlAttr[0]) + "¶m=" + encodeURIComponent(UrlAttr[1])
途中 wxShareLinkTransformUrl 是后端提供接口,接收前端傳遞的域名以及路由參數,經后端處理重新合成完成的前端路由。