項目本地運行時候,首頁子頁面刷新均無問題。部署到服務器之后,刷新頁面報錯、出現404。
當vue項目的vue-router的mode為history路由模式時,若未進行相應的配置,可能會發生這種情況。
前端路由,即由前端來維護一個路由規則。實現有兩種,一種時利用url的hash,也就是常說的錨點(#),JS通過hashChange事件來監聽url的改變,IE7及以下需要輪詢;另一種是HTML5的History模式,它使url看起來像普通網站那樣,以“/”分割,沒有#,但頁面并沒有跳轉,不過使用這種模式需要服務端的支持,服務端在接受到所有請求后,都指向index.html文件,或設置404頁面為index.html。不然刷新時頁面會出現404。
---《Vue.js實戰》
官方文檔有給后端配置的例子
https://router.vuejs.org/zh/guide/essentials/history-mode.html#%E5%90%8E%E7%AB%AF%E9%85%8D%E7%BD%AE%E4%BE%8B%E5%AD%90
后端已經將資源指向index.html仍出現這個問題,檢查靜態資源文件路徑是否正確,這里僅以webpack4 + vue + vue-rout 自己搭建的項目為例。
如果域名為項目的根目錄,資源文件引用的目錄為絕對路徑
<!--index.html-->
<body>
<div id="app"></div>
<script src="/dist/main.js"></script>
</body>
//生產環境配置文件,publicPath指定資源引用的目錄
webpackBaseConfig.plugins = [];
module.exports = merge(webpackBaseConfig, {
output: {
publicPath: '/',//項目根目錄為域名
// 將入口文件重命名為帶有20位hash值得唯一文件
filename: '[name].[hash].js'
},
//...
}
最后一種解決方案,將項目入口文件中的路由配置,history模式去掉就好。vue-router默認使用hash模式。
//main.js
const RouterConfig = {
//mode: 'history',
//...
}
微信三方登錄回調地址,有#號時,接收不到code參數;微信H5支付的回調地址,不允許有#;App分享,處理特殊字符時,可能會對#進行編譯;#沒有/好看。