vue-router-h5-history

darkerXi發表於2018-09-07

vue-router的HTML5 History 模式,這種模式充分利用 history.pushState API 來完成 URL 跳轉而無須重新載入頁面。

const router = new VueRouter({
  mode: `history`,
  routes: [...]
})

當你使用 history 模式時,URL 就像正常的 url,例如 http://yoursite.com/user/id, 就是長這樣的!

不過這種模式要玩好,還需要後臺配置支援。因為我們的應用是個單頁客戶端應用,如果後臺沒有正確的配置,當使用者在瀏覽器直接訪問 http://oursite.com/user/id 就會返回 404,這就尷尬了。

所以,你要在服務端增加一個覆蓋所有情況的候選資源:如果 URL 匹配不到任何靜態資源,則應該返回同一個 index.html 頁面,這個頁面就是你 app 依賴的頁面。

目前後端伺服器有Apache、nginx、原生 Node.js、基於 Node.js 的 Express、Internet Information Services (IIS)、Caddy、Firebase 主機等。

先給一個官方標準版配置的傳送門,請戳這裡→ https://router.vuejs.org/zh/g…
既然是官方給出的配置,那肯定就會說的很官方咯~

按照官方給出的示例,將道理是成功的,但是官方給出的只侷限於這個專案在伺服器的根目錄下!
如果你的專案沒有放在根目錄下,那麼就是這麼的不講道理。

下面是在實際開發中碰到的問題。

我們的後端伺服器是nginx,所以按照官方的給出的配置,找到nginx.conf,照抄程式碼,修改完後重啟伺服器,講道理是成功的。

server
{
    listen 80;
    server_name oursite.com;
    location /test/ {            
        alias  /usr/local/test/;
        index  index.htm index.html;
        #上面的就是一些常規配置,下面這個才是重點
        try_files $uri $uri/ /index.html;

        #這裡沒有采用官方給出處理404錯誤頁面的方案
        #方案一(把所有沒有字尾名的請求如果404都跳轉到index.html,我們沒有采用)
        #error_page 404 /test/index.html;

        #方案二(404的方式,不是特別完美。會有瀏覽器留下404的狀態(容易被第三方劫持),以下方式可以避免被第三方劫持!)
        if (!-e $request_filename) {
            rewrite ^/(.*) /test/index.html last;
            break;
        }
    }
}

但是,事實就是這麼的不講道理,我們並沒有成功!這就令人很是鬱悶了,心中一萬隻神獸羊駝,奔騰而過~ 為什麼沒有成功呢,都是按部就班做的呀,完全不講道理!

而真相只有一個,那就是~~~

路由檔案中的路徑有問題

const router = new VueRouter({
  mode: `history`,
  routes: [
    { path: `/test/`, component: YourComponent },
    { path: `/test/a`, component: YourComponent },
    { path: `/test/b:x`, component: YourComponent }
  ]
})

在路由檔案中所有的路徑前面加上伺服器下專案所在的檔名即可,當然也包括<router-link>this.$router.push()中的路徑,不然又是不講道理的。

這只是在nginx伺服器下的一種解決方案,至於別的伺服器應該也是同理的。

如果您有更好更優的方案,歡迎交流,謝謝。