Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AngularJS: Hashbang URL keeps appending to itself on full refresh

I have an angularJS app, configured with the following:

$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('!');

So in modern browsers, it works with pushstate no problem, an example URL would be:

http://myapp.com/members

In older browsers, e.g. IE9, when I browse to that URL, it rewrites it as expected to:

http://myapp.com/members#!/members

Clicking any links from this point on uses the hashbang method, also correctly:

http://myapp.com/members#!/members/add

However...

If I full reload a page once it's on a hashbang rewritten url, it will keep appending the hash to itself. First refresh:

http://myapp.com/members#!/members#!/members#!%2Fmembers

.. and second refresh:

http://myapp.com/members#!/members#!/members#!%2Fmembers#!/members#!%2Fmembers%23!%2Fmembers%23!%2Fmembers

What is going on here that could be causing this? Usually it won't happen as people will navigate within the app and angular will handle the urls, but doing a full reload seems to break it. Thanks.

like image 710
Runcible Avatar asked May 30 '13 06:05

Runcible


2 Answers

Try setting

<base href="/" /> 

in the head? It may be an angular 1.1.5 bug/feature.

like image 100
laurelnaiad Avatar answered Oct 05 '22 23:10

laurelnaiad


Placing a <base> tag in your <head> seems to be the way to go...

<head>
    <base href="/">
</head>

...but there might be more that needs to be done. I set my $locationProvider to html5Mode too and got errors when I loaded my page.

myAngularModule.config($locationProvider =>
{
    $locationProvider.html5Mode({
        enabled: true,
        requireBase: false,
        rewriteLinks: false
    });
});

I also had to configure my server for html5Mode.

like image 27
Martin Avatar answered Oct 06 '22 00:10

Martin