Ustawianie informacji o kodowaniu znaków w .htaccess

Pytania

Jak używać dyrektyw .htaccess na serwerze Apache do wysyłania plików z określonym kodowaniem znaków?

Tło informacyjne

Ważnym jest aby upewnić się, że informacja o kodowaniu znaków wysyłana przez serwer jest poprawna, ponieważ informacje w nagłówku HTTP są nadrzędne w stosunku do informacji w znacznikach meta dokumentu.

Wiele serwerów Apache jest skonfigurowana do przesyłania plików z kodowaniem ISO-8859-1 (Latin-1). W poniższym dokumencie, zakładamy, że webmaster chciałby podawać pliki z innym kodowaniem niż domyślne. (Porady dotyczące kodowania dostępne są w tutorialu Choosing & applying a character encoding.)

Poniżej zamieszczony jest przykład nagłówka HTTP, który serwowany jest przeglądarkom. W tym przypadku, kodowanie znaków jest zawarte w nagłówku Content-Type na drugiej linii of końca.

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

W powyższym przykładzie, nagłówek Content-Type wyraża zarówno typ MIME pliku jak również kodowanie znaków. Typ MIME opisuje format. Pliki HTML są zazwyczaj podawanie jako text/html. Kodowanie znaków (lub 'zbiór znaków') powyższegpo pliku to UTF-8.

Informacje na temat jak przeglądać nagłówek HTTP są dostępne w artykule Sprawdznie nagłówków HTTP.

Pliki na serwerze Apache mogą być podawane z domyślną deklaracją kodowania w nagłówku HTTP, która jest w konflikcie z kodowaniem znaków dokumentu. Kodowanie wysyłane przez serwer może byc kodowaniem domyślnym ustawionym przez administratora serwera lub rezultatem implementacji innych dyrektyw.

Jeśli serwer jest ustawiony w taki sposób aby umożliwiać użytkownikom lub administratorom zmiany w pliku .htaccess, domyślne ustawienia mogą byc zmienione.

Odpowiedź

Istnieje tutaj kilka możliwych scenariuszy. Po pierwsze, można zmienić ustawienia domyślne dla wszystkich plików dla danej ścieżki z takim samym rozszerzeniem. Można również zmienić ustawienia domyślne dla pojedynczych plików lub grupy plików.

W przykładach zakładamy, że domyślna konfiguracja plików serwera to ISO-8859-1 i że webmaster chce zmienić te ustawienia na UTF-8 ( jest to rozsądna strategia!).

Czy znajdziesz tu to czego szukasz?

Artykuł jest napisany z myślą o autorach treści a nie administratorach systemu. Ustawianie domyślnego kodowania znaków serwera nie jest podmiotem tego artykułu.

Porady zawarte w ponższym dokumencie są przeznaczone jedynie dla tych, którzy chcą zmienić kodownaie znaków poprzez nagłówek HTTP. W niektórych przypadkach może to nie być właściwym rozwiązaniem.

Niniejższy dokument również zakłada, że serwer pozwala na dostęp do pliku .htaccess oraz, że dyrektywy poniżej opisane będą działać w pliku .htaccess na serwerze. Zakładamy również, że nie byłoby właściwym zmienianie domyślnej konfiguracji serwera.

Webmaster powinien wiedzieć jakie są ustawienia na serwerze dotyczące kodowania znaków dla poszczególnych rozszerzeń.

Jeśli poniższe przykłady nie odniosą pożądanego skutku, można odwołać się do instrukcji Apache (linki) lub skonsultować się z administratorem serwera.

Określenie za pomocą rozszerzenia

Użycie dyrektyw AddCharset do kojarzenia kodowania znaków ze wszystkimi plikami o określonem rozszerzeniu w folderze i podfolderach. Na przykład, podawanie wszystkich plików z rozszerzeniem .html jako UTF-8. W tym celu należy otworzyc plik .htaccess w edytorze i dodać nastepującą linię:

AddCharset UTF-8 .html

Rozszerzenie można wstawić z kropką lub bez. Można również dodać inne rozszerzenia w tej samej linii. Będzie to odpowiednie dla plików typu nazwa.en.html lub nazwa.html.en.

Przykład ten powoduje, że wszystkie pliki z rozszerzeniem .html będą podawane jako UTF-8. Nagłówek HTTP Content-Type będzie zawierał linię z informacja na temat zbioru znaków np.:

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

Uwaga: Wszystkie pliki z tym rozszerzeniem we wszsytkich podfolderach będą serwowane jako UTF-8. Jeśli z jakiegokolwiek powodu chce się serwować jakiś plik z innym kodowaniem, należy zmienić to ustawienie używając innych dyrektyw.

Uwaga: Można kojarzyć kodowanie z konkretym rozszerzeniem jeśli np.: stosuje się negocjacje języka podając dwa pliki napisane w różnych językach z rozszerzeniem nazwa.en.html i nazwa.ja.html. Załóżmy, że nie masz nic przeciwko temu aby strony angielskie na serwerze były serwowane z ustawieniem domyślnym ISO-8859-1 ale strony w języku japońskim z kodowaniem UTF-8. Można to osiągnąć poprzez kojarzenie kodowania z rozszerzeniem języka np.:

AddCharset UTF-8 .ja

Jeśli jest to możliwe, lepszym rozwiązaniem jest zmiana ustawień domyślnych na UTF-8 lub podawanie wszystkich plików w nowych folderach jako UTF-8.

Uwaga: Możliwym jest uzyskanie tego samego rezultatu poprzez zastosowanie dyrektywy AddType, chociaż, poza kodowaniem znaków, deklaruje ona również typ MIME. Decyzja odnośnie której metody użyć zależy częściowo od sposobu w jaki używa sie rozszerzeń w negocjacji języka. Jeśli stosuje się inne rozszerzenia do wyrażania typu dokumentu i inne do kodowania znaków, metoda ta jest mniej odpowiednia.

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

Zmiana poszczególnych plików

Załóżmy, że chcemy serwować tylko jeden plik z kodowaniem UTF-8 znajdujący się w dużym folderze gdzie inne pliki podawane są jako ISO-8859-1. Plik, który podajemy w UTF-8 nazywa się nazwa.html. Otwieramy plik .htaccess w edytorze i dodajemy następujący kod:

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

Co zrobiliśmy to dodaliśmy do wcześniej omawianej dyrektywy znacznik, który identyfikuje określony plik. Jeśli zachodzi taka potrzeba, istnieje również składnia, która pozwala na określenie grupy plików dla których chcielibyśmy zmienić kodowanie.

Uwaga: Taki sam efekt można uzyskać poprzez zastosowanie dyrektywy AddType lub ForceType, chociaż, poza kodowaniem znaków, deklarują one również typ MIME.

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

Uwaga: Pliki o tej samej nazwie w podfolderach będą również podawane jako UTF-8, chyba, że stowrzy się przeciwną dyrektywę dla danych podfolderów.

Bardziej skomplikowane scenariusze

Kiedy dwie reguły dotyczące rozszerzeń odnoszą się do tego samego dokumentu, kolejność jest istotna. Dlatego w poniższym przykładzie:

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

plik 'nazwa.utf8.html' będzie serwowany jako "windows-1252" a 'nazwa.html.utf8' jako UTF-8.