Complete Guide to Removing Hashbang from URLs in Vue.js

Nov 25, 2025 · Programming · 8 views · 7.8

Keywords: Vue.js | Vue Router | History Mode | URL Optimization | Single Page Application

Abstract: This article provides a comprehensive exploration of methods to remove hashbang (#!) from URLs in Vue.js applications. By analyzing Vue Router's history mode configuration, it introduces implementation approaches for both Vue 2 and Vue 3, including using mode: 'history' and createWebHistory(). The article also delves into the importance of server configuration to ensure proper route handling in single-page applications after enabling history mode. Through complete code examples and configuration instructions, it offers developers a complete solution set.

Problem Background and Core Concepts

In Vue.js single-page application development, hashbangs (#!) in URLs are a common but less elegant design. This design originated from early browser limitations in supporting frontend routing, using hash fragments to achieve page navigation without refresh. However, modern web applications prefer clean URL structures, which not only enhance user experience but also benefit search engine optimization.

Vue Router History Mode Configuration

Vue Router provides two main routing modes: hash mode and history mode. Hash mode is the default configuration, adding # symbols to URLs; while history mode utilizes the HTML5 History API to achieve hash-free URL navigation.

Configuration in Vue 2

In Vue 2 environments, enable history mode by setting the mode option to 'history':

const router = new VueRouter({
  mode: 'history',
  routes: [
    { path: '/', component: Home },
    { path: '/about', component: About },
    { path: '/contact', component: Contact }
  ]
})

Configuration in Vue 3

Vue 3 introduces more modular API design, requiring the use of the createWebHistory function:

import { createRouter, createWebHistory } from 'vue-router'

const router = createRouter({
  history: createWebHistory(),
  routes: [
    { path: '/', component: Home },
    { path: '/about', component: About },
    { path: '/contact', component: Contact }
  ]
})

Server Configuration Requirements

After enabling history mode, server configuration becomes crucial. Since all routing in single-page applications is handled on the client side, the server needs to respond correctly when users directly access specific paths or refresh pages.

Apache Server Configuration

In Apache servers, configure rewrite rules through the .htaccess file:

<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 Server Configuration

Nginx server configuration is relatively concise:

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

Practical Application Example

The following is a complete Vue.js application example demonstrating how to configure history mode and create a basic routing structure:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Vue.js Application Example</title>
</head>
<body>
  <div id="app"></div>
  
  <script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script>
  <script src="https://unpkg.com/vue-router@3/dist/vue-router.js"></script>
  
  <script>
    // Define page components
    const Home = { 
      template: '<div><h3>Home Content</h3></div>' 
    }
    const About = { 
      template: '<div><h3>About Us</h3></div>' 
    }
    const Contact = { 
      template: '<div><h3>Contact Us</h3></div>' 
    }

    // Configure routing
    const router = new VueRouter({
      mode: 'history',
      routes: [
        { path: '/', component: Home },
        { path: '/about', component: About },
        { path: '/contact', component: Contact }
      ]
    })

    // Create Vue instance
    new Vue({
      el: '#app',
      router,
      template: `
        <div>
          <nav>
            <router-link to="/">Home</router-link> |
            <router-link to="/about">About</router-link> |
            <router-link to="/contact">Contact</router-link>
          </nav>
          <router-view></router-view>
        </div>
      `
    })
  </script>
</body>
</html>

Considerations and Best Practices

When implementing history mode, several important aspects need consideration:

Compatibility Considerations

The HTML5 History API is well-supported in modern browsers, but fallback solutions may be needed for older browsers. Vue Router automatically detects browser support and falls back to hash mode in browsers that don't support the History API.

SEO Optimization

Using history mode significantly improves search engine optimization because search engine crawlers can better understand and index hash-free URL structures. It's recommended to use it in conjunction with server-side rendering (SSR) for optimal SEO results.

Error Handling

When users access non-existent routes, 404 page handling should be configured:

const router = new VueRouter({
  mode: 'history',
  routes: [
    // ...other routes
    { path: '*', component: NotFound }
  ]
})

Conclusion

By properly configuring Vue Router's history mode, developers can easily remove hashbangs from URLs, creating more professional and user-friendly web applications. The key lies in correctly setting the routing mode and ensuring the server can properly handle all route requests. This improvement not only enhances user experience but also provides better support for search engine optimization and social media sharing.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.