Перш ніж вирішити, використовувати <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. <base>
Тег в HTML зазначено , як НЕ мають кінцевий тег </base>
, так що це законно , щоб просто використовувати <base>
без закриває тега. Однак IE6 думає інакше , і весь вміст після в <base>
тезі в такому випадку поміщеного в якості дитини з <base>
елемента в дереві HTML DOM. Це може спричинити з першого погляду незрозумілі проблеми у Javascript / jQuery / CSS, тобто елементи, які є абсолютно недосяжними у конкретних селекторах, як html>body
, поки ви не виявите у інспектора HTML DOM, що між ними має бути base
(і head
).
Загальне виправлення IE6 використовує умовний коментар IE для включення кінцевого тегу:
<base href="http://example.com/en/"><!--[if lte IE 6]></base><![endif]-->
Якщо ви не переймаєтесь валідатором W3 або коли ви вже користуєтеся HTML5, то можете просто закрити його, кожен веб-браузер підтримує його все одно:
<base href="http://example.com/en/" />
Закриття <base>
тегу також миттєво фіксує божевільність IE6 на WinXP SP3 для запиту <script>
ресурсів з відносним URI в src
нескінченному циклі.
Інша потенційна проблема IE виявиться, коли ви використовуєте відносний URI в <base>
тезі, наприклад, <base href="https://stackoverflow.com//example.com/somefolder/">
або <base href="https://stackoverflow.com/somefolder/">
. Це не вдасться в IE6 / 7/8. Однак, це не зовсім помилка браузера; використання відносних URI в <base>
тегу саме по собі неправильно. Специфікація HTML4 зазначала, що він повинен бути абсолютним URI, таким чином, починаючи зі схеми http://
або https://
. Це було скинуто в специфікації HTML5 . Тож якщо ви використовуєте лише HTML5 та націлені веб-переглядачі, сумісні з HTML5, вам слід буде добре, використовуючи відносний URI у <base>
тезі.
Що стосується використання названих / хеш-фрагментів якорів на зразок <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}
основному перекладається на $_SERVER['REQUEST_URI']
PHP, ${pageContext.request.requestURI}
JSP та #{request.requestURI}
JSF. Помічено, що рамки MVC, такі як JSF, мають мітки, що зменшують всю цю котловую плиту і усувають необхідність <base>
. Дивіться також ао Яку URL-адресу використовувати для посилання / навігації на інші сторінки JSF .