vue-router 历史模式在刷新时不起作用

Posted

技术标签:

【中文标题】vue-router 历史模式在刷新时不起作用【英文标题】:vue-router history mode doesn't work on refresh 【发布时间】:2018-07-07 04:26:42 【问题描述】:

我将 vue-router 添加到我的项目中,它在基本设置下运行良好。但我想去掉 URL 中的主题标签 (#)。所以跟随the documentation 我切换到历史模式。我使用此链接 (<router-link to="/page/4">Open page</router-link>) 效果很好,但如果我尝试直接访问此页面(刷新),服务器会返回 404 错误屏幕。

我使用 nginx(docker 的 nginx:alpine 映像),这是 default 文件:

server 
    root /var/www;
    index index.html index.htm;

    server_name localhost;

    location / 
        try_files $uri $uri/ /index.html;
    

这是路由器:

new VueRouter(
  mode: 'history',
  routes: [
    
      path: '/page/:id',
      component: page
    
  ],
);

为什么会返回 404 错误?

【问题讨论】:

不是一个解决方案,只是一个旁注:router-link 之所以有效,是因为它是一个 pushState,而不是对该 URL 的真正请求(因此它不会发送到服务器)。真正的请求是在您直接导航或刷新时发出的。 当使用历史模式时,您需要确保您的服务器返回任何服务器请求的索引页。您需要在服务器端进行配置。 【参考方案1】:

在使用历史模式时,您需要一条全能路线。 Vue-router 用于客户端路由,当您在浏览器中直接访问 url 时,它会尝试通过您的服务器进行路由,因此是 404。

以 Laravel 为例,你可以像这样定义 catch all 路由:

// match all GET or HEAD requests and return the my-app.index.blade.php file
Route::get('/view?', 'HomeController@index')
     ->where('view', '(.*)')
     ->name('my-app.index');

这将匹配任何路由 GET 或 HEAD 请求并返回主视图页面。在该页面中是 javascript 应用程序,然后 vue-router 将采取相应的行动。

但是,现在您的应用将永远不会显示 404,因此要正确显示 404 页面,您需要在 js 路由中创建另一个 catch all。请参阅页面末尾的警告部分:

https://router.vuejs.org/en/essentials/history-mode.html

编辑:

// nginx redirect 
location / 
    try_files /index.html =404;

【讨论】:

我将 vue 用于客户端(没有 PHP),并且 index.html 是我希望处理所有请求的地方。但看起来 nginx 在尝试加载 mysite.com/page/1 时不会将用户重定向到 mysite.com/index.html。这就是我想做的。 添加了 nginx 重定向回答 不幸的是它并没有改变任何东西。 ://【参考方案2】:

这是 nginx 配置问题 将下面的配置插入到您的 nginx 服务器块/配置中

error_page 404 /index.html;

【讨论】:

【参考方案3】:

首先,

在你的 route.js 文件中添加:


    path: '/*',
    redirect:  name: 'route-name' 

这会将所有无效路由重定向到您想要的路由。

其次,在 Laravel 中的 web.php 文件中:

Route::get('/any', function()  return view('your-main-view'); )->where('any', '(.*)');

【讨论】:

以上是关于vue-router 历史模式在刷新时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

动态路由在使用 Next.js 刷新页面时不起作用

React-router 2.0 browserHistory 刷新时不起作用

带有 BrowserRouter / browserHistory 的 React-router 在刷新时不起作用

带有 BrowserRouter / browserHistory 的 React-router 在刷新时不起作用

Nuxt.js 自定义角色中间件在页面刷新时不起作用

useEffect 中的套接字连接事件在创建组件时不起作用,但在 React 中刷新页面后起作用