Setarea setului de caractere in .htaccess

Intrebare

Cum folosesc directivele .httaccess pe un server apache pentru a servi fisierele cu codificare anume ?

Introducere

Este important sa va asigurati ca informatia despre codificarea caracterelor trimisa la server este corecta deoarece informatia din antetul HTTP suprascrie informatia din document.

Majoritatea serverelor Apache sunt configurate sa serveasca fisierele folosind codificarea ISO-8859-1 (Latin-1). In exemplele din acest articol vor pleca de la premisa ca doriti servirea fisierele folosind o codificare diferita fata de cea din specificatiile de baza ale serverului. Pentru sfaturi referitore la alegerea codificarii vizitati Alegerea si aplicarea codificarii caracterelor.)

Exemplul de mai jos ilustreaza un antet HTTP care insoteste fisierul trimis catre client. In acest caz informatia despre codificarea caracterelor este inclusa in antetul Content-type; penultima linia.

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

In acest exemplu antetul Content-Type specifica atat tipul fisierului cat si encodarea caracterelor. Tipul fisierului descrie formatul fisierului care urmeaza sa fie salvat. Fisierele HTML sunt servite deobicei ca text/html. Encodarea caracterelor ( sau 'charset') al acestiui fisier este UTF-8.

Pentru a afla cum sa vizualizati antetul HTTP al unui fisier cititi acest articol: Verificarea antetelor HTTP.

Pe serverul Apache fisierele pot fi servite cu o declarare a codifcarii caracterelor in antetul HTTP care e in conflict cu codificarea reala a fisierului. Codificarea caracterelor trimisa de server ar putea fi setarea de baza a serverului, o setare adaugata de administartorul serverului sau rezultatul implementarii a diferite directive Apache. In unele cazuri severul nu trimite nici o informatie referitoare la codificarea fisierului, chiar daca este necesara.

Daca serverul este setat sa permita utilizatorilor sau administratorilor sa modifice informatia in fisierele .htaceess, acestia pot suprascrie setarile de baza ale serverului. Acest document va arata cum.

Raspuns

Exista mai multe scenarii pe care trebuie sa le luati in calcul. In instanta initiala, putem modifica setarea de baza pentru toata fisierele dintr-un director care au o extensie specifica. Alternativ putem modifica setarea de baza pentru un fisier sau un numar mic de fisiere. Vom investiga aceste cazuri pe rand.

In exemplele noastre vom pleca de la premiza ca setarea de baza a serverului pentru servirea fisierelor este ISO-8859-1 si noi vrem ca fisierele sa fie servite folosind UTF-8 (o strategie rationala!)

Este acest raspuns relevant pentru tine ?

Acest articol se adreseaza propietarilor de site-uri, mai mult decat administratorilor de sistem. Modificarea setarilor de baza a sistemului depaste scopul acestui articol.

Sfaturile oferite sunt relevante doar daca doriti setarea codificarii caracterelor documentului in antetul HTTP. In unele cazuri s-ar putea sa nu fie ceea ce doriti.

Acest articol pleaca de la premiza ca serverul este configurat sa foloseasca fisierele .htaccess , si directivele prezentate mai jos functioneaza fisierele .htaccess de pe server. De asemenea se presupune ca nu este corect doar sa schimbati setarile de baza ale serverului. Daca nu sunteti siguri, luati legatura cu administratorul dumeavoastra de server.

Ar trebui de asemenea sa va documentatati cu privire la convetiile existente ale serverului dumneavoastra referitoare la asocierea informatiei de codificare a extensiilor. In unele cazuri serverul este setat ca specificatiile de codificare sa fie indicate de extensie, exemplu: exemplu.html.utf8, unde .utf8 trebuie asociat codificarii de caractere, in loc de .html ( care poate fi asociata cu alt tip de fisier).

Daca aceste abordari dau gres va recomandam sa consultati manalul Apache (vezi link-urile) sau contactati administratorul de sistem.

Specificarea in functie de extensie

Folositi directivaAddCharset pentru a asocia o codificare a caracterelor pentru toate fisierele cu o extensie anume din directorul curent si subdirectoarele acestuia. De exemplu pentru a servi toate fisierele cu extensia .html folosind codificarea UTF-8, deschideti fisierul .htaccess intr-un editor text si adaugat urmatoarea linie de cod:

AddCharset UTF-8 .html

Extensia poate fi specificata cu sau fara punct in fata. Puteti adauga multiple extensii pe acelasi rand. Ele vor functiona daca aveti nume precum exemplu.en.html sau exemplu.html.en

Exemplu de mai sus va face ca fisierele cu extensia .html sa fie servite folosind codificarea UTF-8. Antetul HTTP Content-type va contine o line care se termina cu informatia 'charset', ca in exemplul de mai jos.

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

Nota: Toate fisierele aceasta extensie in toate subdirectoarele directorului curent vor fi servite ca UTF-8. Daca pentru un motiv anume, aveti nevoie sa serviti un anumite fisiere cu o codificare diferita va trebui sa suprascrieti folosind directive aditionale.

Nota:Puteti asocia codificarea caracterelor cu orice extensie atasata fisierelor. De exemplu: Sa presupunem ca aveti mai multe limbi si ca aveti doua pagini in doua limbi diferite care se conforma modelului exemplu.en.html si exemplu.ja.html. Sa presupunem de asemenea ca sunteti multumiti cu servirea paginilor in engleza folosind setarile de baza ale serverului ISO-8859-1 dar vreti sa serviti fisierele Japoneze ca UTF-8. Pentru a realiza acest lucru trebuie sa asociati codificarea fisierului cu extensia fisierului, prin adaugarea:

AddCharset UTF-8 .ja

Daca este posibil, modificarea setarii de baza a serverului in UTF-8 sau servirea tuturor fisierelor din directoare ca UTF-8 este o solutie mai buna.

Nota: Putem ajunge la acelasi rezultat folosind directiva AddType desi aceasta declara atat codificarea caracterelor cat si tipul fisierului simultan. Decizia asupra metodei pe care o veti folosi trebuie luata in functie de modul in care folositi extensiile. Daca folositi extensii diferite pentru tipul documentului si codificarea caracterelor sunt sanse mici ca aceasta metoda sa fie cea mai potrivita.

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

Schimbarea pentru un singur fisier

Sa presupunem ca vreti sa serviti doar un fisier dintr-un director mare ca UTF-8 si restul fisierelor sunt servite corect ca ISO-8859-1. Fisierul pe care doriti sa il serviti ca UTF-8 se numeste exemplu.html. Deschideti fisierul .htaccess intr-un editor text si adaugati urmatorul cod:

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

Aici am encapsulat directiva discutata in sectiunea precedenta in cod care identifica fisierul specific. Daca aveti nevoie exista o sintaxa putin diferita care va permite sa specificati numarul de nume fisiere la care se aplica expresia regulata.

Nota: Este posibil sa obtinem acelasi rezultat ca mai sus folosind directiva AddType sau in acest caz directiva ForceType, desi acestea declara in acelasi timp codificarea caracterelor si tipul fisierelor.

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

Nota: Toate fisierele cu acelasi nume aflate intr-un subdirector a locatiei curente vor fi servite ca UTF-8, in cazul in care nu creati o directiva noua in directorul relevant.

Cazuri mai complexe

Cand doua reguli pentru extensii se aplica aceluiasi document ordinea extensiilor este importanta. Astfel in exemplul urmator:

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

fisierul 'exemple.utf8.html' va fi servit ca 'windows-1252' si 'example.html.utf8' ca UTF-8