Apache HTTP Sunucusu Sürüm 2.2
Apache’de Ortam Değişkenleri
Apache HTTP Sunucusunda bilgiyi değişkenlerde saklamak için ortam değişkenleri adı verilen bir mekanizma bulunur. Saklanan bu bilgi erişim denetimi, günlük kaydı gibi çeşitli işlemleri denetlemekte kullanılabilir. Değişkenler ayrıca, CGI betikleri gibi harici uygulamalarla iletişim mekanizması olarak da kullanılabilir. Bu belgede bu değişkenler üzerindeki işlemlere ve kullanım şekillerine değinilmiştir.
Bu değişkenlere ortam değişkenleri dense de işletim sisteminin ortam değişkenleri gibi değillerdir. Bunlar sadece Apache ortamında geçerli değişkenler olup işletim sisteminin bu değişkenlerden haberi olmaz. Sadece CGI betikleri ve SSI sayfaları gibi harici uygulamalar tarafından üretilen ortam değişkenleri sistem ortamının değişkenleri haline gelirler. İşletim sistemi ortamına çalışmakta olan sunucudan müdahale etmek isterseniz işletim sisteminizin kabuğu tarafından sağlanan standart ortam müdahale mekanizmalarını kullanmalısınız.
Ortam Değişkenlerinin Atanması
İlgili Modüller | İlgili Yönergeler |
---|---|
Temel Ortamda Değişiklik
Apache ortamında bir ortam değişkenine müdahale etmenin en temel
yolu hiçbir koşula tabi olmayan SetEnv
yönergesini kullanmaktır. Bu değişkenleri Apache
başlatılırken sistem ortam değişkenleri haline getirmek için
PassEnv
yönergesi
kullanılabilir.
İsteğe Bağlı Şartlı Atamalar
Esnekliği arttırmak için, mod_setenvif
modülü ile
isteğin özelliklerine uygun olarak her isteğe özel değişkenler
atayabilmek mümkün kılınmıştır. Örneğin, bir değişken sadece isteği
yapan tarayıcıya özgü bir değerle veya sadece belli bir başlık
alanınına bağlı olarak atanabilir. Daha da esnek bir mekanizma,
ortam değişkeni atamak için [E=...]
seçeneğinin
kullanıldığı mod_rewrite
modülünün RewriteRule
yönergesi ile
sağlanmıştır.
Eşsiz Betimleyiciler
Son olarak, mod_unique_id
UNIQUE_ID
ortam değişkenine her istek için o isteğin çok özel koşullar altında
tüm diğer istekler arasında eşsizliğini garanti edecek bir değer
atar.
Standart CGI Değişkenleri
Apache yapılandırmasıyla atanan ve kabuğa aktarılan ortam değişkenlerinden başka CGI Belirtiminin gerektirdiği istekler hakkında temel bilgileri içeren ortam değişkenlerinin CGI betikleri ve SSI sayfalarınca atanabilmesi sağlanmıştır.
Bazı Yetersizlikler
- Standart CGI değişkenlerini ortam değişkenlerine müdahale yönergelerini kullanarak değiştirmek veya geçersiz kılmak mümkün değildir.
- CGI betiklerini çalıştırmak için
suexec
kullanıldığında ortam, CGI betikleri çalıştırılmadan önce güvenilir değişkenler kalacak şekilde temizlenir. Güvenilir değişken listesisuexec.c
içinde derleme sırasında tanımlanır. - Taşınabilirlik adına, ortam değişkenlerinin isimleri sadece harfler, rakamlar ve alt çizgi imlerini içerebilir. Bunlara ek olarak ismin ilk karakteri bir rakam olmamalıdır. Değişkenler CGI betiklerine ve SSI sayfalarına aktarılırken bu sınırlamalara uygun olmayan karakterlerin yerlerine alt çizgi imleri konur.
- İsteklerin işleme konması sırasında
SetEnv
yönergesi geç çalıştırılır, yaniSetEnvIf
veRewriteCond
gibi yönergelerSetEnv
ile atanan değişken değerlerini görmezler.
Ortam Değişkenlerinin Kullanımı
İlgili Modüller | İlgili Yönergeler |
---|---|
CGI Betikleri
Ortam değişkenlerinin başlıca amaçlarından biri CGI betikleriyle iletişim kurmaktır. Yukarıda bahsedildiği gibi CGI betiklerine aktarılan ortam Apache yapılandırmasında atanan değişkenlere ek olarak istek hakkında standart temel bilgileri de içerir. Bu konuda ayrıntılı bilgi edinmek için CGI Öğreticisine bakabilirsiniz.
SSI Sayfaları
Sunucu tarafında mod_include
modülünün
INCLUDES
süzgeci ile yorumlanan SSI sayfalarında ortam
değişkenleri echo
elemanı ile basılabilir ve sayfayı
isteğin özelliklerine uygun olarak oluşturmak için ortam
değişkenleri akış denetim elemanları içinde kullanılabilir. Apache
ayrıca, yukarıda bahsedildiği gibi standart CGI ortam değişkenli SSI
sayfalarını da sağlayabilmektedir. Daha ayrıntılı bilgi edinmek için
SSI Öğreticisine bakabilirsiniz.
Erişim Denetimi
allow from env=
ve deny from env=
yönergeleri sayesinde ortam değişkenlerine dayalı olarak sunucuya
erişim denetim altında tutulabilir. Bunlar SetEnvIf
yönergesi ile birlikte
kullanılmak suretiyle sunucuya erişim isteğin özelliklerine bağlı
olarak daha esnek bir tarzda denetlenebilir. Örneğin, belli bir
tarayıcının sunucuya erişimi bu yönergelerle engellenebilir.
Şartlı Günlük Kaydı
Ortam değişkenleri LogFormat
yönergesinin %e
seçeneği
kullanılarak erişim günlüğüne kaydedilebilir. Bundan başka,
CustomLog
yönergesi
sayesinde isteklerin günlüğe kaydedilip kaydedilmeyeceğine ortam
değişkenlerine dayalı olarak karar verilmesi sağlanabilir. Bunlar
SetEnvIf
yönergesi ile
birlikte kullanılmak suretiyle günlük kayıtları isteğin
özelliklerine bağlı olarak daha esnek bir tarzda denetlenebilir.
Örneğin, gif
uzantılı dosyalar için yapılan isteklerin
günlüğe kaydedilmemesi veya sadece alt ağınızın dışından gelen
isteklerin günlüğe kaydedilmesini isteyebilirsiniz.
Şartlı Yanıt Başlıkları
Header
yönergesi belli
bir yanıt başlığının istemciye gönderilip gönderilmeyeceğine belli
bir ortam değişkeninin varlığına bakarak karar vermek için
kullanılabilir. Böylece örneğin, belli bir başlığın istemciye
gönderilmesine istemciden belli bir başlığın alınıp alınmadığına
bağlı olarak karar verilebilir.
Harici Süzgeçlerin Etkinleştirilmesi
mod_ext_filter
tarafından yapılandırılan harici
süzgeçler ExtFilterDefine
yönergesinin disableenv=
ve
enableenv=
seçenekleri kullanılarak bir ortam
değişkenine bağlı olarak etkinleştirilebilir.
URL Kurgulaması
RewriteCond
yönergesinin SınamaDizgesi olarak kullanılan
%{ENV:değişken}
biçemi
mod_rewrite
yeniden yazma motorunun ortam
değişkenlerine bağlı kararlar almasını mümkün kılar. Yalnız şuna
dikkat ediniz: mod_rewrite
’ta ENV:
öneki kullanılmadan belirtilen değişkenler ortam değişkenleri
değillerdir. Onlar mod_rewrite
’a özgü diğer
modüllerden erişilemeyen özel değişkenlerdir.
Özel Amaçlı Ortam Değişkenleri
Birlikte çalışabilirlik sorunları Apache’nin belli istemcilerle
veri alışverişi sırasında davranışını değiştirmesini gerektirebilir.
Genellikle SetEnv
ve
PassEnv
yönergelerinden
başka BrowserMatch
gibi yönergelerle ortam değişkenleri atanarak bunu sağlayan
mekanizmaların olabildiğince esnek davranabilmesi sağlanabilir.
downgrade-1.0
İstek, daha yüksek bir HTTP protokolüyle yapılmış olsa bile HTTP/1.0 isteği olarak ele alınır.
force-gzip
DEFLATE
süzgeci etkinse tarayıcının tercih ettiği
kodlama koşulsuz olarak yoksayılarak sıkıştırılmış çıktı
gönderilir.
force-no-vary
İstemciye gönderilmeden önce yanıttan Vary
alanının
çıkarılmasına sebep olur. Bazı istemciler bu alanı gerektiği gibi
yorumlayamazlar, bu değişken atanarak bu sorunla karşılaşılmamaya
çalışılır. Bu değişkenin atanması ayrıca
force-response-1.0 değişkeninin de atanmasına sebep
olur.
force-response-1.0
HTTP/1.0 isteği yapan istemcilere HTTP/1.0 yanıtı verilmesini zorunlu kılar. AOL vekillerindeki bir sorun nedeniyle gerçeklenmiştir. Bazı HTTP/1.0 istemciler HTTP/1.1 yanıtlarında doğru davranmayabilirler; bu değişken atanarak bunların sorunları giderilebilir.
gzip-only-text/html
Bu değişkene "1" değeri atandığında text/html
’den
farklı içerik türleri için mod_deflate
modülü
tarafından sağlanan DEFLATE
çıktı süzgeci iptal
edilir. Sıkıştırılmış olarak saklanan dosyalar kullanıyorsanız bu
değişkeni mod_negotiation
modülü de dikkate alır
(kimliğine bakarak sadece gzip için değil, tüm kodlamalar için bunu
yapar).
no-gzip
Bu değişken atandığında, mod_deflate
modülünün
DEFLATE
süzgeci kapatılır ve
mod_negotiation
modülü kodlanmış kaynak teslimatını
reddeder.
no-cache
2.2.12'den sonraki sürümlerde kullanılabilmektedir.
Atandığı takdirde, mod_cache
başka bir
önbelleklenebilir yanıtı kaydetmeyecektir. Bu ortam değişkeni, bir
yanıtın geçerli bir istek için evvelce önbelleğe alınmış olduğu
anlamına gelmez.
nokeepalive
Bu değişken atandığında, KeepAlive
yönergesi iptal edilir.
prefer-language
Değer olarak en
, ja
veya
x-klingon
gibi bir dil kısaltması verilerek atanmışsa
mod_negotiation
modülünün normal davranışını
değiştirerek belirtilen dilde bir teslimat yapılmaya çalışılır.
Böyle bir belge yoksa normal uzlaşım süreci uygulanır.
redirect-carefully
İstemciye bir yönlendirme gönderirken sunucuyu daha dikkatli olmaya zorlar. Bu genellikle istemcinin yönlendirmeler konusunda sorunlu olduğu bilindiği takdirde yararlı olur. Bu değişkenin gerçeklenme sebebi, dizin kaynaklarına yönlendirmeler için DAV yöntemlerini kullanan Microsoft'un WebFolders yazılımındaki bir sorundur.
suppress-error-charset
2.0.54 sürümünden beri mevcuttur.
Apache bir isteğe bir yönlendirme ile yanıt verdiğinde istemci yönlendirmeyi kendiliğinden yapmaz veya yapamazsa kullanıcıya yanıtla birlikte gönderilen metin gösterilir. Apache normal olarak bu metni ISO-8859-1 ile kodlar.
Ancak, yönlendirmenin yapıldığı sayfa farklı bir karakter kümesine sahipse bazı tarayıcı sürümleri asıl sayfanın karakter kodlaması yerine yönlendirmenin kodlamasını kullanmaya çalışırlar. Bu özellikle Yunanca gibi dillerde hedef sayfanın hatalı yorumlanmasına yol açar.
Bu ortam değişkeninin atanması Apache’nin yönlendirme için karakter kümesi belirtmemesini sağlamak suretiyle hatalı tarayıcıların hedef sayfayı yanlış karakter kodlamasıyla yorumlamasını önler.
Güvenlik Uyarısı
Hata sayfalarının bir karakter kümesi belirtilmeksizin yollanması, HTTP/1.1 belirtimine uymayan ve karakter kümesini içeriğe bakarak tahmin etmeye çalışan tarayıcılarda (MSIE) karşı siteden betik saldırısı yorumuna sebep olabilir. Girdi verisindeki UTF-7 içerik (istek betimleyici gibi) karşı siteden betik saldırılarını engellemek için tasarlanmış normal önceleme mekanizmalarıyla öncelenmeyeceği için böyle tarayıcılar UTF-7 karakter kodlaması kullanılarak kolayca aldatılabilir.
force-proxy-request-1.0
,
proxy-nokeepalive
, proxy-sendchunked
ve
proxy-sendcl
, proxy-chain-auth
,
proxy-interim-response
, proxy-initial-not-pooled
Bu yönergeler mod_proxy
modülünün normal protokol
davranışını değiştirirler. Daha ayrıntılı bilgi için
mod_proxy
ve mod_proxy_http
belgelerine bakınız.
Örnekler
Protokolü yanlış yorumlayan tarayıcıların davranışlarının değiştirilmesi
Önceki sürümlerde bilinen istemci davranışlarına karşı önlem olarak
aşağıdaki satırların httpd.conf
içinde bulunması
önerilirdi. Fakat, böyle tarayıcılar artık ortalıkta görünmediğinden
bu yapılandırmaya da artık gerek kalmamıştır.
# # Aşağıdaki yönergeler normal HTTP yanıt davranışını değiştirirler. # İlk yönerge Netscape 2.x ve kendini öyle gösteren tarayıcılar için # kalıcı bağlantıyı (keepalive) iptal eder. İkinci yönerge ise HTTP/1.1 # protokolü bozuk olan ve 301/302 durum kodlu yönlendirme yanıtları # kullanıldığında kalıcı bağlantıları gerektiği gibi desteklemeyen # Microsoft Internet Explorer 4.0b2 içindir. # BrowserMatch "Mozilla/2" nokeepalive BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 # # Aşağıdaki yönergeler HTTP/1.0 yanıtlarından başkasına yabancı olan # tarayıcılara HTTP/1.1 yanıtlarının gönderilmesini iptal eder. # BrowserMatch "RealPlayer 4\.0" force-response-1.0 BrowserMatch "Java/1\.0" force-response-1.0 BrowserMatch "JDK/1\.0" force-response-1.0
Resim isteklerinin erişim günlüğüne kaydedilmemesi
Bu örnek resim isteklerinin erişim günlüğüne yazılmasını engeller. Bu örnek değiştirilerek belli dizinlerin veya belli konaklardan gelen isteklerin günlüğe kaydedilmesini engellemek amacıyla da kullanılabilir.
SetEnvIf Request_URI \.gif image-request
SetEnvIf Request_URI \.jpg image-request
SetEnvIf Request_URI \.png image-request
CustomLog logs/access_log common env=!image-request
“Resim Hırsızlığı” için önlem alınması
Bu örnekte sunucunuzda bulunmayan sayfalarda sunucunuzdaki
resimlerin kullanılmasının nasıl önleneceği gösterilmiştir. Bu
yapılandırma önerilmemekle birlikte nadir durumlarda işe yarar. Tüm
resimlerin /siteler/resimler
dizini altında tutulduğu
varsayılmıştır.
SetEnvIf Referer "^http://www\.example\.com/" local_referal
# Referrer bilgisi göndermeyen tarayıcılara izin verelim
SetEnvIf Referer "^$" local_referal
<Directory /siteler/resimler>
Order Deny,Allow
Deny from all
Allow from env=local_referal
</Directory>
Bu teknik hakkında daha ayrıntılı bilgi edinmek için ServerWatch üzerindeki "Diğer sitelerin sizin resimlerinizle donatılmasını engellemek" belgesine bakınız.