Alex
Alex

Reputation: 181

vue-router, nginx and direct link

I'm trying to setup a vue-router on my nginx server. The issue I'm having is that my route doesn't work if I enter url directly to the browser myapp.com/mypath.

I've tried server configuration as described in the vue router docs as well as suggested similar configurations on stack overflow. My current nginx location configuration as follows:

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

location /subscribe {
    proxy_pass http://127.0.0.1/subscribe // express API app
}

All that does is redirects any path to my root component (path: /) and not /mypath. This does make sense and location seems to only redirect to the index file. How can I redirect direct link of myapp.com/mypath to /mypath route in my VueJS app?

Here is how my vue routes setup now:

...
const routes = [
    { path: '/', component: Landing },
    { path: '/mypath', component: MyPath }
];

const router = new VueRouter({ mode: 'history', routes });

new Vue({
    el: '#app',
    router,
    render: h => h(App)
});

Upvotes: 11

Views: 21377

Answers (8)

Jiu_Zou
Jiu_Zou

Reputation: 571

In vue router 4 for vue3

first

try to find the mounted APP.vue, when you refresh the webpage, the App.vue will be loaded firstly. So make sure you don't mounted this.$router.push("/")

  mounted() {
     this.$router.push("/");
}

the correct thing

mounted() {
    this.loading();
},
methods: {
  loading() {
    if(document.URL=="http://localhost:9000/" || document.URL=="https://zoujiu.com.cn/"
          || document.URL=="http://zoujiu.com.cn/" || document.URL=="http://localhost:9000/#/"
          || document.URL=="http://zoujiu.com.cn/#/"|| document.URL=="https://zoujiu.com.cn/#/"
        ) {
          this.$router.push({ path: '/'});
        }
  }
}

deployment

I use this history with nginx ssl https

const router = createRouter({
  // history: createMemoryHistory(),
  history: createWebHashHistory(),
  // history: createWebHistory(),
  routes:constantRoutes,
})

development

I use this history

const router = createRouter({
  // history: createMemoryHistory(),
  // history: createWebHashHistory(),
  history: createWebHistory(),
  routes:constantRoutes,
})

this is myown website http://zoujiu.com.cn.

Upvotes: 0

Vincent Guyard
Vincent Guyard

Reputation: 414

In my case try_files didn't work, probably because another nginx is over my app nginx, using proxy_pass. I had to use 404 error rewriting:

server {
    listen ${NGINX_PORT} ssl;
    server_name ${NGINX_HOST};
    ssl_certificate ${NGINX_SSL_CERTIFICATE};
    ssl_certificate_key ${NGINX_SSL_CERTIFICATE_KEY};
    error_page 404 =200 /index.html;
    location / {
        root ${NGINX_ROOT_LOCATION};
        index  index.html;
        include  /etc/nginx/mime.types;
    }
}

Upvotes: 1

Jorge Cardenas
Jorge Cardenas

Reputation: 59

My suggestion is make sure you use the next line, as suggested in vue-router documentation. But, in addition, if you have multiple files to set your nginx server,for instance a file for setting the SSL of your server,please make sure to include it also in those files.

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

Upvotes: 0

Bruno Frare
Bruno Frare

Reputation: 41

Are you using a custom publicpath (mypath) in the vue.conf and the nginx?

If so, you need to change the configuration to match to that path.

location /mypath {
    try_files $uri $uri/mypath /mypath/index.html
}

Upvotes: 4

Fazel Kazempour
Fazel Kazempour

Reputation: 1

well I had same problem so I tried to redirect every 404 errors to root url and it perfectly works.

  1. Got to: /etc/nginx/sites-enabled

  2. Open default config file

  3. add this line before location for 404 redirect:

    error_page 404 /;

save the file and don't forget to restart nginx

Upvotes: 0

Muhammad Waqas
Muhammad Waqas

Reputation: 561

  1. Got to: /etc/nginx/sites-enabled

  2. Open the config for your domain

  3. add the following code under 'root'

    location / {
      try_files $uri $uri/ /index.html;
    }
    
  4. save the file

  5. restart your nginx server with command: /etc/init.d/nginx restart

  6. Refresh browser

Upvotes: 3

xneg
xneg

Reputation: 1348

I struggled for several hours solving the same problem. After all this config works for me:

events {
...
  http {
  ...
    server {
          listen       80;
          server_name  localhost;

          location / {
              root   /path/to/your/project/html;
              index  index.html index.htm;
              include  /etc/nginx/mime.types;
              try_files $uri $uri/ /index.html;
          }
    }
  }
}

I have almost the same router setup as you.

Upvotes: 9

Alex
Alex

Reputation: 181

I've found 1 possible solution with the suggestion from a co-worker.

I'm now passing URI as a query parameter in nginx. So my config is now this:

location / {
    try_files $uri $uri/ /index.html?uri=$uri
}

Then in my router configuration in VueJS:

const routes = [
{
    path: '/',
    component: Landing,
    beforeEnter: (to, from, next) => {
        const { uri } = to.query;
        if (uri != null && uri != '/') {
            next(false);
            router.push(uri);
        } else {
            next();
        }
    }
}, ...

This seems to do the trick, although looks a bit dodgy.

Upvotes: 4

Related Questions