首發於我的github博客, 歡迎關注
nginx 匹配的 try_file 與前端路由的優先級問題
-
場景描述:
- 訪問
www.abc.com
, 之後點擊界面裏面的logout
,前端路由處理,跳轉到www.abc.com/login
- 但是登錄頁面刷新之後,就顯示nginx 404了
- 奇怪的地方就在於,爲何退出的時候,重定向到
/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配置
location / { root: /var/data/static; }
- 訪問
-
解決:
-
爲何點擊退出可以正常顯示登錄頁面?
因爲點擊退出,使用的redirect是前端路由
this.$router.push({name: 'login'});
來實現的,這時候已經有index.html 和相關的js了,可以直接使用前端路由跳轉到/login
路由對應的組件 -
爲何刷新的時候顯示: nginx/404?
- 因爲刷新的時候,會先向服務器請求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就會在前端路由中找到匹配規則
- nginx進行匹配路徑的時候,發現沒有
- 同理
/404
也可以寫在前端路由中了
-