Jak używać dyrektyw .htaccess na serwerze Apache do wysyłania plików z określonym kodowaniem znaków?
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.
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!).
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.
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
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.
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.
Apache version 1 .htaccess and allowOverride documentation
Apache version 2 .htaccess and allowOverride documentation
Tutorial – Zbiory znaków i kodowanie w HTML i CSS
Linki pokrewne – Setting up a server