Hata Yanıtlarının Kişiselleştirilmesi

Apache HTTP Sunucusu 4xx veya 5xx HTTP durum kodları ile ilgili olaylarda soysal hata yanıtları üretse de bu yanıtlar site kullanıcılarına aşırı sade, bilgi vermez ve hatta korkutucu gelebilir. Daha dostça yazılmış, İngilizce değil de kendi dilinizde ve belki sayfalarınızın yerleşimine uygun daha hoş satırlarda özel hata yanıtları üretmek isteyebilirsiniz.

Kişiselleştirilmiş hata yanıtları, bir hata durumuna göre tasarlanmış herhangi bir HTTP durum kodu (yani 4xx ve 5xx kodlarından biri) için tanımlanabilir.

Ek olarak bir değer kümesi de sağlanmıştır. Böylece hata belgeleri, Sunucu taraflı İçerik Yerleştirme kullanılarak bu değişkenlerin değerlerine göre özelleştirilebilir. İsterseniz bunun yerine bir CGI programı veya devingen bir eylemci (PHP, mod_perl, vs.) kullanarak da bu değişkenlerin değerlerine göre hata sayfalarınızı üretebilirsiniz.

Yapılandırma

Kişiselleştirilmiş hata belgeleri ErrorDocument yönergesi kullanılarak yapılandırılabilir. Bu yönerge küresel bağlamda olabileceği gibi sanal konak ve dizin bağlamlarında da kullanılabilir. AllowOverride yönergesine FileInfo atanarak .htaccess dosyalarında da kullanılabilir.

ErrorDocument 500 "Pardon, galiba bizim betik hata verdi."
ErrorDocument 500 /cgi-bin/hata-kurtarma
ErrorDocument 500 http://error.example.com/server_error.html
ErrorDocument 404 /ozuru_kabahatinden_buyuk/yok.html
ErrorDocument 401 /Uyeler/NASIL_uye_olunur.html

ErrorDocument yönergesinin sözdizimi:

ErrorDocument <3-rakamlı-kod> <eylem>

eylem şunlardan biri olabilir:

  1. Yönlendirmenin yapılacağı dahili adres (eylem bir "/" ile başlıyorsa).
  2. Yönlendirmenin yapılacağı harici adres (eylem geçerli bir URL ise).
  3. Gösterilecek metin (yukardakilerin hiçbiri yoksa). Birden fazla sözcük içeriyorsa tırnak (") içine alınmalıdır.

Yerel bir adrese yönlendirme yapılırken ek ortam değişkenleri de atanarak yanıt daha da özelleştirilebilir. Bunlar harici URL'lere gönderilmez.

Kullanılabilen Değişkenler

Hata durumunu açıklayacak veya hata günlüğüne daha açıkça kaydedilebilecek bazı bilgilerin aktarılması koşuluyla, başka bir adrese yönlendirme kullanışlı olabilir

Hata yönlendirmesi yapılırken bunu sağlamak için ek ortam değişkenleri tanımlanır. Bu değişkenlerin isimleri, özgün istekle sağlanan başlık isimlerinin önüne 'REDIRECT_' dizgesi getirilerek üretilir. Böylece özgün istek bağlamından hata belgesi üretilebilir.

Örneğin, aşağıdaki gibi, daha yararlı olacak ek ortam değişkenleri alabilirsiniz.

REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/jpeg, image/png
REDIRECT_HTTP_USER_AGENT=Mozilla/5.0 Fedora/3.5.8-1.fc12 Firefox/3.5.8
REDIRECT_PATH=.:/bin:/usr/local/bin:/sbin
REDIRECT_QUERY_STRING=
REDIRECT_REMOTE_ADDR=121.345.78.123
REDIRECT_REMOTE_HOST=client.example.com
REDIRECT_SERVER_NAME=www.example.edu
REDIRECT_SERVER_PORT=80
REDIRECT_SERVER_SOFTWARE=Apache/2.2.15
REDIRECT_URL=/cgi-bin/buggy.pl

REDIRECT_ ortam değişkenleri, yönlendirme öncesi varolan ortam değişkenlerinden üretilir. Bunlar önlerine REDIRECT_ getirilerek yeniden isimlendirilir. Örneğin, HTTP_USER_AGENT değişkeni REDIRECT_HTTP_USER_AGENT haline gelir.

REDIRECT_URL, REDIRECT_STATUS ve REDIRECT_QUERY_STRING mutlaka atanır. Diğer başlıklarla ilgili olanlar ise hata durumu öncesinde mevcut oldukları takdirde üretilirler.

Eğer ErrorDocument hedefi bir harici yönlendirme ise bunların hiçbiri üretilmez (sunucunun bulunduğu konağı hedeflese bile http: ile başlayan herşey harici yönlendirme sayılır).

Özel Hata Yanıtları

Hata yanıtınızı üretmek için sunucu taraflı içerik yerleştirme, bir CGI betiği veya başka bir eylemciyi devingen eylemci olarak kullanıyorsanız, bu yanıtı özelleştirmek için bu kullanıma özel üretilmiş ortam değişkenlerini kullanmak isteyebilirsiniz.

ErrorDocument yönergesi bir CGI betiğine bir yerel yönlendirme belirtiyorsa, hatanın kaynağı hakkında istemciye bilgi vermek amacıyla betiğin çıktısında bir "Status:" başlık alanına yer verilmelidir. Örneğin, bir Perl betiği şunları içerebilirdi:

...
print "Content-type: text/html\n";
printf "Status: %s durumu saptandı.\n", $ENV{"REDIRECT_STATUS"};
...

Eğer betik, 404 Not Found gibi, belli bir hata durumunu ele almaya adanmışsa duruma özel kod ve hata metni kullanılabilir.

Eğer yanıt, (istemci taraflı yönlendirme yapılırken) bir Location: başlığı da içeriyorsa betiğin çıktıya uygun bir Status: başlığı (302 Found) eklemesinin gerekli oluşuna dikkat ediniz. Aksi takdirde, Location: başlığı etkisiz olabilir.

Çok Dilli Özel Hata Belgeleri

Apache HTTP Sunucusunun kurulumunda, 16 dile çevrilmiş özel hata iletileri belgeleri içeren bir dizin bulunmaktadır. Ayrıca, conf/extra yaplandırma dizininde bu özelliği etkin kılmak için yapılandırmaya dahil edilebilecek bir yapılandırma dosyası vardır.

Sunucu yapılandırma dosyanızda şöyle satırlar görebilirsiniz:

# Multi-language error messages
#Include conf/extra/httpd-multilang-errordoc.conf

Bu Include satırını açıklama olmaktan çıkarırsanız bu özelliği etkinleştirmiş olursunuz. Böylece, istemcinin tarayıcısında belirtilmiş dil tercihine uygun dil uzlaşımlı hata iletileri sağlanır.

Ek olarak, bu belgeler çeşitli REDIRECT_ değişkenleri içerir. Böylece, son kullanıcıya neler olduğu ve şimdi ne yapması beklendiği hakkında ek bilgiler sağlanabilir.

Bu belgeleri istediğiniz kadar özelleştirebilir, kullanıcıya siteniz hakkında ve orada bulabilecekleri şeylere dair faydalı bilgiler de sağlayabilirsiniz.

Bu özelliği kullanmak için mod_include ve mod_negotiation etkin kılınmalıdır.