Làm thế nào để loại bỏ hashbang khỏi url?


257

Làm thế nào để loại bỏ hashbang #!khỏi url?

Tôi tìm thấy tùy chọn để vô hiệu hóa hashbang trong tài liệu bộ định tuyến vue ( http://vuejs.github.io/vue-router/en/options.html ) nhưng tùy chọn này sẽ xóa #!và chỉ cần đặt#

Có cách nào để có url sạch không?

Thí dụ:

KHÔNG PHẢI: #!/home

NHƯNG: /home

Câu trả lời:


484

Bạn sẽ thực sự chỉ muốn thiết lập modeđể 'history'.

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

Tuy nhiên, hãy chắc chắn rằng máy chủ của bạn được cấu hình để xử lý các liên kết này. https://router.vuejs.org/guide/essentials/history-mode.html


4
Cảm ơn Bill ở đây bạn có thể xóa hashbang sai ở đây là mã:const router = new VueRouter({ history: true })
DokiCRO

2
Tôi đã chơi với github.com/vuejs/vue-hackernews và thêm {history: true}tác phẩm cho trang đầu tiên, nhưng các tuyến còn lại đều thất bại.
Hari KT

Ý bạn là khi bạn tải lại ứng dụng trên các tuyến đường khác? Nếu vậy, bạn cần cấu hình máy chủ của bạn đúng cách.
Bill Criswell

Vui lòng đặt thông tin vue.js 2 ở đầu câu trả lời
diralik

2
Trong tập tin nào cần được thêm vào?
Derzu

81

Đối với vue.js 2, hãy sử dụng như sau:

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

5
Sự khác biệt giữa câu trả lời này và câu trả lời được chấp nhận ở đây là gì?
Ilyas karim

15
Câu trả lời được chấp nhận đã được chỉnh sửa sau khi nhận ra đây là giải pháp, bạn có thể kiểm tra nhật ký chỉnh sửa của câu trả lời được chấp nhận.
Israel Morales

22

Hash là cài đặt chế độ bộ định tuyến vue mặc định, nó được đặt vì với hàm băm, ứng dụng không cần kết nối máy chủ để phục vụ url. Để thay đổi, bạn nên định cấu hình máy chủ của mình và đặt chế độ thành chế độ API Lịch sử HTML5.

Đối với cấu hình máy chủ, đây là liên kết giúp bạn thiết lập máy chủ Apache, Nginx và Node.js:

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

Sau đó, bạn nên đảm bảo rằng chế độ bộ định tuyến vue được đặt như sau:

vue-router phiên bản 2.x

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

Để rõ ràng, đây là tất cả các chế độ vue-router bạn có thể chọn: "băm" | "lịch sử" | "trừu tượng".


20

Đối với Vuejs 2.5 & vue-router 3.0, không có gì ở trên hoạt động với tôi, tuy nhiên sau khi chơi xung quanh một chút, những điều sau đây dường như hoạt động:

export default new Router({
  mode: 'history',
  hash: false,
  routes: [
  ...
    ,
    { path: '*', redirect: '/' }, // catch all use case
  ],
})

lưu ý rằng bạn cũng sẽ cần thêm đường dẫn bắt tất cả.


Điều này làm việc cho tôi không giống như các câu trả lời khác. Cảm ơn Adil!
Hugo S

10
window.router = new VueRouter({
   hashbang: false,
   //abstract: true,
  history: true,
    mode: 'html5',
  linkActiveClass: 'active',
  transitionOnLoad: true,
  root: '/'
});

và máy chủ được cấu hình đúng cách Trong apache, bạn nên viết lại url

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.html [L]
 </IfModule>

8

Trích dẫn các tài liệu.

Chế độ mặc định cho vue-router là chế độ băm - nó sử dụng hàm băm URL để mô phỏng một URL đầy đủ để trang sẽ không được tải lại khi URL thay đổi.

Để thoát khỏi hàm băm, chúng ta có thể sử dụng chế độ lịch sử của bộ định tuyến, sử dụng API history.pushState để đạt được điều hướng URL mà không cần tải lại trang:

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

Khi sử dụng chế độ lịch sử, URL sẽ trông "bình thường", ví dụ: http://oursite.com/user/id . Xinh đẹp!

Tuy nhiên, đây là một vấn đề: Vì ứng dụng của chúng tôi là ứng dụng phía máy khách, không có cấu hình máy chủ phù hợp, người dùng sẽ gặp lỗi 404 nếu họ truy cập http://oursite.com/user/id trực tiếp trong trình duyệt của họ. Bây giờ thì xấu xí.

Đừng lo lắng: Để khắc phục sự cố, tất cả những gì bạn cần làm là thêm một tuyến dự phòng bắt tất cả đơn giản vào máy chủ của bạn. Nếu URL không khớp với bất kỳ tài sản tĩnh nào, thì URL đó sẽ phục vụ cùng một trang index.html mà ứng dụng của bạn tồn tại. Đẹp, một lần nữa!


2

Việc vue-routersử dụng hash-mode, nói một cách đơn giản, đó là điều mà bạn thường mong đợi từ một thẻ đau như thế này.

<a href="#some_section">link<a>

Để làm cho hàm băm biến mất

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home,
  },
] // Routes Array
const router = new VueRouter({
  mode: 'history', // Add this line
  routes
})

Warning: Nếu bạn không có máy chủ được cấu hình đúng hoặc bạn đang sử dụng người dùng SPA phía máy khách có thể nhận được 404 Error nếu họ cố truy cập https://website.com/posts/3trực tiếp từ trình duyệt của họ. Vue Router Docs


0

Chế độ mặc định cho vue-router là chế độ băm - nó sử dụng hàm băm URL để mô phỏng một URL đầy đủ để trang sẽ không được tải lại khi URL thay đổi. Để thoát khỏi hàm băm, chúng ta có thể sử dụng chế độ lịch sử của bộ định tuyến, sử dụng history.pushStateAPI để đạt được điều hướng URL mà không cần tải lại trang:

import {routes} from './routes'; //import the routes from routes.js    

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

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

Rout.js

import ComponentName from './ComponentName';

export const routes = [
   {
      path:'/your-path'
      component:ComponentName
   }
]

Tài liệu tham khảo


2
Mặc dù mã này có thể cung cấp một giải pháp cho câu hỏi, tốt hơn hết là thêm ngữ cảnh vào lý do tại sao / cách thức hoạt động của nó. Điều này có thể giúp người dùng trong tương lai tìm hiểu và áp dụng kiến ​​thức đó vào mã của riêng họ. Bạn cũng có thể có phản hồi tích cực từ người dùng dưới dạng upvote, khi mã được giải thích.
borchvm

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.