Before deciding whether to use the <base>
tag or not, you need to understand how it works, what it can be used for and what the implications are and finally outweigh the advantages/disadvantages.
The <base>
tag mainly eases creating relative links in templating languages as you don't need to worry about the current context in every link.
You can do for example
<base href="${host}/${context}/${language}/">
...
<link rel="stylesheet" href="css/style.css" />
<script src="js/script.js"></script>
...
<a href="home">home</a>
<a href="faq">faq</a>
<a href="contact">contact</a>
...
<img src="img/logo.png" />
instead of
<link rel="stylesheet" href="/${context}/${language}/css/style.css" />
<script src="/${context}/${language}/js/script.js"></script>
...
<a href="/${context}/${language}/home">home</a>
<a href="/${context}/${language}/faq">faq</a>
<a href="/${context}/${language}/contact">contact</a>
...
<img src="/${context}/${language}/img/logo.png" />
Please note that the <base href>
value ends with a slash, otherwise it will be interpreted relative to the last path.
As to browser compatibility, this causes only problems in IE. The <base>
tag is in HTML specified as not having an end tag </base>
, so it's legit to just use <base>
without an end tag. However IE6 thinks otherwise and the entire content after the <base>
tag is in such case placed as child of the <base>
element in the HTML DOM tree. This can cause at first sight unexplainable problems in Javascript/jQuery/CSS, i.e. the elements being completely unreachable in specific selectors like html>body
, until you discover in the HTML DOM inspector that there should be a base
(and head
) in between.
A common IE6 fix is using an IE conditional comment to include the end tag:
<base href="http://example.com/en/"><!--[if lte IE 6]></base><![endif]-->
If you don't care about the W3 Validator, or when you're on HTML5 already, then you can just self-close it, every webbrowser supports it anyway:
<base href="http://example.com/en/" />
Closing the <base>
tag also instantly fixes the insanity of IE6 on WinXP SP3 to request <script>
resources with an relative URI in src
in an infinite loop.
Another potential IE problem will manifest when you use a relative URI in the <base>
tag, such as <base href="//example.com/somefolder/">
or <base href="/somefolder/">
. This will fail in IE6/7/8. This is however not exactly browser's fault; using relative URIs in the <base>
tag is namely at its own wrong. The HTML4 specification stated that it should be an absolute URI, thus starting with the http://
or https://
scheme. This has been dropped in HTML5 specification. So if you use HTML5 and target HTML5 compatible browsers only, then you should be all fine by using a relative URI in the <base>
tag.
As to using named/hash fragment anchors like <a href="#anchor">
, query string anchors like <a href="?foo=bar">
and path fragment anchors like <a href=";foo=bar">
, with the <base>
tag you're basically declaring all relative links relative to it, including those kind of anchors. None of the relative links are relative to the current request URI anymore (as would happen without the <base>
tag). This may in first place be confusing for starters. To construct those anchors the right way, you basically need to include the URI,
<a href="${uri}#anchor">hash fragment</a>
<a href="${uri}?foo=bar">query string</a>
<a href="${uri};foo=bar">path fragment</a>
where ${uri}
basically translates to $_SERVER['REQUEST_URI']
in PHP, ${pageContext.request.requestURI}
in JSP, and #{request.requestURI}
in JSF. Noted should be that MVC frameworks like JSF have tags reducing all this boilerplate and removing the need for <base>
. See also a.o. What URL to use to link / navigate to other JSF pages.
<a href='#anchor1'>Anchor1</a>
will use the base tag as well, overriding the default behavior of referring to the current page as the base. So that's definitely something to watch out for (though it could be fixed by using another base tag in pages that use lots of anchors). – Novel<base>
than you would think. – Wiencke