Using Vue Router History Mode
Vue:2.6.11
Vue-Router:3.2.0
在 Vue Router 中有 history
跟 hash
兩種模式。
在 hash
模式下,URL 的顯示會類似 https://localhost#home
,而 history
則是與一般 Restful URL 的形式相同,像是 https://localhost/home
。
通常使用都會以 history
模式為主,除了美觀以外,也較不會跟 URL 的 anchor
功能衝突。
在初學用 Vue
架設 SPA
網站時,有不少人會遇到在 history
模式下,將編譯好的 code 放到 HTTP Server
上卻無法執行。
其實這個問題很容易,只要理解運作原理,基本上問題就可以自動解決了。
SPA and MPA
首先,要先理解 Single Page Application (SPA)
和 Multi Page Application (MPA)
的運作原理。
MPA
較好理解,就是根據 URL 路徑,由 HTTP Server
去載入個別的檔案。
MPA
graph LR
/home-->HTTPServer["Http Server"]
/about-->HTTPServer["Http Server"]
/info-->HTTPServer["Http Server"]
HTTPServer["Http Server"]-->home.html
HTTPServer["Http Server"]-->about.html
HTTPServer["Http Server"]-->info.html
而 SPA
則是會載入同一支檔案,檔案再根據 URL 路徑去選擇要載入的檔案。
SPA
graph LR
/home-->HTTPServer["Http Server"]
/about-->HTTPServer["Http Server"]
/info-->HTTPServer["Http Server"]
HTTPServer["Http Server"]-->index.html["index.html(v-router)"]
index.html["index.html(v-router)"]-->home
index.html["index.html(v-router)"]-->about
index.html["index.html(v-router)"]-->info
Server Configuration
因此在 history
模式下,HTTP Server
要做的設定就是 將進入的路徑都指到 index.html
,再由 index.html
裡面的 Vue Router
去控制。
如果沒有設定的話,HTTP Server
就會去找路徑相對應的檔案,那就會出現 404 not found
的狀況惹。
Apache
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]
</IfModule>
Nginx
location / {
try_files $uri $uri/ /index.html;
}