Tagphp

Filtrowanie danych w kodowaniach ISO/IEC 8859

Otóż w Polsce do tej pory często wykorzystywanym kodowaniem jest ISO-8859-2 ale czasy swojej świetności ma już dawno za sobą. Było używane wszędzie tam gdzie nie było obsługi polskich znaków a chciano je wprowadzić. Dzisiaj mamy Unicode i mnóstwo kodowań które je obsługuje.

Każde kodowanie z rodziny ISO 8859 jest zgodne z kodowaniem ASCII lub jak kto woli bazuje na nim, innymi słowy pierwsze 127 (licząc od zera 128, 0x00 – 0x7F) znaków kontrolnych i drukowanych się pokrywa.

Continue reading

WordPress 2.8.6

Ta aktualizacja WordPress 2.8.6 rozwiązuje dwa problemy z bezpieczeństwem, które mogą zostać wykorzystane przez zarejestrowanych użytkowników, zalogowanych użytkowników posiadających uprawnienia do tworzenia wpisów. Jeśli masz niezaufanych współtwórców WordPress aktualizacja jest szczególnie zalecana.

Pierwszy problem to luka XSS odkryty przez Benjamina Flescha natomiast drugi odkryty przez Dawida Golunskiego, który pozwalał na wykonanie kodu php w uploadowanych plikach o specjalnej nazwie tylko przy określonej konfiguracji Apache. Podziękowania dla Benjamina i Dawida, że znaleźli powyższe problemy i je zgłosili.

Pozostaje nam czekać na WordPress 2.9 i łatać dotychczasowe wersje WordPress lub może pod choinkę dostaniemy WordPress 3, nie wiadomo…

usuwanie znaków specjalnych z kodowania iso-8859-2 latin2

usuwanie znaków specjalnych z kodowania iso-8859-2 latin2

Często zachodzi potrzeba zamiany ogonków na ich graficzne odpowiedniki bez ogonków w kodowaniu ASCII. Najczęściej służy to do przygotowania tekstu wo wyświetlenia w adresie urluri. Lecz niestety jest to zależne od użytego kodowania na stronie jak i bazie danych MYSQL.

Ponieważ najczęściej wykorzystujemy podmianę znaków specjalnych, narodowych, diakrytycznych w przygotowywaniu przyjaznych adresów – friendly URL ze słowami kluczowymi dlatego też potrzebujemy dynamicznej funkcji która to zrobi za nas automatycznie.

Tutaj prezentuję tablice oraz funkcje specjalnie dla kodowania iso-8859-2, znanego pod nazwą latin2, jeszcze inna nazwa to ISO/IEC 8859-2 jak i kodowanie środkowoeuropejskie oraz wschodnioeuropejskie. Może jest to dosć zacofane kodowanie lecz nadal często używane na stronach WWW oraz bazach mysql (latin2) ze względu na obsługę polskich znaków diakrytycznych.

Kodowanie iso-8859-2 obsługuje takie języki jak (pod względem znaków narodowych – specjalnych):

  • Polski
  • Bośniacki
  • Chorwacki
  • Czeski
  • Węgierski
  • Serbski (w transkrypcji łacińskiej)
  • Serbsko-Chorwacki
  • Słowacki
  • Słoweński
  • Górnołużycki
  • Dolnołużycki
  • Angielski
  • Niemiecki
  • sporną kwestią jest język Fiński

Jednakże zalecą się stosowanie kodowań zgodnych z Unicode np. utf-8, ponieważ mimo iż iso-8859-2 wydaje się obsługiwać wiele języków obsługuje ono tylko podstawy i w swoim asortymencie posiada tylko niewiele znaków specjalnych, oraz cała tablica kodowania jest skromna.

O co chodzi w tej konwersji iso-8859-2 to ASCII, otóż o to by zamienić np. nasze polskie ć na jego odpowiednik c który może być obsłużony w adresach URL przez przeglądarki i niestety trzeba postąpić tak z każdym zadaszkowanym i ogonkowym znakiem. Ř -> R i tym podobne…

Poniżej przedstawiam tablice do użytku nie komercyjnego, które ostatnio sobie stworzyłem do przygotowania przyjaznych adresów w kodowaniu iso-8859-2. Są niewrażliwe na kodowanie pliku w którym są zapisane ponieważ korzystają z wartości heksadecymalnych popularnie zwane HEX. Zamieniają każdy znak na jego graficzny odpowiednik, działają z wielkimi jak i małymi literami! Oczywiście zamieniają także polskie znaki!

$map_latin2=array(
"\xa1","\xa3","\xa5","\xa6","\xa7","\xa9","\xaa","\xab","\xac","\xae","\xaf",
"\xb1","\xb3","\xb5","\xb6","\xb9","\xba","\xbb","\xbc","\xbe","\xbf","\xc0",
"\xc1","\xc2","\xc3","\xc4","\xc5","\xc6","\xc7","\xc8","\xc9","\xca","\xcb",
"\xcc","\xcd","\xce","\xcf","\xd0","\xd1","\xd2","\xd3","\xd4","\xd5","\xd6",
"\xd7","\xd8","\xd9","\xda","\xdb","\xdc","\xdd","\xde","\xdf","\xe0","\xe1",
"\xe2","\xe3","\xe4","\xe5","\xe6","\xe7","\xe8","\xe9","\xea","\xeb","\xec",
"\xed","\xee","\xef","\xf0","\xf1","\xf2","\xf3","\xf4","\xf5","\xf6","\xf8",
"\xf9","\xfa","\xfb","\xfc","\xfd","\xfe",
);
//Tablice znakow diakrytycznych 
//dla kodowania iso-8859-2 (latin2)
//by tosiek - https://tosiek.pl/
$map2_latin2=array(
"\x41","\x4c","\x4c","\x53","\x53","\x53","\x53","\x54","\x5a","\x5a","\x5a",
"\x61","\x6c","\x6c","\x73","\x73","\x73","\x74","\x7a","\x7a","\x7a","\x52",
"\x41","\x41","\x41","\x41","\x4c","\x43","\x43","\x43","\x45","\x45","\x45",
"\x45","\x49","\x49","\x44","\x44","\x4e","\x4e","\x4f","\x4f","\x4f","\x4f",
"\x78","\x52","\x55","\x55","\x55","\x55","\x59","\x54","\x73\x73","\x72","\x61",
"\x61","\x61","\x61","\x6c","\x63","\x63","\x63","\x65","\x65","\x65","\x65",
"\x69","\x69","\x64","\x64","\x6e","\x6e","\x6f","\x6f","\x6f","\x6f","\x72",
"\x75","\x75","\x75","\x75","\x79","\x74",
);

Na pierwszy rzut oka nie są czytelne, lecz poniżej prezentuję ich wersję z której odradzam korzystać, ponieważ taki plik z poniższymi tablicami musi być bezwzględnie zapisany w kodowaniu iso-8859-2 (trzeba się pilnować), także do użytku niekomercyjnego:

$map_latin2=array(
'Ą','Ł','Ľ','Ś','§','Š','Ş','Ť','Ź','Ž','Ż',
'ą','ł','ľ','ś','š','ş','ť','ź','ž','ż','Ŕ',
'Á','Â','Ă','Ä','Ĺ','Ć','Ç','Č','É','Ę','Ë',
'Ě','Í','Î','Ď','Đ','Ń','Ň','Ó','Ô','Ő','Ö',
'×','Ř','Ů','Ú','Ű','Ü','Ý','Ţ','ß','ŕ','á',
'â','ă','ä','ĺ','ć','ç','č','é','ę','ë','ě',
'í','î','ď','đ','ń','ň','ó','ô','ő','ö','ř',
'ů','ú','ű','ü','ý','ţ',
);
//Tablice znakow diakrytycznych 
//dla kodowania iso-8859-2 (latin2)
//by tosiek - https://tosiek.pl/
$map2_latin2=array(
'A','L','L','S','S','S','S','T','Z','Z','Z',
'a','l','l','s','s','s','t','z','z','z','R',
'A','A','A','A','L','C','C','C','E','E','E',
'E','I','I','D','D','N','N','O','O','O','O',
'x','R','U','U','U','U','Y','T','ss','r','a',
'a','a','a','l','c','c','c','e','e','e','e',
'i','i','d','d','n','n','o','o','o','o','r',
'u','u','u','u','y','t',
);

Posiadając tablice znaków diakrytycznych możemy zamienić te znaki na ich odpowiedniki – funkcja str_replace(), lecz to nie jest całkowite przygotowanie adresów URL należy się także pozbyć znaków specjalnych, przestankowych i tym podobnych, które nie są obsługiwane w adresach. Tutaj wykorzystamy wyrażenia regularne (regular expressions) – funkcja preg_replace(), które zamienią każdy znak nie wchodzący w skład wyrazów na myślniki (-) lub podkreślniki – znaki podkreślenia (_), zależy kto jak woli, następnie musimy usunąć te znaki z początku i końca, wykorzystamy funkcję trim() z dodatkowym parametrem.

Ci którzy chcą by adresy były złożony tylko z małych liter muszą użyć funkcji strtolower()

Adresy URL – URI ze słowami kluczowymi

Wiec zaczynamy sobie pisać funkcję specialchar_latin2() która jako jedyny argument przyjmuje ciąg który przygotowuje do wyświetlenia adresu URL:

function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	return $url;
}

Należy pamiętać by tablice ze znakami narodowymi były zdefiniowane poza – przed funkcją. Ciąg zażółć?gęślą !?jaźń;;\ZAŻÓŁĆ []GĘŚLĄ (JAŹŃ-- po przejściu przez tę funkcję będzie miał postać: zazolc?gesla !?jazn;;\ZAZOLC []GESLA (JAZN–, nie nadaje się do wykorzystania w adresie.
Jak na razie funkcja zamienia tylko znaki narodowe z tablic, dodajmy do niej wyrażenie regularne zamieniające wszystko co nie jest znakiem wchodzącym w skład słów i występujące jeden raz lub więcej na myślnik – (kto woli podkreślnik _), posłużymy się zdefiniowaną klasą negującą znaki wchodzące w skład słów \W

function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	$url = preg_replace('#[\W]{1,}#','-',$url);
	return $url;
}

Teraz zamieniamy wszystko co zbędne (spacje, wykrzykniki, znaki zapytanie i tym podobne na myślniki. Ciąg zażółć?gęślą !?jaźń;;\ZAŻÓŁĆ []GĘŚLĄ (JAŹŃ-- po przejściu przez funkcję miałby postać: zazolc-gesla-jazn-ZAZOLC-GESLA-JAZN-, lecz jak widać pozostał myślnik na końcu, może także czasami pozostać na początku co jest całkowicie zbędne, użyjemy funkcji trim() do jego usunięcia:

function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	$url = preg_replace('#[\W]{1,}#','-',$url);
	$url = trim($url,'-');
	return $url;
}

Teraz ciąg miałby postać: zazolc-gesla-jazn-ZAZOLC-GESLA-JAZN, a co jeśli byśmy chcieli by składał się z małych estetycznych liter? Wystarczy skorzystać z funkcji strtolower() zamieniającej wielkie litery na małe.

function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	$url = preg_replace('#[\W]{1,}#','-',$url);
	$url = trim($url,'-');
	$url = strtolower($url);
	return $url;
}

Teraz otrzymujemy oczekiwany efekt zazolc-gesla-jazn-zazolc-gesla-jazn, zamienione znaki narodowe na ich odpowiedniki, spacje i inne znaki specjalne zamienione na myślniki (lub podkreślniki) oraz cały ciąg pisany mała czcionką bez wielkich liter. Taki ciąg można wykorzystać w adresie URL.

Bardzo przydatna rzecz do tworzenia przyjaznych adresów ze słowami kluczowymi. Oczywiście dla kodowania iso-8859-2, które niestety nadal jest w użyciu.

Funkcja specialchar_latin2() w ostatecznej wersji:

$map_latin2=array(
	"\xa1","\xa3","\xa5","\xa6","\xa7","\xa9","\xaa","\xab","\xac","\xae","\xaf",
	"\xb1","\xb3","\xb5","\xb6","\xb9","\xba","\xbb","\xbc","\xbe","\xbf","\xc0",
	"\xc1","\xc2","\xc3","\xc4","\xc5","\xc6","\xc7","\xc8","\xc9","\xca","\xcb",
	"\xcc","\xcd","\xce","\xcf","\xd0","\xd1","\xd2","\xd3","\xd4","\xd5","\xd6",
	"\xd7","\xd8","\xd9","\xda","\xdb","\xdc","\xdd","\xde","\xdf","\xe0","\xe1",
	"\xe2","\xe3","\xe4","\xe5","\xe6","\xe7","\xe8","\xe9","\xea","\xeb","\xec",
	"\xed","\xee","\xef","\xf0","\xf1","\xf2","\xf3","\xf4","\xf5","\xf6","\xf8",
	"\xf9","\xfa","\xfb","\xfc","\xfd","\xfe",
);
//Tablice znakow diakrytycznych 
//dla kodowania iso-8859-2 (latin2)
//by tosiek - https://tosiek.pl/
$map2_latin2=array(
	"\x41","\x4c","\x4c","\x53","\x53","\x53","\x53","\x54","\x5a","\x5a","\x5a",
	"\x61","\x6c","\x6c","\x73","\x73","\x73","\x74","\x7a","\x7a","\x7a","\x52",
	"\x41","\x41","\x41","\x41","\x4c","\x43","\x43","\x43","\x45","\x45","\x45",
	"\x45","\x49","\x49","\x44","\x44","\x4e","\x4e","\x4f","\x4f","\x4f","\x4f",
	"\x78","\x52","\x55","\x55","\x55","\x55","\x59","\x54","\x73\x73","\x72","\x61",
	"\x61","\x61","\x61","\x6c","\x63","\x63","\x63","\x65","\x65","\x65","\x65",
	"\x69","\x69","\x64","\x64","\x6e","\x6e","\x6f","\x6f","\x6f","\x6f","\x72",
	"\x75","\x75","\x75","\x75","\x79","\x74",
);
function specialchar_latin2($url) {
//specialchar_latin2 by tosiek https://tosiek.pl/
	global $map_latin2,$map2_latin2;
	$url = str_replace($map_latin2,$map2_latin2,$url);
	$url = preg_replace('#[\W]{1,}#','-',$url);
	$url = trim($url,'-');
	$url = strtolower($url);
	return $url;
}

Życzę miłego tworzenia przyjaznych adresów dla wyszukiwarek i użytkowników (wiesz w co klikasz widząc sam link).

compress JavaScript code – compressor

compress JavaScript code – compressor

Kompresja kodu JavaScript jest gotową funkcją PHP która za pomocą wyrażeń regularnych usuwa zbędne znaki ze skryptu JavaScript co powoduje zmniejszenie jego rozmiaru. Skutkiem tego jest przyspieszona obsługa skryptu (jego wykonanie) jak i szybsze wczytanie pliku se skryptem lub strony z osadzonym skryptem w znacznikach <script></script> co powoduje także zmniejszenie zużycia transferu, który jest wymagany do wysłania nie skompresowanego kodu w pliku do klienta (przeglądarki).

Działanie można przetestować na: Kompresja JavaScript

Aktualnie usuwane lub zamieniane są zbędne rzeczy takie jak

  • Tabulator Pionowy – vertical tab – 0×0B (\x0B)
  • Znak powrotu karetki – 0×0D (\r, \x0D)
  • Tabulatory zmienia na pojedynczą spację – TAB – 0×09 (\t, \x09)
  • Każdą podwójną spację (i więcej np. 3, 4 i tak dalej) zamienia na pojedynczą 0×20 – (\x20)
  • Wszystkie komentarze
  • Pojedyncze spacje tylko w określonych miejscach (określonych w zmiennej $char_js)
  • Ewentualnie przejścia do nowych linii – 0×0A (\n, \x0A)

Domyślnie nie są usuwane spacje powiązane ze zmienną $char_js oraz przejścia do nowych linii!!! Można uzyskać ten efekt przekazując odpowiednie wartości do funkcji.

function compress_javascript($js_code,$special_chars=false,$remove_new_lines=false) {
/*********************
//
//Compress JavaScript by tosiek - https://tosiek.pl/
//
*********************/
//
// Arrays
//
//array with pattern
	$pattern=array(
		//remove carriage return
		"/\x0D/",
		//remove vertical tab
		"/\x0B/",
		//Replace tabulators to one space
		"/\x09{1,}/si",
		//Replace more then one spaces to once
		"/\x20{2,}/",
		//Remove JS comments and HTML
		'/((?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:\/\/.*))/','/<!--.*?-->/si',
	);
	if($special_chars==true) {
	//Special JavaScript characters after and before the spaces are removed
		$char_js='(|)|=|;|:|?|\'|"|+|-|\*|\/|%|!|<|>|&|\|[|]|{|}';
		//remove spaces with $char_js, after and before
		$pattern[]="/([{$char_js}]+)\x20/";
		$pattern[]="/\x20([{$char_js}]+)/";
	}
	if($remove_new_lines==true) {
		$pattern[]="/\x0A/";
	}
	//array with replacement
	$replacement=array(
		//remove carriage return
		'',
		//remove vertical tab
		'',
		//Replace tabulators to one space
		"\x20",
		//Replace more then one spaces to once
		"\x20",
		//Remove JS comments and HTML
		'','',
	);
	if($special_chars==true) {
	//remove spaces with $char_js, after and before
		$replacement[]='$1';
		$replacement[]='$1';
	}
	if($remove_new_lines==true) {
		$replacement[]='';
	}
	$start=strlen($js_code);
	//Compress JS with regular expressions
	$replace=preg_replace($pattern,$replacement,$js_code,-1);
	// strlen() after compress
	$final=strlen($replace);
	//counts the difference in characters
	$exhed=$start-$final;
	//counts the difference in percentages
	$compression=round(($exhed)/$start*100,2);
	return $replace."\n//Before compress $start bytes; After compress: $final bytes; $exhed ({$compression}%)";
}

Przykładowe użycie funkcji bez dodatkowych wartości (bez usuwania spacji oraz nowych linii)

<?php
$code='if ( top.location  !=  self.location   )
	{ 
top.location.href =  self.location;
}';
$code = compress_javascript($code);
echo $code;
?>

Wyświetli nam:

if ( top.location != self.location )
 { 
top.location.href = self.location;
}
//Before compress 82 bytes; After compress: 77 bytes; 5 (6.09999999999999964472863%)

Lecz nadal widać zbędne spację więc podajmy funkcji jako drugi argument wartość prawda (true) co spowoduje usunięcie zbędnych spacji przy znakach specjalnych

$code = compress_javascript($code,1);

Da nam efekt:

if(top.location!=self.location)
{
top.location.href=self.location;
}
//Before compress 82 bytes; After compress: 68 bytes; 14 (17.0700000000000002842171%)

Do zupełnej kompresji kodu możemy dodać trzeci argument, który usuwa znaki nowych linii (tylko dla znawców JavaScript)

Usuwanie znaków specjalnych i nowych linii

$code = compress_javascript($code,1,1);

da efekt:

if(top.location!=self.location){top.location.href=self.location;}
//Before compress 82 bytes; After compress: 65 bytes; 17 (20.7300000000000004263256%)

Usuwanie nowych linii, bez usuwania spacji obok znaków specjalnych

$code = compress_javascript($code,0,1);

da efekt:

if ( top.location != self.location ) { top.location.href = self.location;}
//Before compress 82 bytes; After compress: 74 bytes; 8 (9.75999999999999978683718%)

phpBB 3 by przemo

phpBB 3 by przemo

phpBB3 by przemo niewątpliwie istnieje szansa na wydanie trzeciej wersji phpBB zmodyfikowanej przez przema jak i zapewne inne osoby… Aczkolwiek wersja phpBB 3.0.0 została wydana 13 grudnia 2007 (wersja phpBB 2 została wydana 4 kwietnia 2002 a wersja phpBB2 modified by przemo niewiadomego marca 2003)… Data mówi sama za siebie, ale daty nie mówią… Wiec pozostaje czekać.

W wersji trzeciej w porównaniu z phpBB2 przybyło wiele funkcji, dzięki czemu phpBB3 dorównuje funkcjonalnością phpBB2 by przemo. Są to między innymi:

  • Rozszerzony panel administracyjny ACP
  • Panel moderacyjny – panel moderatora MCP
  • Rozszerzone i przebudowane zarządzanie kontem użytkownika UCP
  • Zaawansowany system zezwoleń zwany także uprawnieniami
  • Moduł obsługi załączników – jest już w standardzie
  • Dodawanie własnych kodów BBCode
  • Własne pola w profilu
  • System ostrzeżeń
  • Raportowanie postów – system raportów
  • System przyjaciół i wrogów
  • W standardzie nowy ciekawy styl o nazwie prosilver

Więc funkcjonalnością już zaczyna ciekawić. Przy konwersji z phpBB 2 by przemo do zwykłego phpBB 3 zostają bez problemów przeniesione załączniki, avatary użytkowników jak i rangi oraz grupy. Mogą pojawić się drobne komplikacje z kategoriami ponieważ w phpBB3 nie istnieje takie coś jak kategorie, lecz bez problemów można to poprawić w panelu administratora.

Do pełnego szczęścia brakuje jeszcze portalu, downloadu oraz albumu zdjęć co niestety przy konwersji do zwykłego phpBB3 utracimy.

W oczekiwaniu na phpBB 3 by przemo możemy zaprzyjaźnić się ze zwykłym phpBB 3 chociażby dla zapoznania się z systemem uprawnień, który jest strasznie rozbudowany i na początku jest nie do zrozumienia.

tablica ze statusami błędów http

Tablica ze statusami błędów HTTP + tłumaczenie po polsku oraz wpisy do pliku .htaccess z tymi błędami:

//Tablica ze statusami błędów by tosiek ( https://tosiek.pl/ )
$errors = array(
	//Client errors - po stronie klienta
	'400'=>array('Bad Request','Błędne żądanie'),
	'401'=>array('Unauthorized','Brak autoryzacji'),
	'402'=>array('Payment Required','Wymagana opłata'),
	'403'=>array('Forbidden','Dostęp zabroniony'),
	'404'=>array('Not Found','Nie znaleziono'),
	'405'=>array('Method Not Allowed','Metoda nie dozwolona'),
	'406'=>array('Not Acceptable','Brak akceptacji'),
	'407'=>array('Proxy Authentication Required','Wymagana autoryzacja proxy'),
	'408'=>array('Request Time-out','Zapytanie przekroczyło czas oczekiwania'),
	'409'=>array('Conflict','Konflikt'),
	'410'=>array('Gone','Zniknął'),
	'411'=>array('Length Required','Wymagana długość'),
	'412'=>array('Precondition Failed','Nie spełniono warunku wstępnego'),
	'413'=>array('Request Entity Too Large','Zbyt duże żądanie'),
	'414'=>array('Request-URI Too Large','Adres URI zapytania jest zbyt długi'),
	'415'=>array('Unsupported Media Type','Niewspierany typ medium'),
	'416'=>array('Requested range not satisfiable','Żądany zakres nie obsługiwany'),
	'417'=>array('Expectation Failed','Niepowodzenie oczekiwania'),
	//Server errors - po stronie serwera
	'500'=>array('Internal Server Error','Wewnętrzny błąd serwera'),
	'501'=>array('Not Implemented','Niezaimplementowane'),
	'502'=>array('Bad Gateway','Błąd bramy'),
	'503'=>array('Service Unavailable','Usługa niedostępna'),
	'504'=>array('Gateway Time-out','Przekroczony czas oczekiwania bramy'),
	'505'=>array('HTTP Version not supported','Brak wsparcia dla tej wersji HTTP'),
	'509'=>array('Bandwidth Limit Exceeded','Przekroczono limit transferu'),
);

Do tablicy odnosimy się:
$errors[numer_błędu][jezyk_opisu]
(gdzie jezyk_opisu to: 1 – polski, 0 – angielski który jest także nagłówkiem dla przeglądarki)

Więc dla polskiego opisu dla błędu 404:
$errors[404][‘1’]

Dla angielskiego opisu dla błędu 404: (angielski opis jest takze nagłówkiem wysyłanym do przeglądarki)
$errors[404][‘0’]

Wpisy do pliku .htaccess ze wszystkimi wyżej wymienionymi błędami HTTP:

#Bledy numeryczne na error.php
RewriteRule ^([0-9][0-9][0-9])+$ /errorek.php?error=$1 [L,NC]
#Bledy HTTP - wlasna strona bledu
#Client error - po stronie klienta
ErrorDocument 400 /400
ErrorDocument 401 /401
ErrorDocument 402 /402
ErrorDocument 403 /403
ErrorDocument 404 /404
ErrorDocument 405 /405
ErrorDocument 406 /406
ErrorDocument 407 /407
ErrorDocument 408 /408
ErrorDocument 409 /409
ErrorDocument 410 /410
ErrorDocument 411 /411
ErrorDocument 412 /412
ErrorDocument 413 /413
ErrorDocument 414 /414
ErrorDocument 415 /415
ErrorDocument 416 /416
ErrorDocument 417 /417
#Server error - po stronie serwera
ErrorDocument 500 /500
ErrorDocument 501 /501
ErrorDocument 502 /502
ErrorDocument 503 /503
ErrorDocument 504 /504
ErrorDocument 505 /505
ErrorDocument 509 /509

Jak widać powyżej strony błędów są pobierane z adresu /XXX gdzie XXX to numer błędu. Natomiast reguła RewriteRule wczytuje dokument errorek.php ze zmienną GET error=$1 gdzie $1 to numer błedu jak i adres wywołanej strony.