首發於 個人github博客, 歡迎關注
nginx 匹配的 try_file 與前端路由的優先級問題
場景描述:html
www.abc.com
, 以後點擊界面裏面的logout
,前端路由處理,跳轉到www.abc.com/login
/login
的時候,沒有報404?/login
邏輯:this.$router.push({name: 'login'});
貼下前端路由配置前端
routes: [ { name: 'home', path: '/', component: Home, meta: { requiresAuth: true }, }, { path: '/login', name: 'login', component: Login, }, { path: '*', component: NotFound, } ]
現有nginx配置linux
location / { root: /var/data/static; }
解決:nginx
爲什麼點擊退出能夠正常顯示登陸頁面?git
由於點擊退出,使用的redirect是前端路由this.$router.push({name: 'login'});
來實現的,這時候已經有index.html 和相關的js了,能夠直接使用前端路由跳轉到/login
路由對應的組件
爲什麼刷新的時候顯示: nginx/404?github
- 由於刷新的時候,會先向服務器請求xxxx.com/login,
- 這時候服務器的nginx配置中沒有關於/login路徑的配置,直接報nginx/404的錯誤
如何解決?瀏覽器
在nginx的location /{root xxxpath}
中添加try_file: /index.html
的配置
解釋:服務器
- nginx進行匹配路徑的時候,發現沒有
/login
的路徑,便會轉到/
路徑處理。- 發現
root
路徑下(是靜態文件的root目錄,不是linux的root目錄)沒有login
文件,就會try_file
規則,返回index.html,- 這樣瀏覽器拿到index.html 以後,開始加載其中的前端路由部分
- 這時候/login就會在前端路由中找到匹配規則
/404
也能夠寫在前端路由中了