Obecnie w internecie zobowiązują dwa języki: starzejący się już HTML oraz niestepujący go XHTML. Którego z nich używać? Jak przygotowywać strony WWW zgodne ze standardami?
Dokumenty HTML/XHTML w sieci WWW
Zawartość pliku {stala}.html{/stala} to tylko jeden z etapów przygotowania strony XHTML zgodnej ze standardami. Strony WWW wysyłane przez serwer do przeglądarki są opatrzone dodatkowymi informacjami, nazywanymi nagłówkiem HTTP. Nagłówek ten w normalnych okolicznościach nie jest widoczny. Możemy go podejrzeć za pomocą opcji Narzędzia | Informacje o stronie w Firefoksie lub skorzystać z wtyczek LiveHTTPHeaders (dla Firefoksa) lub ieHTTPHeaders (dla Internet Explorera).
Content-type
Typy plików na dysku oznaczamy rozszerzeniem. Na podstawie końcówki .txt system wie, że plik dane.txt jest plikiem tekstowym. Natomiast plik o nazwie piosenka.html jest traktowany (na podstawie rozszerzenia) jako dokument w języku HTML.
Podobną rolę w odniesieniu do dokumentów dostępnych w sieci WWW (dokładniej: dokumentów przekazywanych protokołem HTTP) pełni nagłówek Content-type. Nagłówek ten jest wysyłany wraz z każdym plikiem pobieranym z serwera WWW. Jeśli odwiedzamy stronę {stala}http://www.example.com/piosenka.html{/stala}, to serwer wyśle wraz z kodem HTML strony nagłówek, który może być następujący:
Content-type: text/html;charset=iso-8859-2
Nagłówek ten oznacza, że dane powinny być traktowane jako dokument HTML (mówi o tym napis text/html), w którym znaki zakodowano w standardzie ISO-8859-2. Obrazy PNG są oznaczane jako:
Content-type: image/png
zaś style CSS:
Content-type: text/css
I tak dalej. To na podstawie takiego właśnie nagłówka przeglądarka wie, z jakim rodzajem danych ma do czynienia.
I tutaj docieramy do zasadniczej sprawy na temat języka XHTML. Dokumenty przygotowywane w języku XHTML należy oznaczyć jednym z trzech typów przeznaczonych dla języka XML:
application/xhtml+xml
application/xhtml
application/xml
Zalecany jest pierwszy z nich: application/xhtml+xml. Dokumenty w języku HTML wysyłamy zawsze wyłącznie jako text/html.
Czy to HTML, czy XHTML?
Po czym rozpoznajemy język, w jakim przygotowano dokument? Do tego służy deklaracja DOCTYPE. Zawartość dokumentu powinna być zgodna z podanym typem. Jeżeli ograniczymy się do wersji strict języków (X)HTML, to pozostają trzy dostępne typy dokumentów:
Najlepiej wykorzystywać deklaracje DOCTYPE w identycznej postaci, gdyż odstępstwa mogą niekiedy powodować przejście przeglądarki w tryb pracy określany terminem \”quirks mode\”. Gdy brakuje deklaracji DOCTYPE, wówczas dokument jest zazwyczaj traktowany jako HTML 4.01 transitional.
Jak przeglądarka traktuje dokument HTML, a jak XHTML?
Znana zasada interpretacji HTML-a za wszelką cenę przestaje obowiązywać. Do niedawna przeglądarka po pobraniu dokumentu starała się za wszelką cenę wyświetlić wszystko, co potrafi, a ignorowała nieznane jej znaczniki. Strony zgodne ze standardami stosują zupełnie odmienne reguły. Kod (X)HTML nowoczesnej strony WWW powinien być w pełni zgodny ze stosowanym językiem. Nie tylko nie wolno używać znaczników, które nie występują w definicji języka, ale trzeba je poprawnie zagnieżdżać.
Czy jest to ważne dla przeglądarki? Tak. Współczesne przeglądarki inaczej traktują strony przygotowane w języku HTML, a inaczej strony XHTML. Dokumenty HTML są przez przeglądarki traktowane \”z przymrużeniem oka\”. Przeglądarka stara się poprawnie wyświetlić stronę, nawet jeśli jest ona pełna błędów i nieznanych znaczników.
Natomiast dokument XHTML musi być poprawny, w przeciwnym razie nie zostanie w ogóle wyświetlony. Przypomina to proces kompilacji programu komputerowego: najmniejszy błąd składniowy (np. użycie znaku & zamiast encji {stala}&{/stala}, czy brak zamykającego znacznika {html}
{/html}) spowoduje, że przeglądarka wyświetli wyłącznie komunikat o błędzie!
Wierszyk
Hello & Goodbye!
Po czym przeglądarka rozpoznaje język dokumentu?
Język w jakim przygotowano dokument możemy rozpoznać po deklaracji DOCTYPE. Jednak dla przeglądarki najważniejszy jest nagłówek odpowiedzi HTTP. Jeżeli w nagłówku tym znajduje się typ:
Content-type: text/html
to strona taka jest traktowana jako HTML bez względu na deklarację DOCTYPE.
Dokumenty, które mają być traktowane jako XHTML muszą być oznaczone typem:
Content-type: application/xhtml+xml
Nagłówek Content-type dokumentu HTML oraz XHTML
Specyfikacje dostępne na stronach konsorcjum W3C jasno określają jakimi nagłówkami należy opatrzyć strony WWW. Jeżeli strona jest wykonana w języku HTML, to jedynym poprawnym typem jest text/html. W przypadku języka XHTML 1.0 zalecanym typem jest application/xhtml+xml.
Jednak dopuszczalne jest (w niektórych sytuacjach) wysyłanie takiego dokumentu jako text/html. Tak wysyłany dokument powinien być maksymalnie zgodny z HTML-em. W internecie można znaleźć wypowiedzi mówiące, że wysyłanie dokumentu XHTML 1.0 wyłącznie jako text/html jest szkodliwe. Natomiast dokumenty XHTML w wersji od 1.1 wzwyż należy wysyłać wyłącznie jako application/xhtml+xml.
Problemy z Internet Explorerem
Głównym argumentem przeciwko całkowitemu przejściu na język XHTML jest fakt, że Internet Explorer nie interpretuje poprawnie dokumentów wysyłanych jako application/xhtml+xml. Jeśli w nagłówku HTTP wystąpi typ:
Content-type: application/xhtml+xml
to na taki dokument Internet Explorer zareaguje wyświetlając okno dialogowe.
Jeżeli nie chcemy utracić wizyt internautów korzystających z IE, musimy – przynajmniej w odniesieniu do wizyt z IE – stosować nagłówek text/html. A to oznacza, że w myśl standardów nie możemy stosować XHTML 1.1 (XHTML 1.1 ma być bezwarunkowo wysyłany jako application/xhtml+xml, bez względu na przeglądarkę).
Strona XHTML wysyłana jako application/xhtml+xml
Zmiana nagłówków wysyłanych przez serwer Apache
Do bezwarunkowej zmiany typu dokumentów o rozszerzeniu {stala}.html{/stala} wysyłanych przez serwer Apache można wykorzystać plik {stala}.htaccess{/stala}. Umieszczamy w nim wpis:
AddType application/xhtml+xml;charset=utf-8 .html
Wysyłanie nagłówka HTTP w PHP
Nagłówek transakcji HTTP możemy w języku PHP ustalić, wywołując funkcję {stala}header(){/stala}:
header(\'Content-Type: application/xhtml+xml; charset=utf-8\');
Style CSS
Style dokumentu XHTML wysyłanego jako application/xhtml+xml ustalamy deklaracją XML:
W przypadku stylów wewnętrznych należy użyć deklaracji XML oraz elementu style:
Strona...
Warunkowa modyfikacja typu dokumentu
Jeśli chcemy stosować język XHTML 1.0 zgodnie z zaleceniami W3C, to musimy wysyłać do przeglądarek interpretujących XML (czyli np. do Firefoksa) nagłówek:
Content-type: application/xhtml+xml
zaś do Internet Explorera:
Content-type: text/xhtml+xml
Jest to możliwe dzięki tzw. negocjowaniu zawartości. Weźmy jednak pod uwagę, że nie da się tego zrobić w \”gołym\” (X)HTML-em (tj. bez PHP, ASP czy innych sztuczek po stronie serwera). Jeśli zatem robimy strony wyłącznie w języku (X)HTML, nie stosując skryptów działających na serwerze (czyli PHP czy ASP) czy innych technik warunkowej zmiany nagłówka HTTP, to tak przygotowywane dokumenty opatrzone deklaracją DOCTYPE języka XHTML nie będą zgodne z zaleceniami W3C.
Otrzymamy w ten sposób dokument XHTML, który jest zawsze wysyłany jako text/html (naruszenie zaleceń podanych w dokumencie \”XHTML Media Types\”) lub zawsze wysyłany jako application/xhtml+xml, a zatem niedostępny dla osób korzystających z Internet Explorera.
Negocjacja zawartości
Protokół HTTP pozwala przeglądarce na tak zwaną negocjację zawartości. Polega to na tym, że przeglądarka przekazując zapytanie do serwera zaznacza jaki rodzaj danych chce otrzymać. Na przykład Firefox wysyła następujący nagłówek HTTP ACCEPT (odczytany w skrypcie PHP ze zmiennej {stala}$_SERVER[‘HTTP_ACCEPT\’]){/stala}:
text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
W nagłówku tym przecinek pełni rolę separatora, zaś poszczególne wpisy mają postać:
{stala}typ{/stala}lub {stala}typ;q=0.3{/stala}
Ogólnie, nagłówek ten ma więc postać:
typ,typ;q=x.y,typ,typ,typ;q=x.y,typ;q=x.y,typ,...
Liczba podana po znaku równości jest z zakresu od 0 do 1 i określa preferencje przeglądarki. Brak liczby jest równoważny maksymalnej wartości 1. Nagłówek wysyłany przez Firefoksa oznacza, że przeglądarka preferuje typy:
text/xml domyślnie: q=1
application/xml domyślnie: q=1
application/xhtml+xml domyślnie: q=1
(brak części q=x.y oznacza, że q wynosi 1) przed:
text/html;q=0.9
W ten sposób Firefox stosując technikę negocjacji zawartości zaznacza, że preferuje dokumenty XHTML (typ application/xhtml+xml posiada domyślną wagę q=1) przed dokumentami HTML (typ text/html posiada mniejszą wagę q=0.9).
Parsing nagłówka HTTP ACCEPT
Do analizy nagłówka HTTP ACCEPT możemy użyć funkcji explode() oraz wyrażeń regularnych. W pliku httpaccept.inc.php znajdziemy funkcję {stala}httpaccept_parse(){/stala}, która jest odpowiedzialna za przetworzenie nagłówka HTTP ACCEPT w tablicę asocjacyjną.
Warunkowe wysyłanie typów text/html i application/xhtml+xml
Jeśli w skrypcie PHP umieścimy kod:
to w zależności od przeglądarki wysłany zostanie nagłówek text/html lub application/xhtml+xml. Informacja o rodzaju wysłanego nagłówka zostaje zapisana w zmiennej {stala}$czy_xhtml{/stala}. Parametr funkcji {stala}httpaccept_send_header(){/stala} służy do ustalenia kodowania znaków zawartego w nagłówku HTTP.
Wymiana zawartości
Kłopot z deklaracją XML
Deklaracja XML występująca na początku dokumentów XHTML:
przysporzy dwóch kłopotów. Po pierwsze koliduje z krótkimi znacznikami PHP, po drugie przełącza Internet Explorera w \”quirks mode\”. Kolizję z krótkimi znacznikami PHP rozwiążemy zmieniając konfigurację PHP. W pliku PHP modyfikujemy wartość parametru {stala}short_open_tag{/stala}:
short_open_tag = Off
i stosujemy wyłącznie pełne znaczniki PHP:
Problem z Internet Explorerem jest trudniejszy. Chcąc uniknąć trybu \”quirks mode\”, należałoby zrezygnować z nagłówka XML. Ponieważ nagłówek ten jest opcjonalny, nie stanowi to problemu. Niestety, rozwiązanie nie jest takie proste. Dołączając style do dokumentu XHTML musimy przed deklaracją DOCTYPE umieścić deklarację XML:
Ta deklaracja również przestawia Internet Explorera z trybu standardów w tryb \”quirks mode\”.
Mamy dwa rozwiązania powyższego problemu: możemy zrezygnować ze stylów lub warunkowo zmienić nagłówek dokumentu:
if ($czy_xhtml) {
echo \'\';
echo \'\';
}
Niestety, warunkowa zmiana zawartości dokumentu, określana mianem \”cloakingu\”, pomimo że działa poprawnie, może być źle widziana przez wyszukiwarki.
Kłopot z kodowaniem znaków
Kodowanie znaków, podobnie jak i style, wymagają wymiany zawartości. Dokument XHTML nie wymaga elementu meta. Kodowanie znaków jest ustalone w nagłówku HTTP. Element meta ustalający kodowanie znaków dokumentu HTML nie może być zawarty w dokumencie wysyłanym jako application/xhtml+xml, gdyż pozwala na przetwarzanie dokumentu jako text/html:
Z drugiej strony, jeśli taki element usuniemy, wówczas dokument traktowany jako text/html nie będzie zawierał poprawnego kodowania (pomimo nagłówka HTTP!). Jedynym wyjściem jest podmiana zawartości dokumentu na podstawie negocjacji zawartości. Zatem kodowanie znaków należy wysyłać warunkowo, w zależności od wysłanego nagłówka:
if (!$czy_xhtml) {
echo \' \';
}
Kłopot z deklaracją stylów w XHTML jest ściśle praktyczny, gdyż wymusza na przeglądarce MSIE tryb \”quirks\”. Element meta dotyczący kodowania znaków nie stwarza realnych trudności. Wprawdzie zezwala aplikacjom na traktowanie dokumentu jako text/xhtml, jednak nie są mi znane przypadki, kiedy tak by się działo z dokumentem wysyłanym jako application/xhtml+xml.