在决定是否使用<base>
标签之前,您需要了解它的工作原理,可以用于什么以及其影响,并最终权衡利弊。
"
<base>
标签主要是为了在模板语言中轻松创建相对链接,因为您不需要在每个链接中担心当前上下文。
例如,您可以这样做:
"
<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" />
替代
<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" />
请注意
<base href>
的值以斜杠结尾,否则它将被解释为相对于最后一个路径。
关于浏览器兼容性,这只会在IE中出现问题。HTML中的
<base>
标签被规定为没有结束标签
</base>
,因此可以正常使用
<base>
而不需要结束标签。然而,IE6认为这是错误的,在这种情况下,
<base>
标签后面的整个内容将作为HTML DOM树中
<base>
元素的
子元素。这可能会导致在Javascript/jQuery/CSS中出现一些看似无法解释的问题,例如在特定选择器(如
html>body
)中完全无法访问元素,直到您在HTML DOM检查器中发现应该有一个
base
(和
head
)在其中。
常见的IE6修复方法是使用IE条件注释来包含结束标签:
<base href="http://example.com/en/"><!
如果您不关心W3验证器,或者您已经在使用HTML5,则可以直接自闭它,每个网络浏览器都支持此操作:
<base href="http://example.com/en/" />
关闭
<base>
标签还可以立即解决IE6在WinXP SP3上使用相对URI请求
<script>
资源时出现无限循环的
疯狂问题。
当您在
<base>
标签中使用相对URI(例如
<base href="//example.com/somefolder/">
或
<base href="/somefolder/">
)时,可能会出现另一个IE问题。这在IE6/7/8中会失败。但这并不完全是浏览器的错;在
<base>
标签中使用相对URI本身就是错误的。
HTML4规范指出它应该是绝对URI,因此以
http://
或
https://
方案开始。这在
HTML5规范中已经被删除。因此,如果您使用HTML5并仅针对HTML5兼容浏览器,则使用
<base>
标签中的相对URI应该没有问题。
关于使用命名/哈希片段锚点,如
<a href="#anchor">
,查询字符串锚点,如
<a href="?foo=bar">
和路径片段锚点,如
<a href=";foo=bar">
,使用
<base>
标签时,您基本上声明
所有相对链接相对于它,
包括那些锚点。没有任何相对链接再相对于当前请求URI(如果没有
<base>
标签就会发生)。这可能首先对新手来说有些困惑。为了正确构建这些锚点,您基本上需要包含URI。
<a href="${uri}#anchor">hash fragment</a>
<a href="${uri}?foo=bar">query string</a>
<a href="${uri};foo=bar">path fragment</a>
其中${uri}
在PHP中基本上相当于$_SERVER['REQUEST_URI']
,在JSP中相当于${pageContext.request.requestURI}
,在JSF中相当于#{request.requestURI}
。需要注意的是,像JSF这样的MVC框架有标签可以减少所有这些样板代码,并消除<base>
的必要性。另请参见要链接/导航到其他JSF页面使用哪个URL。
<a href='#anchor1'>Anchor1</a>
也将使用基本标签,覆盖默认的引用当前页面作为基本页面的行为。因此,这绝对是需要注意的问题(尽管可以通过在使用大量锚点的页面中使用另一个基本标签来修复)。 - Kzqai<base>
标签的人比你想象的多。 - Mathias Lykkegaard Lorenzen