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

Apache, bazı sorunlara ve hatalara karşılık vereceği yanıtların yapılandırabilmesini mümkün kılan ek bir işlevselliğe sahiptir.

Site yöneticisi tarafından kişiselleştirilebilen bu tür yanıtlar, sunucu belli hatalar veya sorunlarla karşılaştığında etkin kılınmak üzere tanımlanabilir.

Bir betik bir hata nedeniyle bir "500 Server Error" yanıtının verilmesine sebep olursa bu yanıt yerine başka bir adrese yönlendirilerek (dahili veya harici) veya doğrudan daha dostça bir metin sunulabilir.

# Davranış

## Eski Davranış

NCSA httpd 1.3, çoğunlukla kullanıcıya anlamsız gelen ve sebebiyle kavramsal bir bağ kurulamayan günlük kayıtları üreten, can sıkıcı bazı hata/sorun yanıtları döndürürdü.

## Yeni Davranış

Sunucudan NCSA kodlu iletiler yerine

- başka bir metin göstermesi,
- istemciyi başka bir yerel adrese yönlendirmesi veya
- istemciyi bir harici adrese yönlendirmesi

istenebilir. Başka bir adrese yönlendirme, hata veya sorunu daha iyi açıklamakta kullanılabilecek bazı bilgilerin aktarılması şartıyla oldukça kullanışlı olabilir.

Apache, buna olanak vermek için CGI benzeri yeni ortam değişkenleri tanımlamıştır:

REDIRECT_HTTP_ACCEPT=*/*, image/gif, image/x-xbitmap, image/jpeg
REDIRECT_HTTP_USER_AGENT=Mozilla/1.1b2 (X11; I; HP-UX A.09.05 9000/712)
REDIRECT_PATH=.:/bin:/usr/local/bin:/etc
REDIRECT_QUERY_STRING=
REDIRECT_REMOTE_ADDR=121.345.78.123
REDIRECT_REMOTE_HOST=ooh.ahhh.dom
REDIRECT_SERVER_NAME=batti.balik.yan.gider.edu
REDIRECT_SERVER_PORT=80
REDIRECT_SERVER_SOFTWARE=Apache/0.8.15
REDIRECT_URL=/cgi-bin/hatalar.pl

`REDIRECT_` önekine dikkat edin.

Yeni adrese (hedefin bir CGI betiği veya SSI sayfası olduğu kabulüyle) en azından `REDIRECT_URL` ve `REDIRECT_QUERY_STRING` değişkenleri aktarılır. Diğer değişkenler ise sadece hata veya sorunun öncesinde mevcut oldukları takdirde aktarılacaklardır. Eğer harici yönlendirmeyi ErrorDocument yönergesi üzerinden yapıyorsanız bunlara None değeri atanacaktır. (Yönlendirme adresi `http:` ile başlıyorsa adres aynı sunucuya ait olsa bile bu bir harici yönlendirme olarak ele alınır.)

# Yapılandırma

ErrorDocument yönergesinin `.htaccess` dosyalarında kullanılması sadece AllowOverride yönergesine uygun bir değer atanmışsa mümkündür.

Bazı örnekler:

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

Burada sözdizimi şöyledir:

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

`eylem` şunlardan biri olabilir:

- Gösterilecek metin. Metin tırnak (") içine alınmalıdır.
- Yönlendirmenin yapılacağı harici adres.
- Yönlendirmenin yapılacağı dahili adres.

# Özel Hata Yanıtları ve Yönlendirme

Apache’nin yönlendirme ile ilgili davranışı bir CGI betiği veya SSI sayfası sözkonusu olduğunda bazı ek ortam değişkenleri ile yapılandırılabilir.

## Eski Davranış

Yönlendirme yapılan betikte standart CGI değişkenleri kullanılırdı. Yönlendirmenin kaynağı ile ilgili bir belirtiye rastlanmazdı.

## Yeni Davranış

Yönlendirme yapılan betikte kullanılmak üzere özel olarak tanımlanmış ortam değişkenleri vardır. Her değişkenin ismi `REDIRECT_` ile başlar. `REDIRECT_` ortam değişkenleri, yönlendirme öncesinde tanımlanmış CGI ortam değişkenlerinin isimlerinin başına `REDIRECT_` öneki getirilerek oluşturulur. Yani, `HTTP_USER_AGENT` değişkeni `REDIRECT_HTTP_USER_AGENT` haline gelir. Bunlara ek olarak, betiğe olayın izini sürmekte yardımcı olması için `REDIRECT_URL` ve `REDIRECT_STATUS` değişkenleri tanımlanmıştır. Erişim günlüğüne özgün adresle birlikte yönlendirme adresi de kaydedilir.

Eğer ErrorDocument yönergesi bir yerel CGI betiğine 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 verilmesi önerilir. Örneğin, bir Perl betiği şunları içerebilirdi:

...
print "Content-type: text/html; charset=UTF-8\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` gibi) eklemesinin gerekli oluşuna dikkat ediniz. Aksi takdirde, `Location:` başlığı etkisiz olabilir.