Przed podjęciem decyzji, czy użyć <base>
tagu, czy nie, musisz zrozumieć, jak to działa, do czego może być użyty i jakie są tego konsekwencje, a na koniec przeważyć zalety / wady.
<base>
Tag ułatwia głównie tworzenie względne linki w templating językach nie trzeba się martwić o obecnej sytuacji w każdym linkiem.
Możesz zrobić na przykład
<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" />
zamiast
<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" />
Uwaga: <base href>
wartość kończy się ukośnikiem, w przeciwnym razie zostanie zinterpretowana względem ostatniej ścieżki.
Jeśli chodzi o zgodność przeglądarki, powoduje to tylko problemy w IE. <base>
Tag HTML jest określona jako nie posiadające znacznik końcowy </base>
, tak to prawda tylko do użytku <base>
bez znacznika końcowego. Jednak IE6 myśli inaczej i cała zawartość po tym <base>
tagu jest umieszczony w takim przypadku, jak dziecko z <base>
elementu w drzewie DOM HTML. Może to powodować na pierwszy rzut oka niewyjaśnione problemy w Javascript / jQuery / CSS, tj. Elementy są całkowicie nieosiągalne w określonych selektorach html>body
, dopóki nie odkryjesz w inspektorze DOM HTML, że pomiędzy nimi powinien być base
(i head
).
Typowa poprawka IE6 używa komentarza warunkowego IE w celu dołączenia znacznika końcowego:
<base href="http://example.com/en/"><!--[if lte IE 6]></base><![endif]-->
Jeśli nie zależy ci na walidatorze W3 lub korzystasz już z HTML5, możesz go po prostu zamknąć, każdy przeglądarka internetowa i tak go obsługuje:
<base href="http://example.com/en/" />
Zamknięcie <base>
znacznika natychmiast naprawia również szaleństwo IE6 w WinXP SP3, aby żądać <script>
zasobów ze względnym URI w src
nieskończonej pętli.
Kolejny potencjalny problem IE pojawi się, gdy użyjesz względnego identyfikatora URI w <base>
znaczniku, takiego jak <base href="https://stackoverflow.com//example.com/somefolder/">
lub <base href="https://stackoverflow.com/somefolder/">
. To się nie powiedzie w IE6 / 7/8. Nie jest to jednak wina przeglądarki; używanie względnych identyfikatorów URI w <base>
znaczniku jest błędne. W specyfikacji HTML4 podano, że powinien to być bezwzględny identyfikator URI, zaczynając od schematu http://
lub https://
. Zostało to usunięte w specyfikacji HTML5 . Jeśli więc używasz tylko HTML5 i docelowych przeglądarek zgodnych z HTML5, wszystko powinno być w porządku, używając względnego identyfikatora URI w <base>
tagu.
Jeśli chodzi o stosowanie kotwic nazwanych / fragmentów mieszających, jak <a href="#anchor">
, kotwicowych ciągów znaków podobnych <a href="?foo=bar">
i kotwicowych fragmentów ścieżki podobnych <a href=";foo=bar">
, za pomocą <base>
znacznika zasadniczo deklarujesz wszystkie względne linki względem niego, w tym tego rodzaju kotwice. Żadne z odnośników relacyjnych nie jest już związane z bieżącym identyfikatorem URI żądania (jak by się to stało bez <base>
tagu). To może być przede wszystkim mylące dla początkujących. Aby zbudować te kotwice we właściwy sposób, w zasadzie musisz dołączyć identyfikator URI,
<a href="${uri}#anchor">hash fragment</a>
<a href="${uri}?foo=bar">query string</a>
<a href="${uri};foo=bar">path fragment</a>
gdzie w ${uri}
zasadzie tłumaczy się $_SERVER['REQUEST_URI']
na PHP, ${pageContext.request.requestURI}
JSP i #{request.requestURI}
JSF. Należy zauważyć, że frameworki MVC, takie jak JSF, mają znaczniki zmniejszające cały ten szablon i eliminujące potrzebę <base>
. Zobacz także m.in. Jakiego adresu URL użyć do połączenia / nawigacji do innych stron JSF .