visionmedia / page.js

Micro client-side router inspired by the Express router
http://visionmedia.github.com/page.js
7.67k stars 687 forks source link

hash change = 404 #564

Open dm-de opened 4 years ago

dm-de commented 4 years ago

hashbang mode is broken it do not accept valid changes and return '*' route

output context object:

​canonicalPath: "/#!/user/100" ​hash: "" ​page: Object { current: "//user/100", len: 2, _decodeURLComponents: true, … } ​params: Object { 0: "//user/100", path: "/#!/user/100", query: "" } ​path: "//user/100" ​pathname: "/#!/user/100" ​querystring: "" ​routePath: "(.*)" ​state: Object { path: "/#!/user/100" } ​title: "app" ​: Object { pushState: pushState(), save: save(), … }

As you can see - here is double slash at path - so it can never be correct after hash change - and only '*' ist valid

I was able to fix this: @ function Context(path, state, pageInstance)

if (hashbang) this.path = this.path.replace('#!', '') || '/'; change to: if (hashbang) this.path = this.path.replace('/#!', '') || '/';

But i do not know if this has other sideeffects

mset commented 4 years ago

I have come across the same issue.

mattfysh commented 3 years ago

😞 🐼

lagden commented 3 years ago

Do it:

page('/', () => {
    page.redirect('/page/1')
})
page('/notfound', console.log)
page('/page/:number', console.log)
page('*', ctx => {
    if (/^(\/\/)/.test(ctx.path)) {
        page.redirect(ctx.path.slice(1, ctx.path.length))
    } else {
        page.show('/notfound')
    }
})
page.start({hashbang: true})

That workaround avoid the problem! If you try set the URL via external link or using navigator address bar, will work!!