Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit aef0980

Browse files
committedJun 25, 2013
fix($location): default to / for the url base if no base[href]
With the recent refactoring of $location service we changed this behavior resulting in a regression. Previously we thought that html5 mode always required base[href] to be set in order for urls to resolve properly. It turns out that base[href] is problematic because it makes anchor urls (#foo) to always resolve to the base url, which is almost always incorrect and results in all anchors links and other anchor urls (e.g. svg references) to be broken. For this reason, we should now start recommending that people just deploy to root context (/) and not set the base[href] when using the html5 mode (push/pop history state). If it's impossible to deploy to the root context then either all urls in the app must be absolute or base[href] must be set with the caveat that anchor urls in such app won't work. Closes #2762
1 parent 0960cd0 commit aef0980

File tree

2 files changed

+16
-3
lines changed

2 files changed

+16
-3
lines changed
 

‎src/ng/location.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ function stripFile(url) {
6969
return url.substr(0, stripHash(url).lastIndexOf('/') + 1);
7070
}
7171

72-
/* return the server only */
72+
/* return the server only (scheme://host:port) */
7373
function serverBase(url) {
7474
return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));
7575
}
@@ -497,12 +497,12 @@ function $LocationProvider(){
497497
function( $rootScope, $browser, $sniffer, $rootElement) {
498498
var $location,
499499
LocationMode,
500-
baseHref = $browser.baseHref(),
500+
baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''
501501
initialUrl = $browser.url(),
502502
appBase;
503503

504504
if (html5Mode) {
505-
appBase = baseHref ? serverBase(initialUrl) + baseHref : initialUrl;
505+
appBase = serverBase(initialUrl) + (baseHref || '/');
506506
LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;
507507
} else {
508508
appBase = stripHash(initialUrl);

‎test/ng/locationSpec.js

+13
Original file line numberDiff line numberDiff line change
@@ -635,6 +635,19 @@ describe('$location', function() {
635635
}
636636
);
637637
});
638+
639+
640+
it('should set appBase to serverBase if base[href] is missing', function() {
641+
initService(true, '!', true);
642+
inject(
643+
initBrowser('http://domain.com/my/view1#anchor1', ''),
644+
function($rootScope, $location, $browser) {
645+
expect($browser.url()).toBe('http://domain.com/my/view1#anchor1');
646+
expect($location.path()).toBe('/my/view1');
647+
expect($location.hash()).toBe('anchor1');
648+
}
649+
);
650+
});
638651
});
639652

640653

2 commit comments

Comments
 (2)

fessyfoo commented on Jun 27, 2013

@fessyfoo

also Closes #2799? Though I suggest also allowing setting of appBase from $locationProvider then an application can configure app base without using base[href], as suggested by @jeme in #2799

fessyfoo commented on Jun 28, 2013

@fessyfoo

A Note to those who build the bleeding edge to get this commit, and are also using $routeProvider. this commit and on contain a refactoring of the $routeProvider into it's own module. you'll have to add angular-route.js to your project and also add ngRoute as a dependency to your app.

This repository has been archived.