私はrouter.beforeEach
グローバルフックを使用して見つからないページの404.htmlにリダイレクトしようとしていますが、成功しませんでした(Vue
およびVue-Router
1.0を使用):
router.beforeEach(function (transition) {
if (transition.to.path === '/*') {
window.location.href = '/404.html'
} else {
transition.next()
}
});
これは、存在しないルートが挿入されたときにページ404.html
にリダイレクトされず、空のフラグメントを提供するだけです。 some-site.com/*をハードコーディングした場合のみ、予想されるsome-site.com/404.htmlにリダイレクトします
私はここで私が見落としている非常に明白な何かがあると確信していますが、私は何を理解することはできません。
私が探しているのは別のルートへのリダイレクトではなく、新しいページへのリダイレクトであり、これはこれらのスニペットのようにrouter.redirect
を使用することで簡単に達成できることに注意してください:
router.redirect({
'*': '404'
})
一方、router.map
には、次のものがあります。
router.map({
'/404': {
name: '404'
component: {
template: '<p>Page Not Found</p>'
}
}
})
以下に詳述するように、デフォルトのルートハンドラを使用して、そこからアプリの外部のページにリダイレクトできるはずです。
const ROUTER_INSTANCE = new VueRouter({
mode: "history",
routes: [
{ path: "/", component: HomeComponent },
// ... other routes ...
// and finally the default route, when none of the above matches:
{ path: "*", component: PageNotFound }
]
})
上記のPageNotFound
コンポーネント定義では、実際のリダイレクトを指定できます。これにより、アプリから完全に抜け出します。
Vue.component("page-not-found", {
template: "",
created: function() {
// Redirect outside the app using plain old javascript
window.location.href = "/my-new-404-page.html";
}
}
上記のcreated
フック、またはmounted
フックで実行できます。
ご注意ください:
上記を確認していません。アプリの製品版をビルドする必要があります。上記のリダイレクトが発生することを確認してください。サーバー側の処理が必要なため、vue-cli
でこれをテストすることはできません。
通常、単一ページのアプリでは、サーバーは、特に<base href="/">
を設定している場合、すべてのルートリクエストに対してアプリスクリプトと共に同じindex.htmlを送信します。サーバーが特殊なケースとして扱い、静的ページを提供しない限り、/404-page.html
に対してこれは失敗します。
機能するかどうか教えてください!
@maniの元の答えはあなたが望むものすべてですが、公式な方法でそれを読みたいのであれば、ここにあります
https://router.vuejs.org/guide/essentials/history-mode.html#caveat