Налаштування charset інформації в .htaccess

Питання

Як я маю використовувати директиви .htaccess на сервері Apache для обслуговування файлів із специфічним кодуванням?

Ввідна інформація

Важливо забезпечити, щоб будь-яка інформація про кодування символів, відправлена сервером була правильною, тому що інформація в HTTP заголовоку перевизначає інформацію в самому документі.

Багато серверів Apache налаштовані, щоб відправляти файли з використанням кодування ISO-8859-1 (Latin-1). У прикладах в цьому документі, ми будемо вважати, що ви хочете обслуговувати ваш файл або файли, використовуючи інші кодування, ніж вказано в конфігурації за замовчуванням. (Для отримання консультації з вибору кодування дивіться Вибір і застосування кодування.)

Нижче наведено приклад HTTP заголовку, який супроводжує надісланий до клієнтського додатку файл. У цьому випадку інформація про кодування символів міститься в заголовку Content-Type в другому рядку знизу.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
Content-Location: CSS2-REC.en.html
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml
Cache-Control: max-age=21600
Expires: Wed, 05 Nov 2003 16:46:04 GMT
Last-Modified: Tue, 12 May 1998 22:18:49 GMT
ETag: "3558cac9;36f99e2b"
Accept-Ranges: bytes
Content-Length: 10734
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: en

У прикладі заголовок Content-Type виражає як MIME тип файлу так і кодування символів. MIME тип описує формат файлу, що обслуговувався. HTML файли , як правило, обслуговуються, як text/html. Кодування символів (або 'charset') цього файлу - UTF-8.

Щоб дізнатися, як переглянути HTTP заголовок файлу дивіться статтю Перевірка HTTP Заголовків.

Файли на сервері Apache можуть обслуговуватися з кодуванням символів за замовчуванням в HTTP заголовку, що конфліктує з фактичним кодуванням файлу. Кодування символів, що посилається сервером може бути новим кодуванням за замовчуванням, встановлене за замовчуванням адміністратором сервера, або результатом виконання різних директив Apache. В інших випадках ніякої інформації про кодування символів сервером не відправляється, коли вона дійсно необхідна.

Якщо сервер налаштований так, що дозволяє користувачам або адміністраторам змінювати інформацію в .htaccess файлах, це може забезпечити спосіб перевизначити налаштування за замовчуванням. Цей розділ показує вам, як це зробити.

Відповідь

Майте на увазі, що є декілька різних сценаріїв. У першу чергу, ви можливо захочете змінити в директорії значення за замовчуванням для всіх файлів з однаковим розширенням. Крім того, ви можливо захочете змінити значення за замовчуванням для одного файлу або невеликого числа файлів. Ми дослідимо це по черзі.

У наших прикладах ми будемо вважати, що сервер за замовчуванням налаштований обслуговувати файли в кодуванні ISO-8859-1, але ви хочете, щоб він обслуговував ваш файл або файли використовуючи кодування UTF-8 (дуже розумна стратегія!).

Чи підходить вам ця відповідь?

Ця стаття написана для авторів контенту, а не для системних адміністраторів. Налаштування кодування серверу за замовчуванням виходить за рамки цієї статті.

Ця порада підходить тільки тоді, коли ви згодні проголосити кодування символів документа за допомогою HTTP заголовка. У деяких випадках ви можете цього не захотіти.

Зауважимо, що ці FAQ (Часто Задавані Питання) також припускають, що ваш сервер налаштований на використання .htaccess файлів, і, що директиви, описані нижче працюють в .htaccess файлах на вашому сервері. Передбачається також, що не достатньо просто змінити налаштування за замовчуванням на сервері. Якщо ви не впевнені, зверніться до адміністратора сервера.

Ви також повинні знати про конвенції, які використовуються на сервері для об'єднання інформації про кодування символів із розширеннями. У деяких випадках сервер може бути настроєний в очікуванні того, що кодування символів визначені специфічними розширеннями кодування, наприклад example.html.utf8 де .utf8 те, що повинно бути пов'язане з кодуванням символів, а не .html (те, що може бути пов'язане з типом файла).

Якщо такі підходи зазнають невдачі, то ви повинні переглянути керівництва Apache (дивіться прикладені посилання) або звернутися до адміністратора вашого сервера.

Специфікація по розширенню

Використовуйте директиву AddCharset щоб пов'язати кодування символів із усіма файлами, які мають певне розширення в поточному каталозі і його підкаталогах. Наприклад, щоб обслуговувати всі файли з розширенням .html як UTF-8, відкрийте .htaccess файл у текстовому редакторі і введіть наступний рядок:

AddCharset UTF-8 .html

Розширення може бути зазначено з або без початкової точки. Ви можете додати кілька розширень до одного і того ж рядка. Це все одно буде працювати, якщо ви маєте такі назви файлів, як example.en.html або example.html.en.

Приклад змусить усі файли з розширенням .html обслуговуватися як UTF-8. Заголовок HTTP Content-Type міститиме рядок, який закінчується 'charset' інформацією, як показано в наступному прикладі.

Content-Type: text/html; charset=UTF-8

Примітка: Всі файли з таким розширенням у всіх підкаталогах поточного місця розташування будуть також обслуговуватися як UTF-8. Якщо, з деяких причин, ви повинні обслужити певний файл із іншим кодуванням вам необхідно переназначити його, використовуючи додаткові директиви.

Примітка: Ви можете зв'язати кодування символів з будь-яким розширенням, що додається до вашого файлу. Наприклад, припустимо, що ви зробили переклад на іншу мову і ви маєте сторінки на двох мовах, що виглядають наступним чином example.en.html та example.ja.html. Давайте також припустимо, що вам зручно обслуговувати Англійські сторінки використовуючи кодування ISO-8859-1 вашого сервера за замовчуванням, але ви хочете обслуговувати Японські файли в UTF-8. Щоб це зробити, ви можете зв'язати кодування символів із розширенням мови, як показано у наступному прикладі:

AddCharset UTF-8 .ja

Однак, візьміть до відома, якщо ви можете, то кращим рішенням буде змінити налаштування сервера за замовчуванням на UTF-8, або обслуговувати всі файли в нових каталогах як UTF-8.

Примітка: Для досягнення того ж результату можна також використовувати директиву AddType, хоча це і одночасно призначає як кодування символів так і MIME тип. Рішення про те, що є найбільш відповідним, частково буде залежати від того, як ви використовуєте розширення для обговорення контенту. Менш імовірно, що це буде доречно, якщо ви використовуєте різні розширення для вираження типу документа і кодування символів.

AddType 'text/html; charset=UTF-8' html

Зміна випадкового файлу

Давайте тепер припустимо, що ви хочете обслуговувати тільки один файл як UTF-8 у великому каталозі, де всі інші старі файли правильно обслуговуються як ISO-8859-1. Файл, що ви хочете обслуговувати як UTF-8 має назву example.html. Відкрийте .htaccess файл у текстовому редакторі і введіть наступне:

<Files "example.html">
AddCharset UTF-8 .html
</Files>

Те, що ми зробили тут, обернуло директиву, про яку говорилося в попередньому розділі в деяку розмітку, яка ідентифікує конкретний файл з яким ми маємо справу. Якщо вас необхідно, то існує також дещо інший синтаксис, який дозволяє вказати декілька імен файлів за допомогою регулярних виразів.

Примітка: Можливо також досягнути того ж результату, використовуючи показану вище директиву AddType, або, в даному випадку, директиву ForceType , хоча і вона одночасно призначає, як кодування символів так і MIME тип.

<Files "example.html">
ForceType 'text/html; charset=UTF-8'
</Files>

Примітка: Будь-які файли з однаковою назвою в підкаталозі поточного місця розташування будуть також обслуговуватися як UTF-8, хіба що ви створите протилежну директиву у відповідному каталозі.

Більш комплексні сценарії

Коли два правила розширення застосовується до одного і того ж документу важливим є порядок розташування розширень. Так, як в наступному прикладі

AddCharset UTF-8 .utf8
AddCharset windows-1252 .html

файл 'example.utf8.html' буде обслуговуватися як "windows-1252" та 'example.html.utf8' як UTF-8.