Глава 10
В первой главе этого учебника, об общем построении html документа, я говорил о том, что все html документы должны иметь вот такой шаблон кода:
<html> — начало документа
<head> — начало головы
</head> — закрытие головы
<body> — начало тела
</body> — закрытие тела
</html> — конец документа
Где между тегами <body> </body> указывается информация предназначенная для вывода на экран в нужном нам виде, а между тегами <head> </head> исключительно служебная информация предназначенная для поисковых систем и браузеров тех или иных пользователей. Так что же это за информация такая и для чего она нужна? Отвечу, планомерно и порционально в этой главе.
С тегом <title> мы уже знакомы, с помощью него мы указываем имя документа в заголовке страницы. Теперь новый тег <meta> (закрывающего тега не требует) с помощью него мы и будем указывать эту самую служебную информацию на нашей страничке.
<meta> тег имеет следующие атрибуты:
- http-equiv — указывает браузеру как следует обработать основное содержание документа, точнее на основе каких данных.
- name — информационное имя. (применяется в паре с атрибутом content)
- content — информационное содержание, связанное с мета именем (name)
Теперь на примерах будем вникать в суть дела.
Кодировка символов и язык
Пример (очень нужный и важный):
<meta http-equiv=»Content-Type» Content=»text/html; Charset=Windows-1251″>
Сначала расскажу зачем необходима эта строка в заголовке html документа. Данная запись указывает браузеру кодировку в которой была написана данная страница — формат документа и раскладку клавиатуры, в данном случае это кириллица для Windows. Если эту строку не писать в заголовке страницы, то есть большая вероятность что весь текст на Вашей странице отобразится в виде непонятных человеку «иероглифов» у разных пользователей тех или иных браузеров. Конечно, пользователь может применить к такому документу команду в браузере Вид->Кодировка->Кириллица, но он может не знать о данной функции, да и зачем утруждать человека данным действием.
Теперь разберём по «слогам» нашу запись:
<meta http-equiv=»Content-Type» — указываем что в этом мета теге мы будем заниматься Content-Type — типом содержания
Content=»text/html; — а именно его текстом
Charset=Windows-1251″> — документ для Windows — Кириллица где 1251 кодировка раскладки клавиатуры, так например Английская клавиатура будет задаваться Charset=Windows-1252
В настоящее время продвинутые веб-мастера рекомендуют использовать кодировку UTF 8
То есть писать в голове документа вот так:
<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″>
Пример:
<meta http-equiv=»Content-Language» Content=»ru»>
В этой строчке говорится о том что язык Language документа является русским Content=»ru»
Неправильная установка языка и раскладки клавиатуры может привести к печальным последствиям.
Информация о документе
Пример:
<meta name=»author» Content=»Остап Бендер»>
<meta name=»copyright» Content=»»Рога и копыта» Остап Бендер»>
Данные метаописатели предназначены для заявления об авторских правах непосредственно в заголовке html кода, так name=»author» указывает имя автора страницы, а name=»copyright» авторское право (копирайт) в котором может указываться фамилия, имя, отчество автора сайта, название фирмы, бренда.. и т. д. Кроме того включив в заголовок документа такое описание Вы значительно упростите задачу поисковой машине при поиске Вашего сайта по имени автора, названию фирмы, бренду…
Пример:
<meta name =»Generator» Content=»Microsoft Notepad»>
Если хотите можете указать с помощью какого html редактора была написана данная страница.
Описание страницы и ключевые слова
Пример:
<meta name=»description» Content=»Производим закупку по выгодным ценам рогов и копыт!»>
Description — краткое описание страницы. Данное описание частенько используется поисковыми системами для вывода в результатах поиска, по какому либо запросу, информации о сайте и его назначении.
Пример:
<meta name=»keywords» Content =»рога, копыта, рожки, рог, копыто, копытце, закупка, покупка, приобретение, выгодно, продать, купить, сбыть, реализовать, корова, бык, коровьи, бычьи, оплата, деньги, наличные, цена, цене»>
Keywords — ключевые слова веб-страницы, опять таки предназначены для поисковых машин.
Представьте что Вы ищете в какой либо поисковой системе сайт с информацией о том где можно продать те же рога и копыта Какие слова и фразы Вы будите вводить в строке «Поиск»? ну наверно что то типа: «Где продать коровьи рога?» или «Реализовать копыта по выгодной цене» Так вот если определить ключевые слова и так сказать предугадать мысли потенциального посетителя можно надеяться на то, что та или иная поисковая система выдаст ссылку на Ваш сайт в первых строчках результата поиска. Конечно ввод данного метоописателя не есть гарант того что именно Ваш сайт займет первые места в поиске по данным словам, но всё же не стоит им пренебрегать. Впрочем, оптимизация и раскрутка сайта это отдельная тема для разговора.
Помните что описание description не должно превышать по длине более 200 символов, а ключевые слова keywords 1000 символов, иначе это может пагубно отразится при продвижении Вашего сайта в ТОП поисковых систем.
Адрес
Пример:
<meta name=»Publisher-Email» Content=»Ваш_e-mail@сервер.домен»>
<meta name=»Publisher-URL» Content=»http://www.Ваш_сайт/»>
Думаю понятно.. здесь указывается адрес Вашего почтового ящика Publisher-Email и адрес сайта Publisher-URL
Обновление страницы
Пример:
<meta name =»revisit-after» Content=»15 days»>
Если некая страница на Вашем сайте подразумевает постоянное обновление и/или дополнение информационным содержанием, то хорошо было бы включить данное описание в заголовок данной страницы. Такое введение позволит программе роботу своевременно посещать Ваш сайт и индексировать его содержание. В нашем примере мы заявили о том, что собираемся обновлять содержание на странице не менее одного раза в 15 дней, можете не сомневаться программа робот возьмет Ваши планы себе на заметку и будет приходить «к Вам в гости» раз в пятнадцать дней, для того чтобы проверить ничего ли у Вас не изменилось..
Время действия документа и кэш
Пример:
<meta http-equiv=»expires» content=»Sun, 24 jan 2010 12:28:36 GMT+03:00″>
Для того чтобы ускорить загрузку страницы, а так же сэкономить трафик современные браузеры сохраняют посещаемые пользователем страницы в кэш (на жёсткий диск), и при повторном посещении загружают их не с сервера, а непосредственно с кэша. На самом деле такая функция хороша собой.. но есть одно «но», дело в том что в браузере может отображаться уже устаревшая информация, какой либо страницы. Представьте, к примеру, Ваш сайт представляет собой некое периодическое новостное интернет издание, а пользователь получит, вместо самых свежих новостей, уже устаревшую информацию, ту которая хранится у него в кэше!! и не разобравшись в чем «беда» примет Ваш сайт за «мертвый» заброшенный и никем не обновляемый.
Для того чтобы принудительно заставить браузер загружать ту или иную страницу не с жёсткого диска, а с сервера необходим мета тег с данным синтаксисом, где указывается день недели, число месяц год время (чч:мм:сс) и часовой пояс(GMT+03:00 — время Московское + три часа). День недели и время дня можно не указывать. Теперь при чтении страницы браузером страница будет грузится с сервера, если указанная дата и время настало или просрочено, и напротив из кэша если указанное время еще не наступило.
Ниже на всякий случай приведены таблицы сокращений от Английских слов на месяцы и дни недели
|
|
Атрибуту content можно присвоить значение «0» <meta http-equiv=»Expires» content=»0″> в этом случае страница всегда будет загружаться с сервера.
И еще.. некоторые поисковые роботы могут отказаться индексировать документ с заведомо устаревшей датой. — не искушайте судьбу..
Пример:
<meta http-equiv=»pragma» content=»no-cache»>
А такая запись вовсе запретит браузеру кэшировать данную страницу.
Команды для робота
Пример:
<meta name=»robots» content=»Index,follow»>
Данный мета тег предназначен для подачи поисковому роботу той или иной команды.
Список возможных команд роботу:
- Index — индексировать страницу
- Noindex — не индексировать страницу
- Follow — прослеживать гиперссылки на странице
- Nofollow — не прослеживать гиперссылки на странице
- All — индексировать страницу и прослеживать гиперссылки на странице (по умолчанию)
- None — не индексировать страницу и не прослеживать гиперссылки на странице
Автоматический переход на другую страницу
Пример:
<meta http-equiv=»Refresh» content=»10; URL=http://www.mysite/index.html»>
Если вдруг по каким либо причинам Вы задумаете поменять URL адрес Вашего сайта то хорошо было бы на старом месте оставить страницу вроде этой:
<html>
<head>
<meta http-equiv=»Content-Type» Content=»text/html; Charset=Windows-1251″>
<meta http-equiv=»Refresh» content=»10; URL=http://www.mysite/index.html»>
<title>Переадресация</title>
</head>
<body>
<font size=»+1″>
Адрес сайта был изменен, через 10 секунд Ваш браузер будет автоматически перенаправлен по новому адресу:<br>
<a href=»http://www.mysite.ru/index.html»><b>http://www.mysite.ru/</b></a><br>
Нажмите <a href=»http://www.mysite.ru/index.html»>здесь</a> для того чтобы выполнить переход немедленно.<br>
Приносим извинения за доставленные неудобства.
</font>
</body>
</html>
Разберём и осмыслим строчку из примера:
<meta http-equiv=»Refresh» content=»10; URL=http://www.mysite/index.html»>
meta http-equiv=»Refresh» — Refresh (восстановление) указывает браузеру что данную страницу необходимо обновить
content=»10; — обновить через заданное количество секунд (в нашем случае десять)
URL=http://www.mysite/index.html»— адрес новой/другой страницы на которую следует перейти.
Пример:
<meta http-equiv=»Refresh» content=»30″>
А вот если в заголовке Refresh URL адрес упустить, как показано в примере, то тогда браузер будет постоянно через каждые 30 секунд (ну или не 30.. сколько пропишите через столько и будет..) обновлять содержимое данной страницы.
Такой метод широко используется в новостных лентах, где информация идет так сказать потоком и требует постоянного обновления.
Эффекты при переходе по ссылке
Пример:
<meta http-equiv =»Page-Enter» Content=»RevealTrans(Duration=1.0, Transition=0)»>
<meta http-equiv =»Page- Exit » Content=»RevealTrans(Duration=3.0, Transition=23)»>
Данные заголовки создают визуальные эффекты при переходе с одной страницы на другую.
- Page-Enter — Эффект появления страницы
- Page- Exit — Эффект исчезновения страницы
В которых:
- Duration — время действия эффекта в секундах
- Transition — Один из номеров предлагаемых эффектов (от 0 до 23) перечисленных в таблице:
Номер | Описание эффекта | Номер | Описание эффекта |
---|---|---|---|
0 | Прямоугольники внутрь | 12 | Растворение |
1 | Прямоугольники наружу | 13 | Вертикальная панорама внутрь |
2 | Круг внутрь | 14 | Вертикальная панорама наружу |
3 | Круг наружу | 15 | Горизонтальная панорама внутрь |
4 | Наплыв наверх | 16 | Горизонтальная панорама наружу |
5 | Наплыв вниз | 17 | Уголки влево — вниз |
6 | Наплыв вправо | 18 | Уголки влево — вверх |
7 | Наплыв влево | 19 | Уголки вправо – вниз |
8 | Вертикальные жалюзи | 20 | Уголки вправо – вверх |
9 | Горизонтальные жалюзи | 21 | Случайные горизонтальные полосы |
10 | Шажки горизонтальные | 22 | Случайные вертикальные полосы |
11 | Шажки вертикальные | 23 | Случайный выбор эффекта |
Пример:
Файл page1.html
<html>
<head>
<meta http-equiv=»Content-Type» Content=»text/html; Charset=Windows-1251″>
<meta http-equiv =»Page-Enter» Content=»RevealTrans(Duration=1.0, Transition=12)»>
<title>Эффекты перехода страниц</title>
</head>
<body bgcolor=»#c5ffa0″>
<center>
<h2>На заметку:</h2>
<font size=»+1″>Эффекты перехода с одной страницы на другую работают не во всех браузерах.</font><hr><br>
<font size=»+1″>Нажмите на «Перейти» чтобы перейти к следующей странице<br>
и оценить эффект перехода от одной странице к другой.</font><br><br>
<a href=»page2.html»><font size=»+2″>»Перейти»</font></a>
</center>
</body>
</html>
Файл page2.html
<html>
<head>
<meta http-equiv=»Content-Type» Content=»text/html; Charset=Windows-1251″>
<meta http-equiv =»Page-Enter» Content=»RevealTrans(Duration=2.0, Transition=23)»>
<title>Эффекты перехода страниц</title>
</head>
<body bgcolor=»#c0e4ff»>
<center>
<h2>На заметку:</h2>
<font size=»+1″>Эффекты открытия и закрытия веб-страниц будут видны только при переходе <br>
от одной страницы к другой или же при помощи кнопок «назад» «вперёд». <br>
При первом открыти страницы, а также во время перезагрузки<br>
эффекты перехода видны не будут.</font><hr><br>
<font size=»+1″>Нажмите на «Перейти» чтобы перейти к следующей странице<br>
и оценить эффект перехода от одной странице к другой.</font><br><br>
<a href=»page1.html»><font size=»+2″>»Перейти»</font></a>
</center>
</body>
</html>
Полезные советы:
-
Ещё раз напомню о том что мета теги стоит применять умело и грамотно особенно это касается команд для робота и кодировки символов, иначе весь Ваш труд может пойти насмарку..
-
Заголовок Refresh (автоматический переход на другую страницу) можно использовать не совсем стандартно.. Некоторые авторы используют его для создания своего рода «презентации» слайд шоу, где сменяющиеся страницы и есть кадры презентации. Представьте заходит человек на такой сайт а тут ему «Откинетесь на спинку кресла и расслабьтесь..»:) а далее сами по себе пошли картинки, графики, тексты.. а последняя страница тупиковая где пользователь берёт сайт «в свои руки» или же может замыкаться на первую. Только всегда помните о золотом правиле веб-мастера: Главное не переборщить!
От автора: вопрос кодировок является, без сомнения, одним из актуальных вопросов рано или поздно встающим перед любым веб-мастером. Практически каждый из нас сталкивался с такой, порой довольно неприятной, проблемой, как проблема корректного отображения информации на сайте, т.е. вывод ее на экран в нужной нам кодировке. Несмотря на то, что этот вопрос почти всегда решается очень легко, и ничего сложного в нем нет. Сейчас в сети можно часто увидеть вопросы о всевозможных «кракозябрах, вопросах и ромбиках» на сайте.
1. Кодировка при работе без использования баз данных
Забегая вперед, давайте сразу сформулируем основной тезис, придерживаясь которого мы значительно облегчим себе работу:
Кодировка в Вашем проекте должна быть универсальной.
Какое значение вкладывается в этот термин — «универсальная»? Это значит, что все составляющие создаваемого проекта, которые так или иначе касаются кодировок, должны иметь единую кодировку. Чтобы понять эту мысль разобьем сформулированный тезис на пункты, которые затем поэтапно разберем:
1. Содержимое всех файлов должно иметь единую кодировку.
2. Заголовки должны передавать единую кодировку.
3. В качестве кодировки сервера необходимо установить единую кодировку.
4. Кодировка соединения с БД также не должна отличаться от кодировки создаваемого проекта.
Это 4 основных правила, которые и являются составляющими сформулированного тезиса. Давайте теперь разберем каждый из этих пунктов.
Итак, на сервере создадим файл index.php, содержимое которого сохраним в кириллической кодировке. Сделать это можно, например, в редакторе Notepad++ через пункт меню Кодировки.
Узнать текущую кодировку файла можно взглянув в строку состояния редактора (в нижней панели).
Здесь уместно дать небольшой совет. При создании сайтов лучше пользоваться одной из двух кодировок: кириллической (windows-1251) или юникод без сигнатуры BOM (utf-8 without BOM). При этом следует знать, что юникод более универсален. Эта кодировка содержит большее количество символов, а потому идеально подойдет для мультиязычных сайтов, в то время как с кириллической кодировкой здесь могут возникнуть проблемы. Есть еще ряд нюансов при использовании юникода. В общем, лучше использовать ту кодировку, которая более универсальна, но если Ваш сайт содержит только кириллические символы, то никто не запрещает использовать Вам windows-1251, тем более, что она также имеет свои плюсы (детальнее об этом, возможно, в одном из следующих уроков).
Отлично, кодировка нашего файла кириллическая (windows-1251). У всех остальных файлов проекта, согласно первому пункту, кодировка должна быть аналогичной. В мета-тегах (между тегами head) также укажем эту кодировку:
<meta http—equiv=«content-type» content=«text/html; charset=windows-1251» /> |
Выведем какой-нибудь текст кириллицей на страницу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»> <html xmlns=«//www.w3.org/1999/xhtml»> <head> <meta http—equiv=«content-type» content=«text/html; charset=windows-1251» /> <meta name=«keywords» content=«» /> <meta name=«description» content=«» /> <title>Кодировки</title> <link href=«» rel=«stylesheet» type=«text/css» /> </head> <body> <p>Тестовая строка</p> </body> </html> |
Сохраним файл и попробуем открыть его в браузере… На экран выводится нечитабельная строка — набор вопросительных знаков вместо букв.
Почему так? Ведь мы сохранили файл в кириллической кодировке, в мета-теге также прописали нужную кодировку, но это не помогло. Если мы взглянем, в какой именно кодировке браузер отобразил нам текст, то увидим UTF-8.
При этом если мы выставим в браузере вручную нужную нам кодировку, то текст станет читабельным, но… до следующего обновления страницы в браузере. Еще раз зададимся вопросом, почему так произошло? Почему браузер никак не отреагировал на кодировку указанную в мета-теге?
«Виноват» здесь не браузер, а сервер. Дело в том, что сервер отсылает в браузер так называемые заголовки, где указывается кодировка, в которой браузер должен отобразить содержимое файла. В качестве кодировки сервер берет кодировку по умолчанию, т.е. так называемую дефолтную кодировку сервера. Посмотреть дефолтную кодировку сервера можно в конфигурационном файле httpd.conf, расположенном на сервере в каталоге usr\local\apache\conf\. Здесь кодировка задается в строке AddDefaultCharset. Здесь же мы можем изменить кодировку на нужную нам, при этом не забывая после внесения изменений перезапускать сервер.
Но изменить кодировку получится только на локальном сервере. На сервере в сети хостер нам просто не даст доступ к конфигурационному файлу сервера… и правильно сделает 🙂 Что же нам делать в таком случае? Неужели придется подстраиваться под настройки сервера? Конечно же нет. Для решения этой задачи существует 2 варианта, отвечающих за второй и третий сформулированные нами выше пункты.
Согласно второму пункту мы можем самостоятельно передать в заголовках необходимую кодировку. Делается это при помощи функции header(), в параметрах которой мы укажем тип документа и, собственно, кодировку. В самом верху файла (перед объявлением доктайпа (типа документа)) добавим строку кода:
<?php header(«Content-type: text/html; Charset=windows-1251»); ?> |
Если теперь обновить страницу в браузере, то увидим читабельный текст в кириллической кодировке. Замечательно — мы решили задачу! Путем передачи заголовков мы указали нужную нам кодировку. Но этот вариант не совсем универсален. Дело в том, что заголовки передаются посредством функции header(), т.е. для этого мы используем средства PHP. Но что же тогда делать, если файлы нашего проекта имеют расширение html? В файлах с таким расширением по умолчанию код PHP не выполняется, соответственно — заголовки не будут отправлены. Результат — вновь нечитабельный текст в браузере.
Альтернативой является второе решение (пункт 3), которое гораздо более универсальнее первого. Итак, согласно пункта 3 мы должны установить дефолтной кодировкой сервера нужную нам. Но как это можно сделать, если к конфигурационному файлу сервера мы доступа не имеем? Очень просто. Предусмотрен специальный файл, в котором можно изменять некоторые настройки сервера, в частности — дефолтную кодировку. Файл этот не имеет расширения и называется .htaccess (с точкой в начале имени файла). В самом файле достаточно прописать ту же строку, что и в конфигурационном файле сервера, но с указанием необходимой кодировки:
AddDefaultCharset windows—1251 |
Сервер при этом перезапускать не нужно, поскольку фактически мы ничего не изменяем в его настройках, а просто «говорим» серверу, что в качестве дефолтной кодировки следует использовать ту, которую мы только что указали.
Теперь файлы открываются в «правильной» (нужной нам) кодировке (функцию header() теперь нет надобности использовать) и кодировка нашего проекта не будет зависеть от настроек сервера того или иного хостера.
Но помните, если мы нарушим сформулированный нами тезис об универсальности кодировки и, к примеру, при установленной в качестве дефолтной кодировки кириллице перекодируем содержимое файлов в юникод, то получим знаменитые «кракозябры».
2. Проблема кодировки при работе с базой данных
Теперь взглянем на ту же проблему, но с использованием в работе БД. Дело в том, что в таблицах БД лежит текст, и эти таблицы также могут иметь свою кодировку. Поскольку я использую в качестве сервера Денвер, который настроен под кириллическую кодировку, то логично, что для хранения информации в БД по умолчанию используется также кириллическая кодировка.
Не будем ничего изменять в настройках и при создании БД и таблицы оставим все как есть, т.е. будет использована кириллическая кодировка. Хотя, забегая вперед, можно сказать, что если бы мы создали таблицы в нужной нам кодировке, то это совсем не означает, что данные будут выведены в этой же кодировке… вся хитрость в том, что здесь существует такой параметр, как кодировка соединения с БД. Вот ее то мы и будем использовать для достижения нужного результата.
Итак, создадим файл с кодировкой юникод (поскольку мы заранее знаем, что данные из БД будут выведены в кириллической кодировке), т.е. мы таким образом поставили перед собой в учебных целях проблему, которую и попытаемся решить… как говорится, тяжело в учении… 🙂
При создании файла не забудем передать в заголовках нужную нам кодировку, поскольку в файле .htaccess указана сейчас кириллическая кодировка, но мы хотим, чтобы новый файл работал корректно в юникоде:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php header(«Content-type: text/html; Charset=utf-8»); ?> <!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Strict//EN» «//www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»> <html xmlns=«//www.w3.org/1999/xhtml»> <head> <meta http—equiv=«content-type» content=«text/html; charset=utf-8» /> <meta name=«keywords» content=«» /> <meta name=«description» content=«» /> <title>Кодировка при работе с БД</title> <link href=«» rel=«stylesheet» type=«text/css» /> </head> <body> </body> </html> |
Теперь создадим БД charset и в ней таблицу test с двумя полями:
id, тип INT, первичный ключ, автоинкремент;
text, тип VARCHAR, длина 255.
В таблицу поместим единственную запись в поле text:
Эту запись мы и будем выводить на экран. Для этого пропишем соединение с сервером MySQL, выберем БД для работы и запросом выберем необходимые данные (все это мы уже проделывали в ряде предыдущих уроков, а потому подробно останавливаться на объяснении всего этого — нет оснований):
<?php header(«Content-type: text/html; Charset=utf-8»); mysql_connect(«localhost», «root», «») or die(«Can’t connect to server»); mysql_query(«SET NAMES ‘utf8′») or die(«Can’t set charset»); mysql_select_db(«charset») or die(«Can’t select DB»); $res = mysql_query(«SELECT `text` FROM `test` WHERE `id`=». 1) or die(mysql_error()); $row = mysql_fetch_assoc($res); ?> |
Теперь в массиве $row мы имеем искомую строку. Давайте выведем ее в теле страницы (между тегами body):
<?php echo $row[‘text’]; ?> |
Если сейчас открыть страницу в браузере, то увидим опять-таки вместо читабельного текста вопросительные знаки. Так произошло оттого, что браузер (согласно отосланных заголовков) открыл страницу в юникоде, но информация из БД достается в кириллической кодировке. Как это исправить? Очень просто — достаточно после соединения с сервером БД указать в запросе кодировку соединения, тогда данные из БД будут отдаваться в искомой кодировке.
Пропишем необходимый запрос после соединения:
mysql_connect(«localhost», «root», «») or die(«Can’t connect to server»); mysql_query(«SET NAMES ‘utf8′») or die(«Can’t set charset»); |
Теперь после обновления страницы информация выводится корректно.
Вот и вся хитрость.
Заключение
Стоит обратить внимание на отличия в именовании кодировок в MySQL от традиционного их именования, т.е. того, к которому мы привыкли. Например, указать юникод правильно так — «utf8», но не так — «utf-8». Второй вариант серверу MySQL будет непонятен. Аналогично с кириллицей: правильно так — «cp1251», но не так — «windows-1251».
На этом наш урок подходит к концу. Теперь, если Вы будете использоваться в своей работе озвученные выше правила, то проблем с кодировками у вас будет гораздо меньше.
Надеюсь, данный урок был полезен для Вас. Если у Вас остались какие-либо вопросы, то я с удовольствием отвечу на них в комментариях.
Автор: Кудлай Андрей
Редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.
Кодировки и веб-страницы
Время на прочтение
4 мин
Количество просмотров 29K
Возвращаясь к избитой проблеме с кодировками русских букв, хотелось бы иметь под рукой некий единый справочник или руководство, в котором можно найти решения различных сходных ситуаций. В своё время сам перелопатил множество статей и публикаций, чтобы находить причины ошибок. Задача этой публикации — сэкономить время и нервы читателя и собрать воедино различные причины ошибок с кодировками в разработке на Java и JSP и способы их устранения.
Варианты решения могут быть не единственными, охотно добавлю предложенные читателем, если они будут рабочими.
Итак, поехали.
1. Проблема: при получении разработанной мной страницы браузером весь русский текст идёт краказябрами, даже тот, который забит статически.
Причина: браузер неверно определяет кодировку текста, потому что нет явного указания.
Решение: явно указать кодировку:
a) HTML: добавляем тэг META в хидер страницы:
[\< meta http-equiv="Content-Type" content="text/html; charset=cp1251"\>]
б) XML: указываем кодировку в заголовке:
[<?xml version="1.0" encoding="cp1251"?>]
в) JSP — задаём тип контента в заголовке:
[<%@ page language="java" contentType="text/html;charset=cp1251"%>]
г) JSP — задаём кодировку возвращаемой страницы
[<%@ page pageEncoding="cp1251"%>]
д) Java — устанавливаем хидер ответа:
[response.setCharacterEncoding("cp1251");]
[response.setContentType("text/html;charset=cp1251");]
2. Проблема: написанный в JSP-странице статический русский текст почему-то идёт краказабрами, хотя кодировка страницы задана.
Причина: статический текст был написан в кодировке, отличной от заданного странице.
Решение: изменить кодировку в редакторе (например, для AkelPad нажимаем «Сохранить как» и выбираем нужную кодировку).
3. Проблема: получаемый из запроса текст идёт кракозябрами.
Причина: кодировка запроса отличается от используемой для его обработки кодировки.
Решение: установить кодировку запроса или перекодировать в нужную.
а) Java, со стороны отправителя не задана нужная кодировка — перекодируем в нужную:
[String MyParam= new String(request.getParameter("MyParam").getBytes("ISO-8859-1"),"cp1251");]
Примечание: кодировка ISO-8859-1 устанавливается по умолчанию, если не была задана другая.
б) Java, со стороны отправителя задана нужная кодировка — устанавливаем кодировку запроса:
[request.setCharacterEncoding("cp1251");]
4. Проблема: отправленный GET-параметром русский текст при редиректе приходит кракозябрами.
Причина: упаковка русского текста в URI по умолчанию идёт в ISO-8859-1.
Решение: упаковать текст в нужной кодировке вручную.
а) JSP, URLEncoder:
[<%@ page import="java.net.URLEncoder"%>
<%response.sendRedirect("targetPage.jsp?MyParam="+URLEncoder.encode("Русский текст","cp1251"));%>]
5. Проблема: текст из базы данных читается кракозябрами.
Причина: кодировка текста, прочитанного из базы данных, отличается от кодировки страницы.
Решение: установить соответствующую кодировку страницы, либо перекодировать полученные из базы данных значения.
а) Java, перекодирование считанной в db_string базы данных строки:
[String MyValue = new String(db_string.getBytes("utf-8"),"cp1251");]
6. Проблема: текст записывается в базу данных кракозябрами, хотя на странице отображается правильно.
Причина: кодировка записываемой строки отличается от кодировки сессии работы с базой данных, либо от кодировки базы данных (стоит помнить, что они не всегда совпадают).
Решение: установить необходимую кодировку сессии или перекодировать строку.
а) Java, перекодирование записываемой строки db_string в кодировку сессии или базы данных:
[String db_string = new String(MyValue.getBytes("cp1251"),"utf-8");]
б) Java, MySQL, настройка параметров подключения в строке dburl, передаваемой функции коннекта:
[dburl += "?characterEncoding=cp1251";]
в) MySQL, настройка параметров подключения в XML-описателе контекста, добавляем атрибут к тегу \<Resource\>:
[connectionProperties="useUnicode=no;characterEncoding=cp1251;"]
г) MySQL, прямая установка кодировки сессии вызовом SET NAMES (connect — объект подключения Connection):
[CallableStatement cs = connect.prepareCall("set names 'cp1251'");
cs.execute();]
7. Проблема: если ничего не помогло…
Решение: всегда остаётся самый «топорный» метод — прямое перекодирование.
а) Для известной кодировки источника:
[String MyValue = new String(source_string.getBytes("utf-8"),"cp1251");]
б) Для параметра запроса:
[String MyValue = new String(request.getParameter("MyParam").getBytes(request.getCharacterEncoding()),"cp1251");]
Дополнение, или что нужно знать:
1. Кодировки базы данных и сессии подключения могут различаться, в зависимости от конкретной СУБД и драйвера. К примеру, при подключении к MySQL стандартным драйвером com.mysql.jdbc.Driver без явного указания кодировка сессии устанавливалась в UTF-8, несмотря на другую кодировку схемы БД.
2. Кодировка упаковки строки запроса в URI по умолчанию устанавливается в ISO-8859-1. С подобным можно столкнуться, например, при передаче явно заданного текста в редиректе с одной страницы на другую.
3. Взаимоотношения кодировок страницы, базы данных, сессии, параметров запроса и ответа не зависят от языка разработки и описанные для Java функции имеют аналоги для PHP, Asp и других.
Примечание: восстановить ссылки на источники нет возможности, все примеры взяты из собственного кода, хотя когда-то так же выискивал их по многочисленным форумам.
Надеюсь, этот небольшой обзор поможет начинающим веб-программистам сократить время отладки и сберечь нервы.
Метатеги используются для хранения информации предназначенной для браузеров
и поисковых систем. Например, механизмы поисковых систем обращаются к метатегам
для получения описания сайта, ключевых слов и других данных.
Метатеги для поисковых механизмов
Среди разработчиков сайтов существует мнение, что правильно написанные
метатеги позволяют подняться к верхним строчкам поисковых серверов.
На самом деле это не так, на одних метатегах высоко не поднимешься,
но и неудачно выполненное содержимое метатегов может ухудшить рейтинг
сайта.
Два метатега предназначены специально для поисковых серверов: description
(описание) и keywords (ключевые слова). Некоторые
вебмастера добавляли в раздел keywords ключевые
слова, которые не имеют никакого отношения к теме сайта, но зато пользовались
определенным успехом среди посетителей поисковиков. Однако, через некоторое
время, поисковые системы научились бороться с таким явлением и проверяют содержимое
веб-страницы на соответствие заявленным ключевым словам.
Некоторые принципы, относящиеся к метатегам:
- не включайте ключевые слова, которые не содержатся на ваших страницах;
- не повторяйте ключевые слова;
- используйте метатеги по их прямому назначению;
- делайте описание и список ключевых слов различными для каждой страницы
сайта с учетом содержимого.
description
Большинство поисковых серверов отображают содержимое поля description
(пример 1) при выводе результатов поиска.
Если этого тега нет на странице, то поисковый движок просто перечислит первые
встречающиеся слова на странице, которые, как правило, оказываются не очень-то
и в тему.
Пример 1. Использование Description
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>description</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="description" content="Сайт об HTML и создании сайтов">
</head>
<body>
<p>...</p>
</body>
</html>
keywords
Этот метатег был предназначен для описания ключевых слов, встречающихся на
странице (пример 2). Но в результате действия людей, желающих попасть в
верхние строчки поисковых систем любыми средствами, теперь дискредитирован.
Поэтому многие поисковики пропускают этот параметр.
Пример 2. Использование Keywords
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>keywords</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Keywords" content="HTML, META, метатег, тег, поисковая система">
</head>
<body>
<p>...</p>
</body>
</html>
Ключевые слова можно перечислять через пробел или запятую. Поисковые системы
сами приведут запись к виду, который они используют.
Автозагрузка страниц
Чтобы автоматически загружать новый документ через определенный промежуток
времени используется инструкция http-equiv=»refresh»
(пример 3).
Пример 3. Автозагрузка страницы
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Автозагрузка</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="refresh" content="5; URL=http://www.htmlbook.ru">
</head>
<body>
<p>...</p>
</body>
</html>
Браузер поймет эту запись, как ожидать 5 секунд, а затем загрузить новую страницу,
указанную в параметре URL, в данном случае это переход на сайт htmlbook.ru.
Этот метатег позволяет создавать перенаправление (редирект) на другой сайт.
Если URL не указан, произойдет автоматическое обновление текущей страницы через
количество секунд, заданных в атрибуте content.
Кодировка
Чтобы сообщить браузеру, в какой кодировке находятся символы веб-страницы,
необходимо установить параметр <meta http-equiv=»Content-Type»
content=»text/html; charset=имя кодировки»>. Для операционной системы
Windows и кириллицы charset обычно принимает
значение utf-8 или windows-1251 (пример 4).
Пример 4. Выбор текущей кодировки
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Кодировка</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<p>Кириллица</p>
</body>
</html>
Если указание кодировки отсутствует, браузер пытается сам определить, какой
тип символов используется в документе и выбирает необходимую кодировку автоматически.
Браузер не всегда может точно распознать язык веб-страницы и в некоторых случаях
предлагает вьетнамскую кодировку вместо кириллицы. По этой причине лучше всегда
указывать приведенную строчку. Тем не менее, возникают обстоятельства, когда
указание кодировки может принести определенный вред. Например, веб-сервер автоматически
использует перекодирование данных в KOI-8, а браузер, встретив параметр charset=windows-1251,
переводит текст в кодировку Windows. Получается двойное изменение символов,
прочитать такой текст не просто. К счастью, подобная проблема уже отходит в
прошлое, во всяком случае, ее легко можно выявить и нейтрализовать на уровне
сервера.
Введение
Мета-теги располагаются в заголовке HTML-документа, между тегами <HEAD> и </HEAD>, а потому они остаются невидимы для читателя страницы. Предназначены они для включения информации о документе, которая используется разными агентами (сервером, броузерами, поисковыми роботами) в различных целях. Элементы META предоставляют дополнительные сведения о способе обработки документа броузером, позволяют поисковым роботам обрабатывать документ без его загрузки. В документе может находиться любое количество мета тегов, но многие из них не несут никакой полезной информации с точки зрения агентов и игнорируются ими. Необходимыми, на мой взгляд, тегами являются только Keywords и Description. Однако, следует приглядеться и к остальным представителям семейства META.
Синтаксис
В meta-тегах используются два атрибута — NAME и HTTP-EQUIV. Это разделение связано с синтаксисом <META NAME=»имя» CONTENT=»значение«> и, соответственно, <META HTTP-EQUIV=»имя» CONTENT=»значение«> (названия тегов, имена и значения атрибутов нечувствительны к регистру). В обоих случаях необходим также атрибут CONTENT, задающий значение именованного свойства. Закрывающий тег для meta не используется. Теперь подробнее.
Каждый МЕТА тег определяет пару свойство/величина. Атрибуы NAME и HTTP-EQUIV идентифицируют свойство, а атрибут CONTENT определяет значение этого свойства.
Атрибут NAME — это информационно-управляющая часть, используется приложением-клиентом, т.е. броузером или поисковым роботом. Данный атрибут содержит скрытую информацию, не входящую в заголовок HTTP, и идентифицирует имя свойства. Значение данного атрибута может быть практически любым, однако существует несколько стандартных общепризнанных значений, которые будут рассмотрены ниже.
Атрибут HTTP-EQUIV — это эквивалент заголовка HTTP-сервера (однако, имеющий более низкий приоритет перед заголовком, генерируемым самим сервером). Информация, содержащаяся в нём, добавляется в заголовок отклика HTTP и отсылается клиенту перед самой передачей HTML-документа. Полученная информация используется клиентским приложением для работы с документом (например, указывает броузеру, в какой кодировке нужно отобразить документ). Данный атрибут может использоваться на месте атрибута NAME.
Примеры
Далее следует описание наиболее часто встречающихся мета тегов. Их синтаксис будет понятен из приведённых примеров.
Итак, сначала HTTP-EQUIV:
- Refresh (перезагрузка документа):
<META HTTP-EQUIV=»Refresh» CONTENT=»N;URL=https://statievsky.ru/«>,
где N — время в секундах (целое число), URL — адрес документа (можно не указывать). Используется для автоматической перезагрузки указанной страницы через заданное время. Если URL не указан, броузер перезагрузет текущий документ [как если бы пользователь нажал кнопку «Reload» («Перезагрузка») на панели броузера]. Это свойство полезно, например, если информация на странице часто меняется, как на лентах новостей. Так же этот тег может использоваться для автоматической переадресации посетителя с одной страницы на другую (указывается нужный URL).
Небольшой фокус: можно создать эффект анимации (или показа слайдов), если создать несколько страниц (1,2,3,4,5), каждая из которых перадресует посетителя на следующую в списке (например, 1 показвает своё содержимое и через какое-то время отсылает посетителя на страницу 2, аналогично 2 — на 3, а в конце: 5 — на 1, создавая замкнутый цикл). - Expires (дата устаревания документа):
<META HTTP-EQUIV=»Expires» CONTENT=»Wed, 10 Jul 2002 00:20:00 GMT«>
Дата, обозначающая «срок годности» документа. Этот тег управляет кэшированием в HTTP/1.0. При истечении «срока годности» документ будет считаться «просроченным» и броузер будет заново обращаться к источнику, чтобы обновить документ. Если дата годности запрашиваемого документа истекла, он не будет кэшироваться броузером. При значении «0» атрибута CONTENT, броузер каждый раз при запросе будет проверять — изменялся ли документ (брать его с сервера, а не из кэша). Поисковые роботы могут либо совсем не индексировать такой документ («думая», что устаревший документ не заслуживает внимания), либо постоянно проверять его. Поэтому при использовании этого тега надо проявить осторожность. - Content-Type (тип и характеристики документа):
<META HTTP-EQUIV=»Content-Type» CONTENT=»text/html; charset=windows-1251«>
Основное назначение — сообщение броузеру об используемой кодировке. Однако, если Ваш сервер поддерживает автоматическую перекодировку (например, Russian Apache), это тег может привести к путанице. При использовании данного тега необходима осторожность. - Content-language (язык документа):
<META HTTP-EQUIV=»Content-language» CONTENT=»ru«>
Указание для поисковых роботов о языке документа (для категоризации по языку). Формат записи: язык-диалект, например: EN-GB (English — Great Britain). Диалект можно и не указывать (см. пример). - Cache-Control (контроль кэширования документа):
<META HTTP-EQUIV=»Cache-Control» CONTENT=»no-cache«>
Возможные значения: no-store (кэшируется, но не архивируется), no-cache (не кэшируется вообще), Public (кэшируется в общедоступных кэшах), Private (кэшируется только в частных кэшах). - Window-target (способ открытия новых окон броузера):
<META HTTP-EQUIV=»Window-target» CONTENT=»_top«>
Определяет окно текущей страницы. Действует не во всех броузерах. - Pragma (управление кэшированием документа для протокола HTTP/1.0):
<META HTTP-EQUIV=»Pragma» CONTENT=»no-cache«>
Возможно только одно значение: no-cache, т.е. кэширование запрещено. - Set-Cookie (установка cookie для броузера):
<META HTTP-EQUIV=»Set-Cookie» CONTENT=»name=имя;expires=дата; domain=имя домена;path=путь;secure«>, где:- имя — любая строка данных без знаков препинания, пробелов и переходов на следующую строку. Это обязательный параметр;
- дата — дата истечения срока хранения файла cookie в формате: Sun, 14-Jul-02 3:00:00 GMT , если дата не задана, то cookie не сохраняется (необязательный параметр);
- имя домена — домен для которого действительно значения cookie, если не указан, то считается, что это тот сервер, где лежит сайт (необязательный параметр);
- путь — путь к документам домена, для которого действительно значения cookie, если не задан, тогда тот каталог, где лежит сайт (необязательный параметр);
- secure — указывается только если применяется защищенный режим SSL, если нет, то информация передается в обычном режиме (необязательный параметр).
Установка Cookie для броузера в том случае, когда надо сохранить информацию в компьютере посетителя и при необходимости к ней обратиться (чаще всего используется онлайновыми магазинами). Работает так:
Броузер, встретив такую строку, записывает данные в текстовый файл (вида: имя/значение) и хранит в кэше, в следующий раз он сверяет все свои cookie на предмет полного совпадения, и если находит, то отсылает серверу как HTTP заголовок.
В настройках броузера cookie должны быть разрешены, каждый файл не может превышать 4 kB (иначе начальные записи удаляются, освобождая место новым) всего их может храниться до 300, и причем, не больше 20 с одного сервера (иначе более старые файлы удаляются). - Ext-cache (альтернативный кэш):
<META HTTP-EQUIV=»Ext-cache» CONTENT=»NAME=/some/path/index.db; istructions=User Instructions«>
Определяет имя и адрес альтернативного кэша (только для Netscape Navigator). - Location (локация):
<META HTTP-EQUIV=»Location» CONTENT=»https://statievsky.ru/kak-zarabotat-v-internete/«>
Указывает местоположение документа в Интернете (полный адрес).
Теперь NAME:
- Author (имя автора документа):
<META NAME=»Author» CONTENT=»Василий Пупкин«>
Сообщает всем, «чьих кистей» данный документ. Некоторые поисковые системы позволяют искать документы по имени автора. - Keywords (ключевые слова, разделённые запятыми, до 800 символов):
<META NAME=»Keywords» CONTENT=»слово1 слово2 слово3 …«>
Слова и выражения, характеризующие документ. На сегодняшний день большинство поисковых роботов не учитывают этот тег. Однако отказываться от этого тега пока рано. Совет: пишите в него только те слова, которые действительно относятся к тексту документа (и присутствуют в нём, повторяясь несколько раз!). Нельзя повторять слова в теге более 2-3 раз — робот это расценит как накрутку и может вообще исключить сайт из своей базы данных (а значит, лишить его посетителей). - Rating (возрастной рейтинг):
<META NAME=»Rating» CONTENT=»General«>
Сообщает, для какой возрастной категории предназначен данный документ. Возможные варианты: General (общая категория), Restricted (ограниченная), Mature (для взрослых), 14 years (14 летняя аудитория). - Robots (управление роботами):
<META NAME=»Robots» CONTENT=»index, nofollow«>
Управление поведением поисковых роботов на странице (альтернатива созданию файла robots.txt). Возможные варианты: INDEX (документ разрешено индексировать) или NOINDEX (индексирование документа запрещено); FOLLOW (разрешено индексировать все ссылки в данном документе) или NOFOLLOW (запрещена индексация ссылок в данном документе). ALL — одновременное выполнение условий INDEX и FOLLOW (полная свобода действия для робота). NONE — одновременное выполнение условий NOINDEX и NOFOLLOW (любая деятельность поисковиков запрещена). Обритите внимание на форму записи данного тега: чере запятую пишется два атрибута. Первый — index или noindex. Второй — follow или nofollow. Либо вместо них один атрибут: all или none. Нельзя дублировать значения, либо писать противоречивые инструкции (т.е. значение CONTENT не может, например, иметь вид: «none, nofollow»). Значение тега Robots по умолчанию (пусто): ALL. Если возможно, рекомендуется вместо этого тега использовать файл robots.txt. - Description (краткая аннотация содержимого страницы, до 150 символов):
<META NAME=»Description» CONTENT=»Фотки Васи Пупкина на даче, в Интернет-кафе и на хоккейной коробке. Школьные сочинения Васи. Общение в чате с самим Васей.«>
Является важнейшим тегом. В нём кратко описывается содержание страницы и содержимое этого тега выводится в результатах поиска, выдаваемых поисковыми сервисами на запрос пользователя. Поэтому старайтесь сделать это описание интригующим, зазывающим. Старайтесь использовать больше ключевых слов, реально присутствующих в документе. Если этот тег отсутствует, то посетителю поисковика показывается кусок текста страницы. Некоторые поисковые машины не учитываеют данный тег. - Document-state (статус документа):
<META NAME=»Document-state» CONTENT=»Dynamic«>Определяет частоту индексации документа и может принимать значения: Static (статический, т.е. не меняющийся документ, следовательно, индексироваться будет только один раз) и Dynamic (для изменяющихся документов, которые нуждаются в переиндексации). - Revisit-after или Revisit (повторное посещение):
<META NAME=»revisit-after» CONTENT=»4 days«> или:
<META NAME=»revisit» CONTENT=»4 days«>
Идентичные теги. Имеют смысл только тогда, когда значение тега Document-state=»Dynamic«. Указывают через какой промежуток времени поисковому роботу производить переиндексирование документа. Не все поисковики следуют указаниям этих тегов (как, например, Яндекс). Некоторые роботы сами расчитывают частоту переиндексации документа. - Distribution (читательская аудитория документа):
<META NAME=»Distribution» CONTENT=»Global«>
Возможные варианты: global (публичный документ); local (страница не предназначается для широкой аудитории). - URL (расположение основного сайта):
<META NAME=»URL» CONTENT=»https://statievsky.ru/«>
Базовый URL (не путать с BASE!) определяет какой документ надо индексировать, чтобы не обрабатывать «зеркала». - Copyright (авторские права и условия использования материалов):
<META NAME=»Copyright» CONTENT=»(c) Statievsky Danila, никакая часть данного документа не может быть воспроизведена в какой-то бы ни было форме без разрешения владельца авторских прав.«>
Некоторые поисковые машины учитывают и эту информацию (полезно бывает указать название фирмы и имя автора). - Resource-type (тип ресурса):
<META NAME=»RESOURCE-TYPE» CONTENT=»DOCUMENT«>
Обычно значение этого мета тэга устанавливается равным «DOCUMENT». Используется поисковыми роботами (если определён Document, то робот начинает индексирование). - Generator (название приложения, в котором создавался документ):
<META NAME=»Generator» CONTENT=»Блокнот«>
Вставляется в документ приложением, в котором был создан (например, Microsoft Word 9). Бесполезный тег, используемый лишь производителями программного обеспечения для оценки доли занимаемого рынка. - Progld (идентификатор программы):
<META NAME=»ProgId» CONTENT=»FrontPage.Editor.Document«>
Указывает тип и структуру документа, относительно создавшей его программы. Вставляется программами MS Word, MS FronPage и т.д. Беполезный тег.
Допустимо добавлять в мета тэги атрибут LANG, указывающий язык данных в атрибуте CONTENT (например, <META NAME=»Keywords» LANG=»RU» CONTENT=»теги мета мета-теги описание название»>), но это не обязательно.
Как уже говорилось выше, все мета теги должны помещаться в заголовок документа между тегами <HEAD> и </HEAD>, рекомендуется после <TITLE> и </TITLE>.
Заключение
Кроме перечисленных тегов существует еще множество других. Вообще, в атрибут NAME мета тегов можно включать все что угодно (например, NAME=»Sponsored by» CONTENT=»Мама Васи Пупкина»), но пользы от этого не будет. Используя мета тэги, нужно прежде всего учитывать целесообразность их применения. Совет: используйте для каждой страницы сайта свои мета-теги, составленные именно с учётом содержимого данной конкретной страницы. Это позволит повысить её рейтинг в поисковых системах.
Итак, присутствие мета тегов способствует повышению рейтинга сайта в поисковых системах, позволяет управлять кэшированием в броузере и поведением поисковых роботов на странице. Однако, только Вам решать какие из них нужно использовать в том или ином случае, чтобы добиться максимальной полезности их применения и излишне не увеличивать размер документа.