Apache HTTP Sunucusu Sürüm 2.2 Belgeleri - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme

Apache HTTP Sunucusu Sürüm 2.2 Belgeleri

Sürümlerin Dağıtım Bilgileri

  • Apache 2.1/2.2’deki yeni özellikler
  • Apache 2.0’daki yeni özellikler
  • 2.0’dan 2.2’ye yükseltme
  • Apache Lisansı

Başvuru Kılavuzu

  • Derleme ve Kurulum
  • Başlatma
  • Durdurma ve Yeniden Başlatma
  • Çalışma anı Yapılandırma Yönergeleri
  • Hızlı Yönerge Kılavuzu
  • Modüller
  • Çok Süreçlilik Modülleri (MPM’ler)
  • Süzgeçler
  • Eylemciler
  • Sunucu ve Desteklenen Programlar
  • Terimler

Kullanıcı Kılavuzu

  • Dinleme
  • Yapılandırma Dosyaları
  • Yapılandırma Bölümleri
  • İçerik Bellekleme
  • İçerik Dili Yönetimi
  • Devingen Paylaşımlı Nesneler (DSO’lar)
  • Ortam Değişkenleri
  • Günlük Dosyaları
  • URL’lerin Dosya Sistemi ile Eşlenmesi
  • Başarım Arttırma
  • Güvenlik İpuçları
  • Sunucu Genelinde Yapılandırma
  • SSL/TLS Şifrelemesi
  • CGI için Suexec Desteği
  • URL Yeniden Yazma Rehberi
  • Sanal Konaklar

Nasıllar ve Öğreticiler

  • Kimlik Doğrulama ve Yetkilendirme
  • Erişim Denetimi
  • CGI: Devingen İçerik
  • .htaccess dosyaları
  • Sunucu Taraflı İçerik Yerleştirme (SSI)
  • Kullanıcı Dizinleri (public_html)

Platformlara Özgü Bilgiler

  • Microsoft Windows
  • Novell NetWare
  • EBCDIC Port

Diğer Konular

  • Sıkça Sorulan Sorular
  • Site Haritası
  • Geliştiriciler için Belgeler
  • Diğer Bilgiler

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Upgrading to 2.2 from 2.0 - Apache HTTP Server Version 2.2

Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2

Upgrading to 2.2 from 2.0

In order to assist folks upgrading, we maintain a document describing information critical to existing Apache users. These are intended to be brief notes, and you should be able to find more information in either the New Features document, or in the src/CHANGES file.

This document describes only the changes from 2.0 to 2.2. If you are upgrading from version 1.3, you should also consult the 1.3 to 2.0 upgrading document.

See also

  • Overview of new features in Apache 2.2

Compile-Time Configuration Changes

The compilation process is very similar to the one used in version 2.0. Your old configure command line (as found in build/config.nice in the installed server directory) can be used in some cases. The most significant change required will be to account for changes in module names, in particular for the authentication and authorization modules. Some details of changes:

  • mod_imap has been renamed to mod_imagemap
  • mod_auth has been split up into mod_auth_basic, mod_authn_file, mod_authz_user, and mod_authz_groupfile
  • mod_access has been renamed to mod_authz_host
  • mod_auth_ldap has been renamed to mod_authnz_ldap
  • Upgraded to require the APR 1.0 API.
  • Updated bundled PCRE version to 5.0

Run-Time Configuration Changes

Your existing version 2.0 config files and startup scripts can usually be used unchanged in version 2.2. Some small adjustments may be necessary for particular configurations as discussed below. In addition, if you dynamically load the standard modules using the LoadModule directive, then you will need to account for the module name changes mentioned above.

If you choose to use the new default configuration file for version 2.2, you will find that it has been greatly simplified by removing all but the most essential configuration settings. A set of example configuration settings for more advanced features is present in the conf/extra/ directory of the installed server. Default configuration files are installed in the conf/original directory.

Some runtime configuration changes that you may notice:

  • The apachectl option startssl is no longer available. To enable SSL support, you should edit httpd.conf to include the relevant mod_ssl directives and then use apachectl start to start the server. An example configuration to activate mod_ssl has been included in conf/extra/httpd-ssl.conf.
  • The default setting of UseCanonicalName is now Off. If you did not have this directive in your config file, you can add UseCanonicalName On to retain the old behavior.
  • The module mod_userdir will no longer act on requests unless a UserDir directive specifying a directory name is present in the config file. To restore the old default behavior, place the directive UserDir public_html in your config file.
  • The directive AuthDigestFile from mod_auth_digest has been merged with AuthUserFile and is now part of mod_authn_file.

Misc Changes

  • The module mod_cache, which was experimental in Apache 2.0, is now a standard module.
  • The module mod_disk_cache, which was experimental in Apache 2.0, is now a standard module.
  • The module mod_mem_cache, which was experimental in Apache 2.0, is now a standard module.
  • The module mod_charset_lite, which was experimental in Apache 2.0, is now a standard module.
  • The module mod_dumpio, which was experimental in Apache 2.0, is now a standard module.

Third Party Modules

Many third-party modules designed for version 2.0 will work unchanged with the Apache HTTP Server version 2.2. But all modules must be recompiled before being loaded.

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


Apache 2.2’de Yeni olan Özellikler - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Apache 2.2’de Yeni olan Özellikler

Bu belgede Apache HTTP Sunucusunun 2.0 ve 2.2 sürümleri arasındaki başlıca farklara değinilmiştir. 1.3 sürümüne göre yeni özellikler için Apache 2.0’da Yeni olan Özellikler belgesine bakınız.

Çekirdekteki Gelişmeler

Authn/Authz
Mevcut kimlik doğrulama ve yetkilendirme modüllerinin iç işleyişi yeniden düzenlendi. Yeni mod_authn_alias modülü belli kimlik doğrulama yapılandırmalarını büyük oranda basitleştirebilir. Bu değişikliklerin kullanıcıları ve modül yazarlarını nasıl etkilediğini öğrenmek için modül değişikliklerine ve geliştirici değişikliklerine bakabilirsiniz.
Önbellekleme
mod_cache, mod_disk_cache ve mod_mem_cache modüllerinde büyük oranda değişikliğe gidilerek bunlar deneysel olmaktan çıkarılıp üretim amaçlı modüller haline getirildiler. mod_disk_cache tarafından kullanılan disk alanının htcacheclean tarafından düzenli aralıklarla temizlenebilmesi sağlandı.
Yapılandırma
Öntanımlı yapılandırma basitleştirildi ve modüler bir yapıya kavuşturuldu. Sık kullanılan ortak özellikleri etkinleştirmekte kullanılan yapılandırmalar gruplanarak bunların Apache ile gelmesi ve ana sunucu yapılandırılırken yapılandırmaya kolayca eklenebilmesi sağlandı.
Nazikçe Durdurma
prefork, worker ve event MPM’leri artık httpd’yi graceful-stop sinyali sayesinde nazikçe durdurabilmektedir. httpd programının sonlandırılmasındaki gecikmelere karşı bir önlem olarak, isteğe bağlı bir zaman aşımı belirtmeyi mümkün kılan GracefulShutdownTimeout yönergesi sayesinde sunum sürüyor olsa bile httpd sonlandırılabilmektedir.
Vekil Sunucu
Yeni mod_proxy_balancer modülü ile mod_proxy için yük dengeleme hizmetleri sağlanmış, yeni mod_proxy_ajp modülü ile Apache Tomcat tarafından kullanılan Apache JServ Protokolünün 1.3 sürümü için destek eklenmiştir.
Düzenli İfade Kütüphanesi Güncellemesi
Apache, Perl uyumlu düzenli ifade kütüphanesinin 5.0 sürümünü (PCRE) içermektedir. configure betiğinin --with-pcre seçeneği sayesinde httpd programı PCRE destekli olarak derlenebilmektedir.
Akıllı Süzme
mod_filter çıktı süzgeç zincirinin devingen olarak yapılandırılmasını sağlar. Süzgeçlerin herhangi bir istek veya yanıt başlığına veya bir ortam değişkenine dayanarak koşullu olarak yerleştirilmesini mümkün kılar ve bunu yaparken 2.0 mimarisindeki sorunlu bağımlılıklar ve sıralama sorunlarının da üstesinden gelir.
Büyük Dosya (>2GB) Desteği
httpd artık günümüzün 32 bitlik Unix sistemlerinde bulunan 2 GB’lık büyük dosyaları destekleyecek tarzda derlenebilmektedir. 2 GB’lık istek gövdelerine destek de ayrıca eklenmiştir.
Event MPM
event MPM modülü sürekli bağlantı isteklerinin işlenmesi ve bağlantıların kabul edilmesi için ayrı bir evre kullanır. Sürekli bağlantı (keepalive) isteklerinin işlenmesi geleneksel olarak httpd’nin buna bir worker adamasını gerektirirdi. Bu adanmış worker bağlantı zaman aşımına uğrayıncaya değin tekrar kullanılamazdı.
SQL Veritabanı Desteği
mod_dbd modülü apr_dbd arayüzü ile birlikte, ihtiyacı olan modüllere SQL desteği sağlar. Evreli MPM’ler için bağlantı havuzlamasını destekler.

Modüllerdeki Gelişmeler

Authn/Authz
Kimlik Doğrulama, Yetkilendirme ve Erişim Denetimi ile ilgili modüller özetli kimlik doğrulamasına daha iyi destek sağlamak amacıyla yeniden isimlendirildi. Örneğin, mod_auth modülü şimdi mod_auth_basic ve mod_authn_file diye iki modüle bölünmüştür.; mod_auth_dbm modülünün ismi mod_authn_dbm ve mod_access modülünün ismi de mod_authz_host olarak değiştirilmiştir. Ayrıca, belli kimlik doğrulama yapılandırmalarını basitleştirmek üzere mod_authn_alias diye yeni bir modül vardır.
mod_authnz_ldap
Bu modül 2.0 sürümü mod_auth_ldap modülünün 2.2 Authn/Authz arayüzüne bir uyarlamasıdır. Require yönergesine LDAP öznitelik değerlerinin ve karmaşık arama süzgeçlerinin kullanımı gibi yeni özellikler eklenmiştir.
mod_authz_owner
Dosya sistemi üzerindeki dosyalara erişimi dosya sahibine göre düzenleyebilmeyi sağlayan yeni bir modüldür.
mod_version
Çalışan sunucunun sürüm numarasına göre belli yapılandırma bloklarını etkinleştirebilen bir modüldür.
mod_info
Apache tarafından çözümlenen haliyle yapılandırma yönergelerinin gösterilmesini sağlayan yeni ?config parametresini ekler. Modül ayrıca, httpd -V’nin yaptığı gibi ek olarak derleme bilgisini ve tüm istek kancalarının sırasını da gösterir.
mod_ssl
TLS şifrelemesini HTTP/1.1 için güncelleyen RFC 2817 için destek sağlar.
mod_imagemap
mod_imap modülünün ismi yanlış anlamalara meydan vermemek için mod_imagemap olarak değiştirildi.

Programlardaki Gelişmeler

httpd
Mevcut yapılandırmaya göre yüklenen modülleri listelemek için -M diye yeni bir komut satırı seçeneği eklendi. -l seçeneğinin aksine, bu seçenekle elde edilen liste mod_so üzerinden yüklenen DSO’ları içerir.
httxt2dbm
RewriteMap yönergesinde dbm eşlem türü ile kullanmak üzere metin girdilerden DBM dosyaları üretmek için kullanılan yeni bir program.

Modül Geliştirici Değişiklikleri

APR 1.0 Programlama Arayüzü
Apache 2.2’de APR 1.0 API kullanılmıştır. Kullanımı önerilmeyen tüm işlevler ve simgeler APR ve APR-Util’den kaldırılmıştır. Ayrıntılar için APR Sitesine bakınız.
Authn/Authz
Dağıtımla gelen kimlik doğrulama ve yetkilendirme modüllerinin isimleri aşağıdaki gibi değiştirildi:
  • mod_auth_* -> HTTP kimlik doğrulamasını gerçekleştiren modüller.
  • mod_authn_* -> Kimlik doğrulamasının artalanına destek sağlayan modüller.
  • mod_authz_* -> Yetkilendirmeyi (veya erişimi) gerçekleştiren modüller.
  • mod_authnz_* -> Kimlik doğrulama ve yetkilendirmeyi birlikte gerçekleştiren modüller.
Yeni kimlik doğrulama artalanının oluşturulmasını büyük oranda kolaylaştıran yeni bir kimlik doğrulama artalanı sağlayıcı şeması vardır.
Bağlantı Hatalarının Günlüklenmesi
İstemci bağlantısında ortaya çıkan hataları günlüğe kaydetmek için ap_log_cerror isminde yeni bir işlev eklendi. Böyle bir durumda günlük kaydı istemcinin IP adresini içermektedir.
Deneme Yapılandırma Kancası Eklendi
Kullanıcı, httpd’yi sadece -t seçeneği ile kullandığı takdirde özel kod icra edilmesini isteyen modüllere yardımcı olmak üzere test_config diye yeni bir kanca işlev eklendi.
Evreli MPM’lerin Yığıt Boyutunun Ayarlanması
Tüm evreli MPM’lerin yığıt boyutunu ayarlamak üzere ThreadStackSize isminde yeni bir yönerge eklendi. Öntanımlı yığıt boyutunun küçük olduğu platformlarda bazı üçüncü parti modüller tarafından buna ihtiyaç duyulmaktadır.
Çıktı süzgeçlerinde protokoller
Evvelce her süzgeç etkilediğini yanıt başlıklarının doğru olarak üretilmesini sağlamak zorundaydı. Süzgeçler artık protokol yönetimini ap_register_output_filter_protocol veya ap_filter_protocol işlevi üzerinden mod_filter modülüne devredebilmektedir.
İzleme kancası eklendi
İzleme kancası, modüllerin ana (tepe) süreçteki sıradan/zamanlanmış işlerini yapacak modülleri etkinleştirir.
Düzenli ifade programlama aryüzü değişti
pcreposix.h başlık dosyası artık yok; yerine ap_regex.h dosyası geçti. Eski başlık dosyasınca ifade olunan POSIX.2 regex.h gerçeklenimi şimdi ap_ isim alanı altında ap_regex.h başlık dosyasındadır. regcomp, regexec gibi işlevlerin yerine de artık ap_regcomp, ap_regexec işlevleri geçerlidir.
DBD Arayüzü (SQL Veritabanı API)

Apache 1.x ve 2.0’da, modüller, SQL veritabanlarını kendileri yönetebilmek için sorumluluğu alacak bir SQL artalanına ihtiyaç duymaktadır. Her biri kendi bağlantısına sahip bir sürü modül olduğunda bu yöntem çok verimsiz olabilmektedir.

Apache 2.1 ve sonrasında veritabanı bağlantılarını (evreli olsun olmasın MPM’lerin eniyilenmiş stratejileri dahil) yönetmek için ap_dbd arayüzü kullanılmıştır. APR 1.2 ve sonrasında ise veritabanı ile etkileşim apr_dbd arayüzüyle sağlanmıştır.

Yeni modüllerin tüm SQL veritabanı işlemlerinde bu arayüzü kullanmaları ÖNERİlir. Mevcut uygulamaların uygulanabildiği takdirde hem kullanıcılarına önerilen bir seçenek olarak hem de şeffaf olarak kullanmak üzere kendilerini güncellemeleri ÖNERİir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache 2.0’da Yeni olan Özellikler - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Apache 2.0’da Yeni olan Özellikler

Bu belgede Apache HTTP Sunucusunun 1.3 ve 2.0 sürümleri arasındaki başlıca değişikliklerin bazılarına değinilmiştir.

Ayrıca bakınız:

  • 1.3’ten 2.0’a Yükseltme

Çekirdekteki Gelişmeler

Unix Evreleri
POSIX evreleri desteği olan Unix sistemlerinde Apache, çok evreli kipte çok süreçlilik şeklinde melez bir yapıda çalışır. Bu bir çok bakımdan ölçeklenebilirliği arttırsa da bütün yapılandırmalarda sağlanamaz.
Yeni Paket Derleme Sistemi
Yeni kaynak paketi derleme sistemi autoconf ve libtool’a dayalı olarak sıfırdan, yeni baştan yazıldı. Böylece Apache’nin paket yapılandırma sistemi diğer paketlerinkiyle benzerlik kazanmış oldu.
Çok Sayıda Protokol Desteği
Apache artık çok sayıda protokol ile hizmet sunacak bir alt yapıya sahiptir. Örneğin, mod_echo modülü bu amaçla yazılmıştır.
Unix dışı platformalara daha iyi destek
Apache 2.0 sürümleri, BeOS, OS/2, Windows gibi Unix olmayan platformlarda daha hızlı ve daha kararlı çalışacak duruma getirilmiştir. Genelde iyi geliştirilmemiş olan dolayısıyla istenen başarımı sağlayamayan POSIX taklit katmanlarının kullanımından vazgeçilmiş, platforma özgü çok süreçlilik modülleri (MPM) ve Apache Taşınabilirlik Arayüzü (APR) sayesinde bu platformlar artık kendi doğal programlama arayüzleriyle gerçeklenir olmuştur.
Yeni Apache Programlama Arayüzü
Modüller için kullanılan programlama arayüzü 2.0 sürümüyle önemli değişikliklere uğramıştır. 1.3 sürümünde görülen modüllerle ilgili sıralama/öncelik sorunlarının çoğu giderilmiştir. 2.0 sürümü bu işlemleri daha bir özdevimli yapar olmuştur; daha fazla esneklik sağlamak için artık kancalı modül sıralaması kullanılabilmektedir. Ayrıca, arayüze, Apache sunucu çekirdeğini yamamaya gerek kalmadan modüllerle sunucu yeteneklerinin arttırılabilmesini sağlayan yeni çağrılar eklenmiştir.
IPv6 Desteği
IPv6’nın Apache Taşınabilirlik Arayüzü kütüphanesi tarafından desteklendiği sistemlerde Apache öntanımlı olarak IPv6 soketlerini dinler. Bundan başka, Listen, NameVirtualHost ve VirtualHost yönergelerinin IPv6 sayısal adres dizgelerini desteklemesi sağlanmıştır.
Örnek: Listen [2001:db8::1]:8080
Süzme
Apache modülleri, artık, sunucuya teslim edilen veya sunucudan teslim alınan içerik akımları üzerinde süzgeç gibi davranacak şekilde yazılabilmektedir. Bu sayede, örneğin CGI betiklerinin çıktılarının mod_include modülünün INCLUDES süzgeci kullanılarak SSI yönergeleri için çözümlenmesi mümkündür. CGI programlarının birer eylemci olarak davranması gibi, mod_ext_filter modülü de harici programların birer süzgeç olarak davranabilmesini mümkün kılar.
Çok Dilli Hata Yanıtları
Hata yanıtlarının tarayıcılara yönelik iletileri artık SSI belgeleri kullanılarak çeşitli dillerde sağlanabilmektedir. Bunlar ayrıca yönetici tarafından görünüş ve kullanışlılık tutarlılığı bakımından kişiselleştirilebilmektedir.
Basitleştirilmiş Yapılandırma
Bazı yönergelerle ilgili kafa karışıklıkları giderilmiştir. Bilhassa belli bir IP adresini dinlemek için kullanılan Port ve BindAddress yönergeleri ile ilgili karışıklığın önüne geçmek için sadece Listen yönergesi yeterli olmaktadır. ServerName yönergesi ise sadece yönlendirme ve sanal konak tanıma amacıyla sunucu ismi ve port belirtiminde kullanılmaktadır.
Doğal Windows NT Unicode Desteği
Apache 2.0, Windows NT üzerinde artık tüm dosya sistemi kodlamalarında utf-8 kullanmaktadır. Bu destek, Windows 2000 ve Windows XP dahil tüm Windows NT temelli sistemlere çok dillilik desteğini sağlamak üzere mevcut Unicode dosya sistemine doğrudan uyarlanır. Dosya sisteminde makinenin yerel karakter kodlamasını kullanan kullanan Windows 95, 98 ve ME için bu destek yoktur.
Düzenli İfade Kütüphanesi Güncellemesi
Apache 2.0’da Perl uyumlu düzenli ifade kütüphanesi bulunur. Tüm düzenli ifadelerde artık çok daha güçlü olan Perl 5 sözdizimi kullanılmaktadır.

Modüllerdeki Gelişmeler

mod_ssl
Apache 2.0’da yeni olan bu modül, OpenSSL tarafından sağlanan SSL/TLS şifreleme protokollerine bir arayüzdür.
mod_dav
Apache 2.0’da yeni olan bu modül, site içeriğinin destek ve bakımı için HTTP dağıtık yazım ve sürüm yönetimi (DAV - Distributed Authoring and Versioning) belirtimini gerçekler.
mod_deflate
Apache 2.0’da yeni olan bu modül sayesinde ağ band genişliğinden daha verimli yararlanabilmek için içeriğin sıkıştırılarak gönderilmesini talep eden tarayıcıların desteklenmesi mümkün olmuştur.
mod_auth_ldap
Apache 2.0.41’de yeni olan bu modül, HTTP temel kimlik doğrulamasında kullanılan delillerin saklanması için LDAP veritabanının kullanılabilmesini mümkün kılar. Kardeş modülü olan mod_ldap ise bağlantı havuzlaması ve sonuçların önbelleğe alınması ile ilgilenir.
mod_auth_digest
Paylaşımlı belleği kullanan süreçlere karşı oturum önbelleklemesi için ek destek içerir.
mod_charset_lite
Apache 2.0’da yeni olan bu deneysel modül, karakter kümesi dönüşümleri veya kaydı için destek sağlar.
mod_file_cache
Apache 2.0’da yeni olan bu modül, Apache 1.3’teki mod_mmap_static modülünün işlevselliğini içermenin yanında buna önbellekleme yetenekleri de ekler.
mod_headers
Bu modül Apache 2.0’da daha esnek hale getirilmiştir. Artık mod_proxy tarafından kullanılan istek başlıkları değiştirilebilmekte ve bunlar yanıt başlıklarına şartlı olarak atanabilmektedir.
mod_proxy
Bu modül HTTP/1.1 uyumlu vekaleti daha güvenilir kılmak ve yeni süzgeç alt yapısının getirilerinden de yararlanmak amacıyla yeni baştan yazılmıştır. Bunun yanında, <Proxy> bölümünün yeni hali vekil siteleri desteklemek bakımından daha okunabilir (ve kendi içinde daha hızlı) olması sağlanmıştır; <Directory "proxy:..."> yapılandırması artık desteklenmemektedir. Modül, proxy_connect, proxy_ftp ve proxy_http şeklinde her biri belli bir protokolü destekleyen ayrı modüllere bölünmüştür.
mod_negotiation
Yeni ForceLanguagePriority yönergesi sayesinde istemciye “Kabul edilebilir bir gösterim çeşidi yok” ya da “Çok sayıda seçim belirtilmiş” yanıtını döndürmek yerine tüm durumlara uyan bir sayfanın gönderilebilmesi sağlanmıştır. Bundan başka, uzlaşım ve MultiViews algoritmaları daha tutarlı sonuçlar elde etmek amacıyla elden geçirilmiş ve belge içeriği ile daha iyi eşleşen yeni bir tür eşlem yapısı sağlanmıştır.
mod_autoindex
Dizin içeriklerinin özdevimli listelenmesi artık HTML tabloları kullanılacak şekilde yapılandırılabilmektedir. Böylece sayfa daha iyi biçemlenebilmekte, içerik daha hassas sıralanabilmekte, sürüm numarasına göre sıralama yapılabilmekte ve dosya ismi kalıpları kullanılarak sadece istenen içerik listelenebilmektedir.
mod_include
Yeni yönergeler, değiştirilecek SSI elemanları için öntanımlı başlangıç ve bitiş etiketlerine izin vermekte, hataların ve zaman biçemleme yapılandırmalarının SSI belgesinde değil ana yapılandırma dosyasında bulunması mümkün olmaktadır. Düzenli ifadelerin gruplanmış sonuçları (Perl düzenli ifade sözdizimi kullanılmaktadır) mod_include modülünün $0 .. $9 değişkenleri sayesinde kullanılabilmektedir.
mod_auth_dbm
AuthDBMType yönergesi sayesinde artık çok sayıda DBM tarzı veritabanı türü desteklenmektedir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


The Apache License, Version 2.0 - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2

The Apache License, Version 2.0

Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/

TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

  1. Definitions

    "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.

    "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.

    "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.

    "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.

    "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.

    "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.

    "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).

    "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.

    "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."

    "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.

  2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
  3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
  4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
    1. You must give any other recipients of the Work or Derivative Works a copy of this License; and
    2. You must cause any modified files to carry prominent notices stating that You changed the files; and
    3. You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
    4. If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.

    You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.

  5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
  6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
  7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
  8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
  9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.

END OF TERMS AND CONDITIONS

APPENDIX: How to apply the Apache License to your work.

To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.

Copyright [yyyy] [name of copyright owner]

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


Derleme ve Kurulum - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Derleme ve Kurulum

Bu belge Apache HTTP Sunucusunun sadece Unix ve Unix benzeri sistemlerde derlenmesini ve kurulmasını kapsar. Windows üzerinde derleme ve kurulum için Apache HTTPd’nin Microsoft Windows ile kullanımı bölümüne bakınız. Diğer platformlar için ise platform belgelerine bakınız.

Apache HTTPd, derleme ortamını oluşturmak için çoğu Açık Kaynak Kodlu projenin yaptığı gibi libtool ve autoconf kullanır.

Eğer sadece sürüm yükseltiyorsanız (2.2.50’den 2.2.51’e yükseltmek gibi) lütfen doğrudan Yükseltme bölümüne atlayınız.

Ayrıca bakınız:

  • Kaynak ağacının yapılandırılması
  • Apache HTTPd’nin başlatılması
  • Durdurma ve yeniden başlatma

Tez canlılar için genel bir bakış

İndirme | $ lynx http://httpd.apache.org/download.cgi
Paketi açma $ gzip -d httpd-NN.tar.gz
$ tar xvf httpd-NN.tar
$ cd httpd-NN
Yapılandırma | $ ./configure --prefix=ÖNEK
Derleme | $ make
Kurulum | $ make install
Kişiselleştirme | $ vi ÖNEK/conf/httpd.conf
Deneme | $ ÖNEK/bin/apachectl -k start

NN yerine kuracağınız sürümü, ÖNEK yerine de dosya sisteminde sunucunun altına kurulacağı dizin yolunu yazınız. ÖNEK belirtilmezse /usr/local/apache2 öntanımlıdır.

Derleme ve kurulum işleminin her aşaması, Apache HTTPd Sunucusunun derlenmesi ve kurulması için gerekenler başta olmak üzere aşağıda ayrıntılı olarak açıklanmıştır.

Gereksinimler

Apache HTTPd’yi derleyebilmek için şunlar mevcut olmalıdır:

Disk Alanı
Geçici olarak en azından 50 MB boş disk alanınız olduğundan emin olunuz. Kurulumdan sonra Apache yaklaşık 10 MB disk alanı kaplıyor olacaktır. Asıl disk alanı gereksinimi seçtiğiniz yapılandırma seçenekleri ve üçüncü parti modüllere göre değişiklik gösterecektir.
ANSI-C Derleyici ve Derleme Sistemi
Bir ANSI-C derleyicinin kurulu olduğundan emin olunuz. Free Software Foundation (FSF) tarafından dağıtılan GNU C derleyicisini (GCC) kullanmanız önerilir. GCC yoksa en azından satıcınızın derleyicisinin ANSI uyumlu olduğundan emin olunuz. Ayrıca, PATH ortam değişkeninizin içerdiği yollarda make gibi temel derleme araçları da bulunmalıdır.
Zamanın doğru belirlenmesi
HTTP protokolünün elemanları sunuldukları tarih ve saate göre ifade edilirler. Bu bakımdan sisteminizdeki zaman ayarlama oluşumunun ayarlarını gözden geçirmenizin tam sırasıdır. Bu amaçla, Ağ Zaman Protokolüne (NTP) göre çalışan ntpdate veya xntpd programları kullanılır. NTP yazılımları ve halka açık zaman sunucuları hakkında daha ayrıntılı bilgi için NTP sitesine bakınız.
Perl 5 [SEÇİMLİK]
Perl ile yazılmış apxs veya dbmmanage gibi bazı betikleri desteklemek için Perl 5 yorumlayıcısı gerekir (5.003 veya daha yeni sürümleri yeterlidir). Eğer sisteminizde birden fazla Perl yorumlayıcı kuruluysa (örneğin, sistem geneli için Perl 4, kendi kullanımızı için Perl 5 kurulu olabilir), doğru sürümün kullanılacağından emin olmak bunu configure betiğine --with-perl seçeneğini kullanarak belirtmeniz önerilir. Eğer configure betiği sisteminizde Perl 5 yorumlayıcısı bulamazsa bu betikleri kullanamazsınız. Ancak, bu durum Apache HTTPd’nin derlenip kurulmasına engel değildir.
apr/apr-util >= 1.2
apr ve apr-util Apache HTTPd kaynak paketiyle gelmektedir ve hemen hemen tüm durumlarda sorunsuz kullanılabilecek durumdadır. Ancak sisteminizde apr veya apr-util’in 1.0 veya 1.1 sürümleri kuruluysa onları paket içindeki kütüphaneleri kullanmaya zorlamak için ya 1.2 sürümlerine yükseltmeli ya da ayrı HTTPd derlemeleriniz olmalıdır. Paket içinde gelen apr/apr-util kaynak kodlarını kullanmak için configure betiğine --with-included-apr seçeneğini belirtiniz.

Ek bilgi

--with-included-apr seçeneği 2.2.3 sürümünde eklenmiştir.

# Paketteki apr/apr-util’in kullanımını zorlamak için
./configure --with-included-apr

Apache HTTPd’yi ve apr/apr-util’i ayrı ayrı derlemek için:

# apr 1.2’nin derlenmesi ve kurulması
cd srclib/apr
./configure --prefix=/usr/local/apr-httpd/
make
make install

# apr-util 1.2’nin derlenmesi ve kurulması
cd ../apr-util
./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/
make
make install

# HTTPd’nin derlenmesi
cd ../../
./configure --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/

İndirme

Apache HTTP Sunucusunu, çeşitli yansıların da listelendiği Apache HTTP Sunucusu indirme sayfasından indirebilirsiniz. Unix benzeri sistemler kullanan Apache HTTPd kullanıcılarının kaynak paketlerinden birini indirip derlemeleri daha iyi olacaktır. Derleme işlemi (aşağıda açıklanmıştır) kolaydır ve sunucunuzu ihtiyaçlarınıza uygun olarak kişiselleştirmenize imkan tanır. Ayrıca, hazır derlenmiş paketler çoğunlukla en son kaynak sürüm kadar güncel değildirler. Eğer böyle bir paket indirmişseniz, kurarken paketin içinde bulunan INSTALL.bindist dosyasındaki talimatlara uyunuz.

İndirme işleminin ardından Apache HTTP Sunucusunun eksiksiz ve değişikliğe uğramamış olduğunun doğrulanması önemlidir. Bu indirilen tar paketinin PGP imzasına göre sınanması ile sağlanabilir. Bunun nasıl yapılacağı indirme sayfasında anlatıldığı gibi PGP kullanımının anlatıldığı daha geniş bir örnek de vardır.

Paketi açma

Apache HTTPd tar paketinden sıkıştırmayı kaldırdıktan sonra tar arşivinden dosyaları çıkarmak basit bir işlemdir:

$ gzip -d httpd-NN.tar.gz
$ tar xvf httpd-NN.tar

Bu işlem bulunduğunuz dizinin içinde dağıtımın kaynak dosyalarını içeren yeni bir dizin oluşturacaktır. Sunucuyu derleme işlmine başlayabilmek için önce cd ile bu dizine geçmelisiniz.

Kaynak ağacının yapılandırılması

Sonraki adım, Apache HTTPd kaynak ağacının platformunuza ve kişisel gereksinimlerinize uygun olarak yapılandırılmasıdır. Bu işlem dağıtımın kök dizininde bulunan configure betiği kullanılarak yapılır. (Apache HTTPd kaynak ağacının resmen dağıtıma girmemiş bir sürümünü indiren geliştiricilerin sistemlerinde autoconf ve libtool kurulu olması ve sonraki adıma geçmek için buildconf çalıştırmaları gerekir. Bu işlem resmi dağıtımlar için gerekli değildir.)

Kaynak ağacını tamamen öntanımlı seçenekler kullanılarak derlemek için ./configure komutunu vermek yeterlidir. Öntanımlı seçenekleri değiştirmek için configure betiği çeşitli değişkenler ve komut satırı seçenekleri kabul eder.

En önemli seçenek, Apache HTTP Sunucusunun kurulacağı yerin belirlenmesini, dolayısıyla Apache’nin bu konumda doğru olarak çalışması için yapılandırılmasını sağlayan --prefix’tir. Kurulacak dosyaların yerleri ile ilgili daha ayrıntılı denetim ek yapılandırma seçenekleri ile mümkün kılınmıştır.

Bu noktada ayrıca, Apache HTTPd’de hangi özelliklerin bulunmasını istediğinizi modülleri etkin kılarak veya iptal ederek belirtebilirsiniz. Apache, öntanımlı olarak içerilmiş temel modüllerle gelir. Diğer modüller --enable-modül seçenekleri kullanılarak etkinleştirilir. Buradaki modül, önünden mod_ dizgesi kaldırılmış ve içindeki altçizgi imleri tire imleri ile değiştirilmiş modül ismidir. Ayrıca, --enable-modül=shared seçeneklerini kullanarak modülleri çalışma anında gerektiğinde yüklemek veya kaldırmak üzere paylaşımlı nesneler (DSO’lar) olarak derlemeniz de mümkündür. Temel modülleri de benzer şekilde --disable-modül seçenekleriyle iptal edebilirsiniz. configure betiği mevcut olmayan modüller için sizi uyarmayıp, seçeneği yok saymakla yetineceğinden, bu seçenekleri kullanırken dikkatli olmalısınız.

Ek olarak, bazen kullandığınız derleyici, kütüphaneler veya başlık dosyalarının yerleri hakkında configure betiğine ilave bilgiler sağlamanız gerekir. Bu işlem configure betiğine ya ortam değişkenleriyle ya da komut satırı seçenekleriyle bilgi aktarılarak yapılır. Daha fazla bilgi için configure kılavuz sayfasına bakınız.

Apache’yi derlerken ne gibi olasılıklara sahip olduğunuz hakkında bir izlenim edinmeniz için aşağıda tipik bir örneğe yer verilmiştir. Bu örnekte, Apache’nin /sw/pkg/apache önekiyle başlayan dizinlere kurulması, belli bir derleyici ve derleyici seçenekleriyle derlenmesi ve mod_rewrite ve mod_speling modüllerinin de DSO mekanizması üzerinden daha sonra yüklenmek üzere derlenmesi istenmektedir:

$ CC="pgcc" CFLAGS="-O2" \
./configure --prefix=/sw/pkg/apache \
--enable-rewrite=shared \
--enable-speling=shared

configure betiği başlatıldığında sisteminizde mevcut özelliklerin işe yararlığını sınamak ve sonradan sunucuyu derlemek için kullanılacak Makefile dosyalarını oluşturmak için bir kaç dakika çalışacaktır.

configure seçeneklerinin tamamı ayrıtılı olarak configure kılavuz sayfasında açıklanmıştır.

Derleme

Artık, Apache HTTPd paketini şekillendiren çeşitli parçaları derlemek için basitçe aşağıdaki komutu verebilirsiniz:

$ make

Bu komutu verdikten sonra lütfen sabırlı olunuz. Temel yapılandırmanın derlenmesi bir kaç dakika alsa da modüllerin derlenmesi donanımınıza ve seçtiğiniz modüllerin sayısına bağlı olarak daha uzun süre gerektirecektir.

Kurulum

Şimdi sıra ÖNEK dizini altına kurulmak üzere yapılandırdığınız (yukarı --prefix seçeneğine bakınız) paketi kurmaya geldi. Basitçe şu komutu veriniz:

# make install

ÖNEK dizininde genellikle yazma izinlerinin sınırlı oluşu nedeniyle bu adım genellikle root yetkilerini gerektirir.

Eğer sürüm yükseltiyorsanız, kurulum sırasında mevcut yapılandırma dosyalarının ve belgelerin üzerine yazılmayacaktır.

Kişiselleştirme

Bu adımda, Apache HTTP Sunucunuzu ÖNEK/conf/ dizini altındaki yapılandırma dosyalarını düzenleyerek kişiselleştirebilirsiniz.

$ vi ÖNEK/conf/httpd.conf

Bu kılavuz ve kullanılabilecek yapılandırma yönergelerinin kılavuzlarını ÖNEK/docs/manual/ altında bulabileceğiniz gibi en son sürümünü daima http://httpd.apache.org/docs/2.2/ adresinde bulabilirsiniz.

Deneme

Artık Apache HTTP Sunucunuzu başlatmaya hazırsınız. Hemen şu komutu verin:

$ ÖNEK/bin/apachectl -k start

http://localhost/ üzerinden ilk belgeniz için bir istek yapmalısınız. Genellikle DocumentRoot olarak bilinen ÖNEK/htdocs/ altındaki sayfayı görürsünüz. Çalışmakta olan sunucuyu durdurmak için şu komutu verebilirsiniz:

$ ÖNEK/bin/apachectl -k stop

Yükseltme

Sürüm yükseltme işleminin ilk adımı, sitenizi etkileyen değişiklikleri öğrenmek için dağıtım duyurusunu ve kaynak paketindeki CHANGES dosyasını okumaktır. Ana sürümlerden yükseltme yapıyorsanız (1.3’ten 2.0’a veya 2.0’dan 2.2’ye gibi), derleme anı ve çalışma anı yapılandırmalarındaki ana farklılıklar elle ayarlamalar yapmanızı gerektirecektir. Ayrıca, tüm modüllerin de modül API’sindeki değişikliklere uyum sağlaması için yükseltilmesi gerekecektir.

Aynı ana sürüm içinde yükseltme yapmak (2.2.55’ten 2.2.57’ye yükseltmek gibi) daha kolaydır. make install işlemi, mevcut yapılandırma ve günlük dosyalarınızın ve belgelerin üzerine yazmayacaktır. Ek olarak, geliştiriciler alt sürüm değişikliklerinde configure seçenekleri, çalışma anı yapılandırması veya modül API’sinde uyumsuz değişiklikler yapmamaya özen göstereceklerdir. Çoğu durumda, aynı configure komut satırını, aynı yapılandırma dosyasını kullanabileceksiniz ve tüm modülleriniz de çalışmaya devam edebilecektir.

Aynı ana sürüm içinde yükseltme işlemine, eski kaynak ağacının kök dizininde veya kurulu sunucunuzun build dizininde bulacağınız config.nice dosyasını yeni kaynak ağacının kök dizinine kopyalamak suretiyle başlayabilirsiniz. Bu dosya evvelce kaynak ağacını yapılandırmakta kullandığınız configure komut satırını içerir. config.nice dosyasında yapmak istediğiniz değişiklikler varsa yaptıktan sonra şu komutları veriniz:

$ ./config.nice
$ make
$ make install
$ ÖNEK/bin/apachectl -k graceful-stop
$ ÖNEK/bin/apachectl -k start

Her yeni sürümü hizmete sokmadan önce daima çalışma ortamınızda denemeniz gerekir. Örneğin, yükseltme işlemini sonuçlandırmadan önce eski sürümün çalışmasını durdurmadan yenisini farklı bir --prefix ile kurabilir ve farklı bir port ile (Listen yönergesini ayarlamak suretiyle) çalıştırabilirsiniz.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache HTTPd’nin başlatılması - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Apache HTTPd’nin başlatılması

Apache normal olarak, Windows NT, 2000 ve XP'de bir hizmet olarak, Windows 9x ve ME’de ise bir konsol uygulaması olarak çalışır. Ayrıntılı bilgi için Apache HTTPd’nin bir hizmet olarak çalıştırılması ve Apache HTTPd’nin bir konsol uygulaması olarak çalıştırılması bölümlerine bakınız.

Unix’te ise artalanda isteklere yanıt vermek için sürekli çalışan bir artalan sürecidir. Bu belgede httpd’nin nasıl çalıştırılacağı açıklanmaktadır.

Ayrıca bakınız:

  • Durdurma ve Yeniden Başlatma
  • httpd
  • apachectl

Apache Nasıl Başlatılır?

Yapılandırma dosyasında Listen yönergesi ile öntanımlı olan port 80 (veya 1024’ten küçük herhangi bir port) belirtilmişse Apache HTTP Sunucusunu başlatmak için root yetkileri gerekecektir. Sunucu başlatılıp günlük dosyalarını açmak gibi bazı ön hazırlık etkinliklerinde bulunduktan sonra istemcilerden gelen istekleri dinlemek ve yanıt vermek için çeşitli çocuk süreçler başlatır. Ana httpd süreci root kullanıcısının aidiyetinde çalışmasını sürdürürken çocuk süreçler daha az yetkili bir kullanıcının aidiyetinde çalışır. Bu işlem seçilen Çok Süreçlilik Modülü tarafından denetlenir.

httpd’yi çalıştırmak için önerilen yöntem apachectl betiğini kullanmaktır. Bu betik, httpd’nin bazı işletim sistemlerinde işlevini gerektiği gibi yerine getirebilmesi için gereken belli ortam değişkenlerini ayarlar ve httpd’yi çalıştırır. apachectl, komut satırı argümanlarını httpd’ye aktarabildiğinden gerekli httpd seçenekleri apachectl betiğine komut satırı seçenekleri olarak belirtilebilir. Ayrıca, apachectl betiğinin içeriğini doğrudan düzenlemek suretiyle betiğin başlangıç satırlarındaki HTTPD değişkenine httpd çalıştırılabilir dosyasının doğru yerini ve daima mevcut olmasını istediğiniz komut satırı seçeneklerini belirtebilirsiniz.

httpd çalıştırıldığında yaptığı ilk şey yapılandırma dosyası httpd.conf’u bulup okumaktır. Bu dosyanın yeri derleme sırasında belirtilmekteyse de -f komut satırı seçeneği kullanılarak çalıştırma sırasında belirtmek de mümkündür:

/usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf

Başlatma sırasında herşey yolunda giderse sunucu kendini uçbirimden ayıracak ve hemen ardından uçbirim, komut istemine düşecektir. Bu, sunucunun etkin ve çalışmakta olduğunu gösterir. Artık tarayıcınızı kullanarak sunucuya bağlanabilir ve DocumentRoot dizinindeki deneme sayfasını görebilirsiniz.

Başlatma Sırasındaki Hatalar

Apache başlatma sırasında ölümcül bir sorunla karşılaşacak olursa çıkmadan önce sorunu açıklayan bir iletiyi konsola veya ErrorLog yönergesi ile belirtilen hata günlüğüne yazacaktır. En çok karşılaşılan hata iletilerinden biri "Unable to bind to Port ..." dizgesidir. Bu iletiye genellikle şu iki durumdan biri sebep olur:

  • Sunucunun, root yetkileri gerektiren bir portu kullanmak üzere root kullanıcısı tarafından çalıştırılmamış olması.
  • Aynı portu kullanan başka bir Apache Sunucusunun veya başka bir HTTP sunucusunun zaten çalışmakta oluşu.

Bu ve diğer sorun çözme talimatları için Apache SSS’sini inceleyiniz.

Sistem Açılışında Başlatma

Sunucunuzun sistem yeniden başlatıldıktan sonra çalışmasına devam etmesini istiyorsanız sistem başlatma betiklerinize (genellikle ya rc.local dosyasıdır ya da bir rc.N dizininde bir dosyadır) apachectl betiği için bir çağrı eklemelisiniz. Bu, Apache sunucunuzu root yetkileriyle başlatacaktır. Bunu yapmadan önce sunucunuzun güvenlik ve erişim kısıtlamaları bakımından gerektiği gibi yapılandırıldığından emin olunuz.

apachectl betiği, bir standart SysV init betiği gibi davranacak şekilde tasarlanmıştır. start, restart ve stop argümanlarını kabul edebilir ve bunları httpd’ye uygun sinyallere dönüştürebilir. Bu bakımdan, çoğunlukla uygun init dizinlerinden birine apachectl betiği için basitçe bir bağ yerleştirebilirsiniz. Fakat bunu yapmadan önce betiğin sisteminizin gereklerini yerine getirdiğinden emin olunuz.

Ek Bilgiler

httpd, apachectl ve sunucuyla gelen diğer destek programlarının komut satırı seçenekleri hakkında ek bilgi Sunucu ve Destek Programları sayfasında bulunabilir. Ayrıca, Apache dağıtımında bulunan tüm modüller ve bunlarla sağlanan yönergeler hakkında da belgeler vardır.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Durdurma ve Yeniden Başlatma - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Durdurma ve Yeniden Başlatma

Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.

Bu belge Apache HTTPd’nin Unix benzeri sistemlerde durdurulması ve yeniden başlatılması konularını kapsar. Windows NT, 2000 ve XP kullanıcıları Apache HTTPd’yi bu platformlarda nasıl denetimlerine alacaklarını öğrenmek için Apache HTTPd’nin Bir Hizmet Olarak Çalıştırılması sayfasına, Windows 9x ve ME kullanıcıları ise Apache HTTPd’nin Bir Konsol Uygulaması Olarak Çalıştırılması sayfasına bakabilirler.

Ayrıca bakınız:

  • httpd
  • apachectl
  • Başlatma

Giriş

Apache HTTPd’yi durdurmak ve yeniden başlatmak için çalışan httpd süreçlerine bir sinyal göndermeniz gerekir. Sinyal göndermek için iki yol vardır. İlki, süreçlere doğrudan sinyal göndermek için unix kill komutunun kullanımıdır. Bu suretle, sisteminizde çalışmakta olan bir çok httpd sürecini uyarabilirsiniz ama süreç kimliği PidFile yönergesi ile belirtilen dosyada tutulan ana süreç dışında hiçbirine sinyal göndermemelisiniz. Başka bir deyişle, ana süreç haricinde hiçbir sürece sinyal göndermeye normal olarak ihtiyacınız olmaması gerekir. Ana sürece gönderebileceğiniz dört çeşit sinyal vardır: TERM, USR1, HUP ve WINCH. Bunlar yeri geldikçe açıklanacaktır.

Ana sürece kill ile sinyal göndermek için şöyle bir komut verebilirsiniz:

kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

httpd süreçlerine sinyal göndermenin ikinci yolu -k komut satırı seçeneğini şu değerlerden biri ile kullanmaktır: stop, restart, graceful ve graceful-stop. Bunlar aşağıda açıklanacaktır. -k komut satırı seçeneği httpd’ye ait olsa da ana sürece bu sinyalleri göndermek için apachectl betiğini kullanmanızı öneririz. apachectl, komut satırı seçeneklerini httpd’ye aktaracaktır.

httpd’ye sinyal gönderdikten sonra olup biteni şu komutla izleyebilirsiniz:

tail -f /usr/local/apache2/logs/error_log

Bu örnekleri, kendi ServerRoot ve PidFile yönergelerinizdeki ayarlara uygun olarak değiştirdikten sonra kullanınız.

Hemen Durdur

Sinyal: TERM
apachectl -k stop

Ana sürece TERM veya stop sinyali göndererek tüm çocukların bir an önce öldürülmeye çalışılmasını sağlamış olursunuz. Tüm çocukların öldürülmesi bir kaç saniye sürebilir. Son olarak ana süreç çıkacaktır. Yanıtlanmakta olan istekler hemen sonlandırılacak ve artık isteklere yanıt verilmeyecektir.

Nazikçe Yeniden Başlat

Sinyal: USR1
apachectl -k graceful

Ana sürece USR1 veya graceful sinyalinin gönderilmesi, çocuklara ellerindeki mevcut işleri bitirdikten sonra (veya sundukları bir şey yoksa hemen) çıkmalarının önerilmesi demektir. Ana süreç kendi yapılandırma dosyalarını yeniden okur ve kendi günlük dosyalarını yeniden açar. Ana sürecin öldürdüğü her sürecin yerine yeni yapılandırma kuşağından bir süreç başlatır ve hemen yeni isteklere hizmet sunulmaya başlanır.

Bu kod MPM’lerin süreçleri denetleyen yönergelerine daima uyacak şekilde tasarlanmıştır. Bu suretle, istemcilere hizmet sunacak çocuk süreçler ve evreler, yeniden başlatma işleminde de uygun sayıda sağlanmış olur. Bununla birlikte, StartServers yönergesinde şöyle davranılır: İlk saniye içinde en azından StartServers sayıda yeni çocuk oluşturulmamışsa iş olmayan bir devreyi geçiştirecek kadarı oluşturulur. Ardından sunucunun mevcut yükünü karşılamak için gereken sayıda çocuk süreç oluşturulur. Bu suretle, kod her ikisi için de gereğini yerine getirmeye çalışmış olur.

mod_status kullanıcıları USR1 gönderildiği zaman sunucu istatistiklerinin sıfırlanmadığı konusunda uyarılacaktır. Kod, sunucunun yeni isteklere yanıt veremediği zamanı en aza indirmenin yanısıra ayar parametrelerinize de uymak üzere tasarlanmıştır (yeni istekler işletim sistemi tarafından kuyruğa alınacağından bir istek kaybı olayı yaşanmaz). Bunu sağlamak için, her iki kuşağın çocuklarının izini sürecek bir çetele tutulur.

mod_status modülü, nazikçe yeniden başlat komutunun verilmesinden önce başlamış ve sunulmaya devam eden isteklere bakan çocukları imlemek için ayrıca bir G (Graceful’un baş harfi) kullanır.

Günlük dosyası döndürme betiğine, yeniden başlatma öncesi günlüğe yazan tüm çocukların işini bitirdiğini USR1 kullanarak bildirmenin bir yolu yoktur. Önerimiz, eski günlük kaydı üzerinde bir işlem yapmaya başlamadan önce USR1 sinyali gönderilmesinin ardından belli bir süre beklenilmesi olacaktır. Örneğin, düşük band genişliğine sahip istemcilere hizmet sunan çoğu sürecin işinin 10 dakikadan önce bitmeyeceğini gözönüne alarak eski günlük üzerinde işlem yapmaya başlamak için 15 dakika beklenebilir.

Bir yeniden başlatma isteğinde, eğer yapılandırma dosyalarınızda bir hata varsa sunucu yeniden başlamaz ve bir hata ile çıkar. Nazikçe yeniden başlatma durumunda ana süreç çıkarken çocuklarını çalışır durumda bırakır. (Bunlar, ellerindeki istekler bitince ‘nazikçe çıkacak’ olan çocuk süreçlerdir.) Eğer sunucuyu yeniden başlatmaya çalışırsanız bu sorunlara yol açar; örneğin, dinleyeceği portları bağlayamayabilir. Bir yeniden başlatma öncesinde yapılandırma dosyalarınızın sözdizimini -t komut satırı seçeneği ile sınayabilirsiniz (bkz, httpd). Ancak, bu hala sunucunuzun düzgünce yeniden başlatılmasını garanti etmeyecektir. Yapılandırma dosyalarınızı sözdizimi denetiminin yanında anlamlandırılması bakımından da sınamak için httpd’nin root olmayan bir kullanıcı tarafından çalıştırılmasını deneyebilirsiniz. Eğer yapılandırma dosyalarında bir hata yoksa soketleri ve günlük dosyalarını açmaya çalışırken root aidiyetinde çalışmadığından veya çalışmakta olan asıl sunucu bu portları zaten dinlediğinden başarısız olacaktır. Eğer başka bir sebeple başarısız olursa olası sebep bir yapılandırma dosyası hatasıdır ve asıl sunucuya ‘nazikçe yeniden başla’ komutunu vermeden önce bu hatayı düzeltmeniz gerekir.

Hemen Yeniden Başlat

Sinyal: HUP
apachectl -k restart

Ana sürece HUP veya restart sinyalinin gönderilmesi tüm çocukların TERM sinyali gönderilmiş gibi öldürülmesine sebep olur fakat ana sürecin çıkmasını sağlamaz. Ana süreç yapılandırma dosyalarını yeniden okur ve günlük kayıt dosyalarını yeniden açar. Bunların ardından isteklere yanıt verecek yeni kuşak çocukları oluşturmaya başlar.

mod_status kullanıcıları bir HUP sinyali gönderildiğinde sunucu istatistiklerinin sıfırlandığı konusunda uyarılırlar.

Eğer yapılandırma dosyalarınızda sözdizimi hatası varsa yeniden başlatma işlemi gerçekleşmez ve ana süreç bir hata vererek çıkar. Bundan kaçınmak için önceki yönteme bakınız.

Nazikçe Durdur

Sinyal: WINCH
apachectl -k graceful-stop

Ana sürecin WINCH veya graceful-stop sinyalini alması, çocuklara ellerindeki mevcut işleri bitirdikten sonra (veya sundukları bir şey yoksa hemen) çıkmalarının önerilmesine sebep olur. Ebevey süreç bunun hemen PidFile dosyasını siler ve port dinlemeyi keser. Ana süreç çalışmaya ve isteklere yanıt vermekte olan çocuk süreçleri izlemeye devam eder. Tüm çocuklar işlerini bitirip çıktığında veya GracefulShutdownTimeout ile belirtilen zaman aşımı dolduğunda ana süreç de kendini sonlandırır. Eğer zaman aşımı devreye girmişse o an calışmakta olan çocuk süreçlere TERM sinyali gönderilerek hemen çıkmaları sağlanır.

Bir TERM sinyali ile "graceful" durumundaki tüm çocuklar ve ana süreç hemen sonlandırılacaktır. Bununla birlikte, PidFile dosyası da silineceğinden, artık apachectl veya httpd’yi bu sinyali göndermek için kullanamayacaksınız.

graceful-stop sinyali, aynı anda, aynı yapılandırma ile çok sayıda httpd kopyasının çalıştırılabilmesine imkan verir. Bu, Apache nazikçe yükseltileceği zaman güçlü bir özellik haline gelmekteyse de, bazı yapılandırmalarda yarış koşullarının oluşmasına ve kısır çekişmelere (deadlock) sebep olabilir.

Sunucunun süreç kimliğini içeren Lockfile ve ScriptSock gibi dosyaların disk üzerindeki mevcudiyetlerinin sorunsuz olarak devam ettiğinden emin olunmaya çalışılmalıdır. Ayrıca, bir yapılandırma yönergesi, üçüncü parti bir modül veya kalıcı CGI uygulamalarına ait disk kilit veya durum dosyaları olabilir; httpd’nin birden fazla kopyasının çalışması nedeniyle bu dosyaların da üzerine yazılmadığından emin olunmaya çalışılmalıdır.

rotatelogs tarzı borulu günlükleme kullanımı gibi durumlarda yarış koşullarının oluşması olasılığına karşı uyanık olunmalıdır. Aynı günlük kayıt dosyalarını aynı anda döndürmeye çalışan birden fazla rotatelogs kopyasının çalıştırılması halinde bunların her biri diğerlerinin günlük kayıt dosyalarının kaybına sebep olabilir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Yapılandırma Dosyaları - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Yapılandırma Dosyaları

Bu belgede Apache HTTP sunucusunu yapılandırmakta kullanılan dosyalar açıklanmıştır.

Ana Yapılandırma Dosyaları

İlgili Modüller İlgili Yönergeler
  • mod_mime
  • <IfDefine>
  • Include
  • TypesConfig

Apache düz metin yapılandırma dosyalarına yönergeler yerleştirilerek yapılandırılır. Ana yapılandırma dosyasının ismi normalde httpd.conf’tur. Bu dosyanın yeri derleme sırasında belirlenir, ancak çalıştırma sırasında -f komut satırı seçeneği ile başka bir yer belirtilebilir. Ayrıca, Include yönergesi kullanılarak başka yapılandırma dosyaları da eklenebilir ve bu dosyaların isimleri belirtilirken dosya ismi şablonları kullanılabilir. Bu dosyaların içine de ana yapılandırma dosyasında olduğu gibi her türlü yönerge yerleştirilebilir. Ana yapılandırma dosyalarındaki değişiklikler Apache tarafından sadece başlatma veya yeniden başlatma sırasında etkin kılınır.

Sunucu ayrıca MIME belge türlerini içeren bir dosya daha okur; dosya ismi öntanımlı olarak mime.types olup TypesConfig yönergesi ile başka bir dosya belirtilebilir.

Yapılandırma Dosyalarının Sözdizimi

Apache yapılandırma dosyalarının her satırında sadece bir yönerge bulunur ve bir yönergenin birden fazla satıra yayılması daha iyi olacaksa satır katlanabilir; devamı bir alt satırda olan her satırın son karakteri “\” (tersbölü) olmalı, satırsonu karakteri ile bu tersbölü karakteri arasında başka karakter bulunmamalıdır.

Yapılandırma dosyalarındaki yönergelerin isimleri harf büyüklüğüne duyarlı olduğu halde argümanları genellikle harf büyüklüğüne duyarlı değildir. Diyez (“#”) karakteri ile başlayan satırlar açıklama olarak ele alınır ve yok sayılırlar. Yapılandırma yönergesi içeren satırların ardına açıklama yerleştirilemez. Yönerge isminden önce yer alan boşluklar ve boş satırlar yok sayılır; bu özellik, okunabilirliği sağlamak için yönergelerin girintilenebilmesi olanağını verir.

Kabuk ortam değişkenlerinin değerleri yapılandırma dosyası içinde ${ENVVAR} sözdizimi ile kullanılabilir. "ENVVAR" geçerli bir ortam değişkeninin adı olduğu takdirde, yapılandırma dosyasında görüldüğü yerlerde değişkenin değeri yazılmış gibi işlem yapılır. (ENVVAR diye bir değişken yoksa yapılandırma dosyasının işlenmesinin sonraki aşamalarında kullanılmak üzere "${ENVVAR}" karakterleri oldukları gibi bırakılır.)

Yapılandırma dosyasındaki bir satırı uzunluğu, ortam değişkenlerinin değerleri yerleştirildikten, devam satırları birleştirilip satırın önündeki ve ardındaki boşluk karakterleri temizlendikten sonra en fazla 8192 karakter olabilir.

Sunucuyu başlatmadan önce apachectl configtest ile veya -t komut satırı seçeneği ile yapılandırma dosyalarınızı sözdizimi hatalarına karşı sınayabilirsiniz.

Modüller

İlgili Modüller İlgili Yönergeler
  • mod_so
  • <IfModule>
  • LoadModule

Apache modüler yapıda bir sunucudur. Bu, çekirdek sunucunun sadece en temel işlevselliği içermesi demektir. Ek özellikler, Apache’ye modüller halinde yüklenebilir. Öntanımlı olarak, derleme sırasında sunucunun temel bir modül kümesi içermesi sağlanır. Eğer sunucu devingen yüklenen modülleri kullanmak üzere yapılandırılarak derlenirse modüller ayrı olarak derlenip gerektiği zaman LoadModule yönergesi kullanılarak yüklenebilir. Aksi takdirde, ek modülleri yükleyebilmek veya kaldırabilmek için Apache’nin yeniden derlenmesi gerekir. Yapılandırma yönergeleri belli bir modülün varlığına dayalı olarak bir <IfModule> bloku içine alınmak suretiyle sunucuya koşullu olarak eklenebilir.

Sunucunun içinde derlenmiş modüllerin listesini görmek için -l komut satırı seçeneğini kullanabilirsiniz.

Yönergelerin Etki Alanı

İlgili Modüller İlgili Yönergeler
  • <Directory>
  • <DirectoryMatch>
  • <Files>
  • <FilesMatch>
  • <Location>
  • <LocationMatch>
  • <VirtualHost>

Ana yapılandırma dosyasına yerleştirilen yönergeler sunucunun tamamına uygulanır. Yapılandırmanızı sunucunun belli bir parçası için değiştirmek isterseniz yönergelerinizi <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location> ve <LocationMatch> bölümleri içine yerleştirerek etki alanlarını değiştirebilirsiniz. Bu bölümler yönergelerin etkilediği alanları dosya sistemininin belli yerleri veya belli URL’lerle sınırlar. Yerine göre daha hassas ayarlamalar yapmak için bu bölgeler iç içe de kullanılabilir.

Apache, çok sayıda farklı siteyi aynı anda sunabilecek yetenektedir. Buna Sanal Konaklık adı verilir. Yönergelerin etki alanları ayrıca <VirtualHost> bölümleri içine konarak da değiştirilebilir. Böylece belli bir siteden gelen isteklere farklı bir uygulama yapılabilir.

Yönergelerin çoğu bu bölümlere yerleştirilebilirse de bazı yönergelerin bazı bağlamlarda bir etkisi olmaz. Örneğin, süreç oluşturmayı denetleyen yönergeler sadece ana sunucu bağlamına yerleştirilebilir. Hangi yönergenin hangi bağlama yerleştirilebileceğini bulmak için yönergenin bağlamına bakınız. Bu konuda daha ayrıntılı bilgi edinmek için: Directory, Location ve Files Bölümleri Nasıl Çalışır.

.htaccess Dosyaları

İlgili Modüller İlgili Yönergeler
  • AccessFileName
  • AllowOverride

Apache yapılandırma sorumluluğunu dağıtmak için site ağaçları içine özel dosyalar yerleştirilmesine izin verir. Bu özel dosyalar normalde .htaccess dosyaları olmakla birlikte AccessFileName yönergesi kullanılarak rasgele bir isim belirtilebilir. .htaccess dosyalarına yerleştirilen yönergeler sadece dosyanın bulunduğu dizine ve alt dizinlerine uygulanır. .htaccess dosyalarında da ana yapılandırma dosyalarında geçerli sözdizimi kullanılır. .htaccess dosyaları her istek gelişinde yeniden okunduğundan bu dosyalarda yapılan değişiklikler hemen etkisini gösterir.

.htaccess dosyalarına hangi yönergelerin yerleştirilebileceğini bulmak için yönerge bağlamına bakınız. Sunucunun yöneticisi .htaccess dosyalarına hangi yönergelerin yerleştirilebileceğini ana yapılandırma dosyalarında AllowOverride yönergesini kullanarak belirleyebilir.

.htaccess dosyaları hakkında daha ayrıntılı bilgi edinmek için .htaccess öğreticisine bakabilirsiniz.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Yapılandırma Bölümleri - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Yapılandırma Bölümleri

Yapılandırma dosyalarındaki yönergeler sunucunun tamamına uygulanacağı gibi sadece belli dizinler, dosyalar, konaklar veya URL’lere uygulanmakla sınırlanabilir. Bu belgede, yapılandırma bölümü taşıyıcılarınının veya .htaccess dosyalarının, yapılandırma dosyalarındaki diğer yönergelerin etki alanlarını değiştirtirmek için nasıl kullanılacağı açıklanmıştır.

Yapılandırma Bölümü Taşıyıcılarının Türleri

İlgili Modüller İlgili Yönergeler
  • core
  • mod_version
  • mod_proxy
  • <Directory>
  • <DirectoryMatch>
  • <Files>
  • <FilesMatch>
  • <IfDefine>
  • <IfModule>
  • <IfVersion>
  • <Location>
  • <LocationMatch>
  • <Proxy>
  • <ProxyMatch>
  • <VirtualHost>

İki temel taşıyıcı türü vardır. Taşıyıcıların çoğu her istek için değerlendirmeye alınır. Taşıyıcılardaki yönergeler ise sadece bu taşıyıcılarla eşleşen istekler için uygulanır. Diğer yandan, <IfDefine>, <IfModule> ve <IfVersion> taşıyıcıları sadece sunucu başlatılırken veya yeniden başlatılırken değerlendirmeye alınır. Başlatma sırasında gerektirdikleri koşullar sağlanıyorsa içerdikleri yönergeler tüm isteklere uygulanır. Aksi takdirde, içerdikleri yönergeler yok sayılır.

<IfDefine> yönergesi sadece httpd komut satırında uygun parametreler tanımlanmışsa uygulanabilecek yönergeleri içerir. Örneğin, aşağıdaki yapılandırma ile tüm isteklerin diğer siteye yönlendirilebilmesi sadece sunucu httpd -DClosedForNow komut satırı ile başlatıldığı takdirde mümkün olur:

<IfDefine ClosedForNow>
Redirect / http://otherserver.example.com/
 </IfDefine>

<IfModule> yönergesi sadece belli bir modülün sunucuda kullanılabilir durumda olması halinde uygulanabilecek yönergeleri içerir. Modülün ya sunucuyla birlikte durağan olarak derlenmiş olması ya da devingen olarak derlenmiş ve yapılandırma dosyasında yönergeden önce o modüle ilişkin bir LoadModule satırının bulunması gerekir. Bu yönergeyi sadece belli bir modülün varlığının veya yokluğunun yapılandırma dosyanızın çalışmasını etkilememesini istediğiniz durumlarda kullanmalısınız. Eksik modüllerle ilgili hata iletilerini engellediğinden, taşıyıcı içine, her zaman çalışması istenen yönergeler konulmamalıdır.

Aşağıdaki örnekte, MimeMagicFile yönergesi sadece mod_mime_magic modülü mevcutsa uygulanacaktır.

<IfModule mod_mime_magic.c>
MimeMagicFile conf/magic
 </IfModule>

<IfVersion> yönergesi sunucunun belli bir sürümünün çalıştırılması halinde uygulanabilecek yönergeleri içerebilmesi dışında <IfDefine> ve <IfModule> yönergeleri gibidir. mod_version modülü farklı httpd sürümleri ve farklı yapılandırmalarla büyük ağlarda çalışmayı mümkün kılmak veya sürüm denemeleri yapabilmek amacıyla tasarlanmıştır.

<IfVersion >= 2.1>
# burası sadece 2.1.0 veya daha üstü sürümlerde
# iş görür.
 </IfVersion>

<IfDefine>, <IfModule> ve <IfVersion> yönergelerinin önüne "!" konularak olumsuz koşullar için uygulanabilir. Ayrıca, bu bölümler daha karmaşık sınırlamalar elde etmek amacıyla bir diğerinin içinde kullanılabilirler.

Dosya Sistemi ve Site Alanı

En sık kullanılan yapılandırma bölümü taşıyıcıları dosya sistemindeki veya site alanındaki belli yerlerin yapılandırmalarını değiştirmekte kullanılanlardır. Öncelikle, bu ikisi arasındaki farkları bilmek önemlidir. Dosya sistemi disklerinizin işletim sistemi tarafından size gösterilen halidir. Örneğin, öntanımlı kurulumda Apache, Unix sistemlerinde /usr/local/apache2 altındayken Windows sistemlerinde "c:/Program Files/Apache Group/Apache2" altındadır. (Bilgi: Windows için bile, Apache’de dosya yolu belirtilirken tersbölü değil normal bölü karakterleri kullanılır.) Site alanı ise sunucu tarafından istemciye sunulan dizin ağacıdır. Yani, site alanı içindeki /dir/ dizini, Apache’nin Unix üzerinde dosya sistemine öntanımlı olarak kurulduğu yer göz önüne alınarak, dosya sistemindeki /usr/local/apache2/htdocs/dir/ dizinine karşılıktır. Site sayfaları veritabanlarından veya başka yerlerden devingen olarak üretilebildiğinden site alanlarının doğrudan dosya sistemine eşlenmesi gerekli değildir.

Dosya Sistemi Taşıyıcıları

<Directory> ve <Files> taşıyıcıları, düzenli ifade karşılıkları ile beraber, yönergeleri dosya sisteminin parçalarına uygularlar. Bir <Directory> bölümü içindeki yönergeler belli bir dosya sistemi dizinine ve onun alt dizinlerine (ve bunların içindeki dosyalara) uygulanır. Aynı etki .htaccess dosyaları kullanılarak da sağlanabilir. Örneğin aşağıdaki yapılandırmada, /var/web/dir1 dizini ve alt dizinlerinde dizin içeriğinin listelenmesi etkin kılınmaktadır.

<Directory /var/web/dir1>
Options +Indexes
 </Directory>

Bir <Files> bölümü içindeki yönergeler, hangi dizinde bulunduğuna bakılmaksızın ismi belirtilen dosyalara uygulanır. Örneğin, aşağıdaki yapılandırma yönergeleri yapılandırma dosyasının ana bölümüne yerleştirildiği takdirde gizli.html isimli dosyalara nerede bulunursa bulunsun erişime izin vermeyecektir.

<Files gizli.html>
Order allow,deny
Deny from all
 </Files>

Dosya sisteminin belli bir yerindeki belli dosyalarla ilgili yaptırımlar için <Files> ve <Directory> bölümleri birlikte kullanılabilir. Örneğin, aşağıdaki yapılandırma /var/web/dir1/gizli.html, /var/web/dir1/subdir2/gizli.html, /var/web/dir1/subdir3/gizli.html ve /var/web/dir1/ altında bulunabilecek diğer tüm gizli.html dosyalarına erişimi yasaklar.

<Directory /var/web/dir1>
<Files gizli.html>
Order allow,deny
Deny from all
 </Files>
 </Directory>

Site Alanı Taşıyıcıları

<Location> yönergesi ve yönergenin düzenli ifade karşılığı site alanındaki içerik için yapılandırmayı değiştirir. Örneğin aşağıdaki yapılandırma, /gizli ile başlayan URL yollarına erişimi engeller. Özellikle, http://siteniz.mesela.dom/gizli, http://siteniz.mesela.dom/gizli123 ve http://siteniz.mesela.dom/gizli/dir/dosya.html istekleri yanında /gizli ile başlayan diğer isteklere de uygulanır.

<LocationMatch ^/gizli>
Order Allow,Deny
Deny from all
 </LocationMatch>

Dosya sistemi ile etkileşime girmeyen herşey için <Location> yönergesi gerekir. Aşağıdaki örnekte, belli bir URL’nin mod_status modülü tarafından sağlanan bir dahili Apache eylemcisine nasıl eşlenebileceği gösterilmiştir. Bu örnek için dosya sisteminde server-status adında bir dosya veya dizin bulunması gerekli değildir.

<Location /server-status>
SetHandler server-status
 </Location>

Dosya Adı Şablonları ve Düzenli İfadeler

<Directory>, <Files> ve <Location> yönergelerinde, Standart C kütüphanesindeki fnmatch işlevindeki gibi kabuk tarzı dosya ismi kalıpları kullanılabilir. "*" karakteri herhangi bir karakter dizisi ile eşleşirken "?" karakteri tek tek karakterlerle ve "[seq]" kalıbı ise seq içindeki her karakterle eşleşir. "/" karakteri her hangi bir kalıp karakteri ile eşleşmez; açıkça belirtilmesi gerekir.

Daha esnek bir eşleşmenin gerekli olduğu durumlar için her taşıyıcının bir düzenli ifade karşılığı vardır. <DirectoryMatch>, <FilesMatch> ve <LocationMatch> yönergelerinde gerekli eşleşmeleri seçmek için perl uyumlu düzenli ifadelerin kullanımına izin verilir. Ayrıca, yönergelerin uygulanışının düzenli ifade bölümleri kullanılarak nasıl değiştirileceğini öğrenmek için, aşağıda, yapılandırmanın katıştırılmasıyla ilgili bölüme de bakınız.

Tüm kullanıcı dizinlerine ilişkin yapılandırmayı değiştirmek için dosya ismi kalıpları şöyle kullanılabilirdi:

<Directory /home/*/public_html>
Options Indexes
 </Directory>

Düzenli ifade bölümleri kullanarak çeşitli türlerdeki resim dosyalarına erişimi bir defada yasaklayabiliriz:

<FilesMatch \.(?i:gif|jpe?g|png)$>
Order allow,deny
Deny from all
 </FilesMatch>

Ne, Ne Zaman Kullanılır?

Dosya sistemi taşıyıcıları ile site alanı taşıyıcıları arasında seçim yapmak aslında oldukça kolaydır. Dosya sisteminde bulunan nesnelere uygulanacak yönergeler için daima <Directory> veya <Files> kullanılır. Dosya sisteminde bulunmayan nesnelere (bir sayfanın bir veritabanı tarafından üretilmesi gibi) uygulanacak yönergeler için ise <Location> kullanılır.

Dosya sistemindeki nesnelere erişimi kısıtlarken asla <Location> kullanmamak önemlidir. Bunun sebebi farklı site alanı konumlarının (URL’ler) aynı dosya sistemi konumuna eşlenebilmesi dolayısıyla kısıtlamalarınızın etrafından dolaşılabilmesine izin vermesidir. Örneğin, aşağıdaki yapılandırmayı ele alalım:

<Location /dir/>
Order allow,deny
Deny from all
 </Location>

http://siteniz.mesela.dom/dir/ için bir istek yapılmışsa bu doğru çalışacaktır. Fakat dosya sistemi harf büyüklüğüne duyarsızsa ne olacak? Kısıtlamanız, istek http://siteniz.mesela.dom/DIR/ şeklinde yapılarak kolayca geçersiz kılınabilir. Halbuki <Directory> yönergesi isteğin nasıl yapıldığına bakılmaksızın bu konumdan sunulan her türlü içeriğe uygulanacaktı. (Dosya sistemi bağlarıyla bu da aşılabilir. Sembolik bağlar kullanılarak aynı dizin dosya sisteminin bir çok yerine yerleştirilebilir. <Directory> yönergesi dosya yolunu sıfırlamaksızın sembolik bağları izleyecektir. Bu bakımdan, en yüksek seviyede güvenlik için uygun Options yönergesi ile sembolik bağların izlenmesi devredışı bırakılabilir.)

Belki de siz sırf harf büyüklüğüne duyarlı bir dosya sistemi kullanıyorsunuz diye böyle uygulamalara ihtiyacınız olmadığını düşünüyor olabilirsiniz, fakat aynı site alanını çok sayıda dosya sistemi konumuna eşleyecek daha bir sürü yol bulunduğunu unutmayınız. Bu bakımdan dosya sisteminde yapacağınız kısıtlamalarda daima dosya sistemi taşıyıcılarını kullanmalısınız. Bununla birlikte bu kuralın da bir istisnası vardır. Yapılandırma kısıtlamalarının bir <Location/> bölümü içine koyulması, bu bölüme konan yönergelerin etki alanının belli bir URL ile sınırlı olmaması nedeniyle mükemmelen güvenlidir.

Sanal Konaklar

<VirtualHost> taşıyıcısının içinde belli bir konağa uygulanan yönergeler bulunur. Aynı makinede çok sayıda konağı farklı yapılandırmalarla sunuyorsanız bu taşıyıcı çok işinize yarar. Daha fazla bilgi için Sanal Konak Belgeleri bölümüne bakınız.

Vekil

<Proxy> ve <ProxyMatch> taşıyıcıları, sadece belli bir URL ile eşleşen mod_proxy vekil sunucusu üzerinden erişilen sitelere uygulanan yapılandırma yönergelerini bulundururlar. Örneğin aşağıdaki yapılandırma cnn.com sitesine erişim için vekil sunucunun kullanılmasını engelleyecektir.

<Proxy http://cnn.com/*>
Order allow,deny
Deny from all
 </Proxy>

Hangi Yönergelere İzin Veriliyor?

Hangi yönergelere hangi yapılandırma bölümlerinde izin verildiğini öğrenmek için yönerge bağlamına bakınız. <Directory> bölümlerinde izin verilen herşeye sözdizimsel olarak ayrıca <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch>, <Proxy> ve <ProxyMatch> bölümlerinde de izin verilir. Yine de bazı istisnai durumlar mevcuttur:

  • AllowOverride yönergesi sadece <Directory> bölümlerinde çalışır.
  • Options yönergesinin FollowSymLinks ve SymLinksIfOwnerMatch seçenekleri sadece <Directory> bölümlerinde veya .htaccess dosyalarında çalışır.
  • Options yönergesi <Files> ve <FilesMatch> bölümlerinde kullanılamaz.

Bölümler Nasıl Katıştırılır?

Yapılandırma bölümleri belli bir sıra ile uygulanır. Yapılandırma yönergelerinin yorumlanışı üzerinde önemli etkilere sahip olabilmesi nedeniyle neyin ne zaman çalıştığını anlamak çok önemlidir.

Yapılandırma bölümlerinin katıştırılma sırası şöyledir:

  1. <Directory> (düzenli ifadeler hariç) ve .htaccess aynı anda işleme sokulur (.htaccess ile eğer izin verilmişse <Directory> içindeki bazı yönergeler geçersiz kılınabileceği için).
  2. <DirectoryMatch> (ve <Directory ~>).
  3. <Files> ve <FilesMatch> aynı anda işleme sokulur.
  4. <Location> ve <LocationMatch> aynı anda işleme sokulur.

<Directory> bölümündekiler hariç, her grup, yapılandırma dosyasında bulundukları sıraya göre işleme sokulurlar. Yukarıda 1. grup olan <Directory> bölümü en kısa dizin elemanından en uzun dizin elemanına doğru işleme sokulur. Yani, örneğin, <Directory /var/web/dir> bölümü <Directory /var/web/dir/subdir> bölümünden önce işleme sokulacaktır. Eğer aynı uzunlukta çok sayıda dizin varsa <Directory> bölümleri yapılandırma dosyasında bulundukları sıraya göre işleme sokulurlar. Include yönergeleri ile yapılandırmaya dahil edilen dosyaların içerikleri Include yönergesinin bulunduğu yere konulduktan sonra işleme sokulurlar.

<VirtualHost> bölümlerinin içindeki bölümler, sanal konak tanımı dışındaki karşılıklarından sonra uygulanırlar.

İstek mod_proxy tarafından sunulduğu takdirde, <Proxy> taşıyıcısı işlem sırasında <Directory> taşıyıcısının yerini alır.

Sonraki bölümler öncekileri geçersiz kılmak üzere işleme alınırlar.

Bazı Teknik Bilgiler

Aslında, isim dönüşüm aşamasından (Aliases ve DocumentRoots, URL’leri dosya isimlerine eşlemek için kullanılırken) hemen önce uygulanan bir <Location>/<LocationMatch> dizisi vardır. Bu dizinin sonuçları isim dönüşüm aşaması tamamlandıktan sonra tamamen elden çıkarılır.

Bazı Örnekler

Aşağıdaki yapay örnekte katıştırma sırası gösterilmiştir. Hepsinin aynı isteğe uygulandığı varsayımıyla, bu örnekteki yönergeler A > B > C > D > E sırasıyla uygulanacaktır.

<Location />
E
</Location>

<Files f.html>
D
</Files>

<VirtualHost *>
<Directory /a/b>
B
</Directory>
</VirtualHost>

<DirectoryMatch "^.*b/">
C
</DirectoryMatch>

<Directory /a/b>
A
</Directory>

Daha somut bir örnek olarak aşağıdakini ele alalım. <Directory> bölümlerindeki erişim sınırlamaları ne olursa olsun <Location> bölümü son olarak değerlendirmeye alınacak ve sunucuya sınırsız erişim verecektir. Başka bir deyişle, katıştırma sırası önemlidir, bu nedenle dikkatli olmalısınız!

<Location />
Order deny,allow
Allow from all
 </Location>

# Alooo! Bu <Directory> bölümünün hiçbir hükmü yok.
<Directory />
Order allow,deny
Allow from all
Deny from kkadam.mesela.dom
 </Directory>

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Önbellek Kullanım Kılavuzu - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Önbellek Kullanım Kılavuzu

Bu belge mod_cache, mod_disk_cache, mod_mem_cache, mod_file_cache modülleri ve htcacheclean için bir başvuru kılavuzu niteliğindedir. HTTP sunucusu ve vekil olarak çalışmada işlemleri hızlandırmak için bilinen sorunlar ve yanlış yapılandırmalardan kaçınarak Apache’nin önbellekleme özelliklerinin nasıl kullanılacağı açıklanmıştır.

Giriş

Apache HTTP sunucusunun 2.2 sürümünden itibaren mod_cache ve mod_file_cache modülleri deneysel olmaktan çıkarılmış ve üretim amaçlı kullanılabileceğine karar verilmiştir. Bu önbellekleme mimarileri gerek HTTP sunucusu gerekse vekili olarak çalışmada HTTP işlemlerini hızlandırmak anlamında sunucuya güç katarlar.

mod_cache, ortam sağlayıcı modülleri olan mod_mem_cache ve mod_disk_cache ile birlikte HTTP önbelleklemesini akıllıca yerine getirir. İçeriğin kendisi önbellekte saklanırken mod_cache içeriğin önbelleklenebilmesini denetim altında tutan HTTP başlıkları ve seçenekleri ile ilgilenir. Yerel ve vekalet edilen içeriğin her ikisinin de aynı anda işlem görmesi sağlanabilir. mod_cache, vekalet edilen içeriğe, devingen yerel içeriğe veya zamanla değişen yerel dosyalara erişimi hızlandırma ihtiyacına yönelik olarak hem basit hem de karmaşık önbellekleme yapılandırmalarını mümkün kılar.

mod_file_cache ise biraz daha temel ancak bazen daha kullanışlı olabilen bir önbellekleme şekli ile ilgilenir. URL’lerin önbelleklenebilmesini mümkün kılmanın karmaşıklığıyla boğuşmak yerine mod_file_cache, dosyaların Apache’nin son başlatıldığı zamanki durumlarını saklamak için dosyaların belleğe eşlenmek üzere ele alınmasını sağlar. Böylelikle, mod_file_cache, çok sık değişmeyen durağan yerel dosyalara erişim zamanını azaltmaya yardım eder.

CacheFile ve MMapFile yönergeleri ile ilgili bölümlerde anlatılanları saymazsak mod_file_cache, bu belgenin asıl konusu olan mod_cache önbellekleme mimarisine göre daha basit bir önbellekleme gerçeklenimidir.

Bu belgeden azami yararı sağlayabilmek için temel bir HTTP bilginizin olması ve URL’lerin Dosya Sistemine Eşlenmesi ile İçerik Uzlaşımı belgelerini okumuş olmanız gerekir.

Önbelleklemeye Bir Bakış

İlgili Modüller İlgili Yönergeler
  • mod_cache
  • mod_mem_cache
  • mod_disk_cache
  • mod_file_cache
  • CacheEnable
  • CacheDisable
  • MMapFile
  • CacheFile
  • UseCanonicalName
  • CacheNegotiatedDocs

Bir istek sonuçlanıncaya kadar mod_cache modülünde iki aşamadan geçer. İlkinde mod_cache bir URL eşleme modülü olarak çalışır ve URL önbellekteyse ve zaman aşımına uğramamışsa isteğin doğrudan mod_cache tarafından sunulmasını sağlar.

Yani isteğin sunumu sırasında, isteğin örneğin, mod_proxy veya mod_rewrite tarafından ele alınması gerekse bile bu yapılmaz. Önbelleklenen içerik ilk alındığı haliyle sunulur.

Eğer URL önbellekte yoksa, mod_cache isteği bir süzgece tabi tutar. Apache içeriğin varlığını saptamışsa içeriğin süzgeç tarafından sunulmasını sağladıktan sonra, süzgeç içeriğin önbelleklenebileceğini saptamışsa gelecekte sunmak üzere içeriği önbelleğe kaydeder.

Eğer URL önbellekte bulunmuş fakat içeriğin zaman aşımına uğradığı anlaşılmışsa süzgeç yine de eklenir fakat bu kez mod_cache önbellekteki sürümün hala geçerli olup olmadığını saptamak için kaynağın bulunduğu sunucuya bir koşullu istek gönderir. Önbellekteki sürüm hala geçerliyse temel verileri güncellenir ve istek önbellekten sunulur. Önbellekteki sürüm artık geçerli değilse, önbellekteki sürüm silinir ve süzgeç güncel içeriği önbelleğe kaydeder ve isteği oradan sunar.

Önbelleğin Hızlandırılması

Yerel içerik önbelleklendiği takdirde UseCanonicalName yönergesine On değeri atanmışsa önbellekten sunulan sayfa sayısında büyük bir artış olduduğu görülür. Bunun sebebi içeriği sunan sanal konağın isminin önbellek anahtarının bir parçası olarak kullanılmasıdır. Yönergeye On değerini atamak suretiyle çok isimli ve rumuzlu sanal konaklar için farklı önbellek girdileri oluşturulmaz, bunun yerine her meşru sanal konak için ayrı bir önbellek tutulur.

Önbellekleme, URL’nin dosya ismine dönüştürülmesi aşamasında gerçekleştiğinden önbelleklenen belgeler sadece URL isteklerine bir yanıt olarak sunulurlar. Sunucu Taraflı İçerikleri kullanmazsanız genellikle bunun fazla bir önemi olmaz.

<!-- Bu içerik önbelleklenebilir. -->
<!--#include virtual="/dipnot.html" -->

<!-- Bu içerik önbelleklenemez. -->
<!--#include file="/bir/yol/dipnot.html" -->

Sunucu Taraflı İçerikleri kullanıyorsanız ve önbelleklemenin sağladığı hız artışından da yaralanmak istiyorsanız içerik yerleştirmek için virtual içerik türünü kullanınız.

Zaman Aşımı Süreleri

Önbellekli öğeler için öntanımlı zaman aşımı süresi bir saat olmakla birlikte CacheDefaultExpire yönergesi kullanılarak bu değer kolaylıkla geçersiz kılınabilir. Bu öntanımlı değer sadece içeriğin özgün kaynağı bir zaman aşımı süresi veya son değişiklik tarihi belirtmediği takdirde kullanılır.

Bir yanıt Expires başlığını değil de Last-Modified başlığını içeriyorsa mod_cache zaman aşımı süresini CacheLastModifiedFactor yönergesinin nasıl kullanıldığına bakarak saptar.

Yerel içerik için, zaman aşımı süresini hassas olarak ayarlamak gerekirse mod_expires kullanılabilir.

Zaman aşımı süresinin üst sınırı CacheMaxExpire yönergesi ile belirlenebilir.

Şartlı İstekler için Özlü Kılavuz

Önbellekteki içerik zaman aşımına uğrayıp, içerik sağlayıcıya veya arka sunucuya özgün isteği aktarmak yerine ayrı bir istek yapılması gereği Apache’nin şartlı bir istek yapması sonucunu doğurur.

Bir istemcinin veya önbelleğin aynı içeriğin farklı sürümleri arasında ayrım yapabilmesi için HTTP protokolü bazı başlık alanları önerir. Örneğin, "Etag:" başlığıyla sunulan bir özkaynak için "If-None-Match:" başlığıyla bir şartlı istek yapmak mümkün olduğu gibi özkaynak "Last-Modified:" başlığıyla sunuluyorsa şartlı istek "If-Modified-Since:" başlığıyla yapılabilir, vesaire.

Böyle bir şartlı istek yapıldığında yanıt koşulun içerikle eşleşip eşleşmediğine bağlı olarak farklı olur. Eğer istek bir "If-Modified-Since:" başlığıyla yapılmışsa ve içerik istekte belirtilen zamandan önce değiştirilmemişse kısa ve öz olarak bir "304 Not Modified" (Bir değişiklik yok) iletisiyle yanıt verilir.

Aksi takdirde bir şartlı istek yapılmamış gibi içeriğin kendisi sunulur.

Önbellekleme ile ilgili şartlı istekler çifte yarar sağlar. Birinci olarak, böyle bir istek arkadaki sunucuya yapılıyorsa ve iki içerik de aynıysa bunu saptamak kolay olur ve özkaynağın tamamını aktarma külfetinden kurtulunur.

İkinci olarak, şartlı istekler arka sunucuda normalden daha az faaliyete sebep olur. Durağan dosyalar için bu genellikle stat() veya benzeri bir sistem çağrısıyla dosya boyutları ve değişiklik zamanına bakmak şeklinde gerçekleşir. Böylelikle Apache yerel içeriği önbellekliyor olsa bile ve hatta içerik zaman aşımına da uğrasa önbellekteki dosyada bir değişiklik olmadığı takdirde içeriği önbellekten sunmak daha hızlı olacaktır. Çünkü dosyayı önbellekten okumak, arka sunucudan okumaktan daha hızlıdır (bu, bellekten okumayla diskten okumayı karşılaştırmak gibidir).

Neler Önbelleklenebilir?

Evvelce bahsedildiği gibi Apache’de iki tür önbellekleme yapılır ve bunlar farklı yöntemlerle çalışır. mod_file_cache önbelleklemesinde dosyalar Apache başlatıldığı zamanki içerikle saklanır. Bu modül tarafından önbelleğe alınmış bir dosya için istek geldiğinde isteğin yolu kesilip önbellekteki dosya sunulur.

mod_cache önbelleklemesinde işler biraz daha karışıktır. Bir isteğe hizmet sunulurken istenen içerik evvelce önbelleklenmemişse önbellekleme modülü önce içeriğin önbelleklenebilirliğine bakar. Bir yanıtın önbelleklenebilirliğini belirleyen koşullar şunlardır:

  1. Önbellekleme bu URL ile etkin kılınabilmelidir. CacheEnable ve CacheDisable yönergelerine bakınız.
  2. Yanıtın HTTP durum kodu 200, 203, 300, 301 veya 410 olmalıdır.
  3. İstek bir HTTP GET isteği olmalıdır.
  4. İstek bir "Authorization:" başlığı içeriyorsa yanıt önbelleğe alınmayacaktır.
  5. Eğer yanıt bir "Authorization:" başlığı içeriyorsa ayrıca "Cache-Control:" başlığında da "s-maxage", "must-revalidate" veya "public" değerlerinden birini içermelidir.
  6. Eğer URL (GET yöntemi kullanan bir HTML formunun yaptığı gibi) bir sorgu dizgesi içeriyorsa yanıt, RFC2616’nın 13.9 ve 13.2.1. bölümünde açıklandığı gibi max-age veya s-maxage değerli bir "Cache-Control:" başlığı veya "Expires:" başlığı ile açıkça bir zaman aşımı içermedikçe yanıt içeriği önbelleğe alınmayacaktır.
  7. CacheIgnoreNoLastMod yönergesinin kullanımını gerektiren bir durum olmadıkça 200 durum koduna sahip bir yanıtın "Etag", "Last-Modified" ve "Expires" başlıklarından en az birini ya da max-age veya s-maxage değerli bir "Cache-Control:" başlığını içermesi gerekir.
  8. CacheStorePrivate yönergesinin kullanımını gerektiren bir durum olmadıkça yanıt "private" değerli bir "Cache-Control:" başlığı içerdiği takdirde yanıtın içeriği önbelleğe alınmayacaktır.
  9. Benzer şekilde, CacheStoreNoStore yönergesi kullanılmamışsa yanıt "no-store" değerli bir "Cache-Control:" başlığı içeriyorsa yanıt içeriği önbelleğe alınmayacaktır.
  10. Herşeyle eşleşen "*" değerli bir "Vary:" başlığı içeren bir yanıtın içeriği önbelleğe alınmaz.

Neler Önbelleklenmemeli?

Kısaca, istek zamana aşırı bağımlıysa ya da istek kısmen bile olsa HTTP uzlaşımıyla bağdaşmıyorsa önbelleğe alınmamalıdır.

İçeriği istekçinin IP adresine bağlı olarak değişen veya her beş dakikada bir değişikliğe uğrayan bir devingen içeriğe sahipseniz böyle bir içerik asla önbelleğe alınmamalıdır.

Diğer taraftan, içerik HTTP başlığındaki değerlere bağlı olarak değişiyorsa içeriğin bir "Vary" başlığı kullanılarak akıllıca önbelleklenmesi imkanı mevcuttur.

Değişken/Uzlaşımlı İçerik

"Vary" başlıklı bir yanıt arka sunucudan istenirken mod_cache tarafından alınmışsa akıllıca ele alınmaya çalışılacaktır. Mümkünse, mod_cache gelecekte bu içerikle ilgili isteklerin "Vary" başlıklı yanıtları olacağını saptayacak ve önbellekten doğru içerikle yanıt verecektir.

Örneğin, bir yanıt şöyle bir başlık ile alınmışsa,

Vary: negotiate,accept-language,accept-charset

mod_cache sadece accept-language ve accept-charset başlıkları özgün istekle eşleşen önbellekli içeriği sunacaktır.

Güvenlik Kaygıları

Erişim Denetimi ve Yetkilendirme

mod_cache çoğunlukla bir karşı vekile sahip olmak amacıyla kullanılır. Arka sunucunun sorgulanmasını gerektirmeyen tüm istekler önbellekleme modülü tarafından karşılanacaktır. Yerel özkaynakların önbelleklenmesi söz konusu olduğunda Apache’nin güvenlik modeli büyükçe bir değişikliğe uğrar.

Olası .htaccess dosyalarının dosya sisteminin tamamında taranması çok pahalı bir işlem olduğundan mod_cache, (işlemi hızlandırmak için) önbelleğe almanın temel amacını kısmen gözardı ederek, önbellekteki içeriğin sunumu için gerekli yetkilendirmenin olup olmadığı konusunda bir karar üretmez. Başka bir deyişle, eğer mod_cache bir kısım içeriği önbelleğe almışsa içerik zaman aşımına uğramadığı sürece bu içerik önbellekten sunulacaktır.

Örneğin, yapılandırmanız bir özkaynağa IP adresine göre erişime izin veriyorsa bu içeriğin önbelleğe alınmayacağından emin olmalısınız. Bunu CacheDisable yönergesini veya mod_expires kullanarak yapabilirsiniz. Bunu yapmaz, olayı kendi haline bırakırsanız mod_cache bir karşı vekil gibi çalışarak sunulan her içeriği arabelleğe alacak ve hangi IP adresinden gelirse gelsin her istemciye bunu sunacaktır.

Yerel İstismarcılar

Son kullanıcılarıın isteklerine önbellekten hizmet sunulduğundan önbelleğin kendisi içerikle etkileşime geçmek isteyenlerin veya içeriği tahrif etmek isteyenlerin hedefi haline gelebilir. Apache’yi çalıştıran kullanıcı tarafından her zaman önbelleğe yazılabileceğini akıldan çıkarmamak önemlidir. Bu durumda alışılmışın tersine tüm içeriğin Apache kullanıcısı tarafından yazılamamasının sağlanması önerilir.

Eğer Apache kullanıcısı, örneğin bir CGI sürecindeki açık nedeniyle tehlikeye atılırsa, önbellek hedef alınabilir. mod_disk_cache kullanılırken önbellekteki bir öğeyi değiştirmek veya önbelleğe yeni bir öğe eklemek görece daha kolaydır.

Bu risk, Apache kullanıcısını kullanan diğer saldırı türleriyle karşılaştırıldığında daha yüksektir. mod_disk_cache kullanıyorsanız şunları aklınızdan çıkarmayın: (1) Apache güvenlik güncellemelerini takip edin ve sunucunuzu buna göre güncelleyin. (2) Mümkünse suEXEC kullanarak CGI süreçlerini Apache kullanıcısı olmayan bir kullanıcının aidiyetinde çalıştırın.

Önbellek Zehirlenmeleri

Apache bir önbellekli vekil sunucu olarak çalıştığında önbellek zehirlenmesi adı verilen sorunla karşılaşılma olasılığı vardır. Önbellek zehirlenmesi, vekil sunucunun arka sunucudan yanlış (ve genellikle istenmeyen) içerik almasına sebep olan bir saldırı türünü betimlemek için yaygın olarak kullanılan bir terimdir.

Örneğin Apache’nin çalıştığı sistemin kullandığı DNS sunucuları DNS önbellek zehirlenmesinden etkilenebilecek durumdaysa, bir saldırgan Apache’nin istekleri almak için başvuracağı kaynak sunucunun yerini değiştirebilir. Diğer bir örnek, HTTP istek kaçakçılığı adı verilen bir saldırı türüdür.

Bu belge HTTP istek kaçakçılığını derinliğine incelenmesi için uygun yer değildir (böyle kaynaklara arama motorunuzla erişebilirsiniz). Bununla birlikte, vekil tarafından kaynak sunucudan alınan içeriği tamamen denetim altına almak amacıyla kaynak sunucudaki bir açığı istismar etmeye yönelik bir dizi istek yapılabileceğinin olasılık dahilinde olduğunu bilmenizde yarar vardır.

Dosya Tanıtıcı Önbelleklemesi

İlgili Modüller İlgili Yönergeler
  • mod_file_cache
  • mod_mem_cache
  • CacheFile
  • CacheEnable
  • CacheDisable

Bir dosyanın açılması işlemi, özellikle de ağ dosya sistemlerinde bulunan dosyalar için önemli bir gecikme kaynağı olabilir. Önbellekte, çok sunulan dosyaların kendilerinin değil, açık dosya tanıtıcılarının saklanması Apache’yi bu tür gecikmelerden koruyabilir. Apache’de iki tür dosya tanıtıcı önbelleklemesi yapılabilmektedir.

CacheFile yönergesi ile

Apache’de mevcut önbelleklemenin en temel şekli mod_file_cache tarafından sağlanan dosya tanıtıcı önbelleklemesidir. Bu önbellek türü dosyaların kendilerini değil açık dosya tanıtıcılarının bir listesini saklar. Dosyaların bu anlamda önbelleklenmesi, CacheFile yönergesi yapılandırma dosyasında belirtilerek sağlanabilir.

CacheFile yönergesi belirtilen dosyanın Apache başlatıldığında açılmasını ve dosya için yapılan sonraki her istekte bu dosya tanıtıcısının kullanılmasını sağlar.

CacheFile /usr/local/apache2/htdocs/index.html

Büyük miktarda dosyayı bu anlamda önbelleklemeyi tasarlıyorsanız işletim sisteminizin açık dosya tanıtıcılarının sayısı ile ilgili sınırlamasını uygun bir değere ayarlamanız gerekebilir.

CacheFile yönergesini kullandığınız takdirde dosya içeriğindeki değişiklikleri anında isteğe yansıtamazsınız. Apache dosyayı ilk başlatıldığındaki haliyle sunar.

Eğer Apache çalışırken dosya silinmişse Apache ilk başlatıldığındaki haline ilişkin dosya tanıtıcıyı sağlamaya ve dolayısıyla dosya içeriğini sunmaya devam edecektir. Yani, dosya silinmiş ve artık dosya sisteminde görünmüyor olsa bile Apache durdurulup dosya tanıtıcıları kapanmadıkça dosyaların silinmesiyle açılan yer serbest kalmayacaktır.

CacheEnable yönergesi ile

mod_mem_cache modülünün ayrıca, CacheEnable yönergesi üzerinden etkin kılınabilen kendine özgü bir dosya tanıtıcı önbellekleme şeması vardır.

CacheEnable fd /

mod_cache’nin devreye girdiği her işlemde olduğu gibi bu tür dosya tanıtıcı önbelleklemesi de akıllıca yapılır ve önbellekteki içerik zaman aşımına uğradığı halde sunulmaya devam edilmez.

Sistem Belleğinde Önbellekleme

İlgili Modüller İlgili Yönergeler
  • mod_mem_cache
  • mod_file_cache
  • CacheEnable
  • CacheDisable
  • MMapFile

İçeriğin sistem belleğinden sunulması içerik sunmanın evrensel olarak en hızlı yoludur. Dosyaların bir disk denetleyiciden okunması ya da daha kötüsü uzak bir ağdan okunması bellekten okumayla karşılaştırılamayacak ölçüde yavaş işlemlerdir. Disk denetleyiciler genellikle fiziksel süreçleri denetlerler. Ağ erişimi ise band genişliği sınırlamalarından etkilenir. Halbuki bellek erişimi sadece nano saniyeler mertebesinde gerçekleşir.

Sistem belleği en pahalı saklama ortamı olması sebebiyle en verimli şekilde kullanımı önemlidir. Dosyaları sistem belleğinde saklamakla sistemin kullanabileceği bellek miktarını azaltmış olursunuz. İşletim sistemi önbelleklemesinde göreceğiniz gibi bu öyle basit bir konu değildir. Apache’nin kendi kullandığı belleğin bir kısmını önbellek olarak ayırırken çok fazla bellek kullanmamak önemlidir. Aksi takdirde işletim sistemi belleğin yetmediği noktada belleği diske takaslayacağından istenen başarım artışı sağlanamayacaktır.

İşletim Sistemi Önbelleklemesi

Günümüz iştetim sistemlerinin hemen hemen tamamında bellek içi dosya/veri saklama işlemlerini çekirdek yönetir. Bu güçlü bir özelliktir ve işletim sistemlerinin büyük çoğunluğu bunu böyle yapar. Örneğin, Linux’ta bir dosyanın ilk defa okunduğunda ve ikinci kez okunduğunda işlemcinin ne kadar meşgul edildiğine bakalım:

colm@coroebus:~$ time cat testfile > /dev/null
real 0m0.065s
user 0m0.000s
sys 0m0.001s
colm@coroebus:~$ time cat testfile > /dev/null
real 0m0.003s
user 0m0.003s
sys 0m0.000s

Küçük bir dosya için bile okuma süresi bakımından büyük fark ortaya çıkmaktadır. Bunun sebebi çekirdeğin dosya içeriğini bellek daha güncel amaçlar için lazım olana dek bellek içinde saklamasıdır.

Sisteminizde yeterince yedek bellek olduğundan eminseniz, bu önbellekte daha fazla dosya saklanacağından emin olabilirsiniz. Bundan, önbelleğin sistem belleğinde verimli biçimde tutulması için Apache’de ek bir yapılandırmaya gidilmesinin gerekmediği sonucu çıkarılabilir.

Bundan başka, işletim sistemi dosyaların değiştiği ve silindiği zamanları bildiğinden bu tür dosyaların içerikleri gerektiğinde önbellekten kendiliğinden silinmiş olur. Bellek içinde dosya saklarken dosyaların değiştirilme zamanlarını bilme olanağı olmadığından bu durum Apache’ye büyük yarar sağlar.

İşletim sisteminin dosyaların önbelleklenmesi için sağladığı bunca yarara ve başarım artışına karşın bellek içinde dosya önbelleklemenin Apache tarafından yerine getirilmesinin daha iyi olacağı bazı durumlar vardır.

Öncelikle, işletim sistemi sadece bildiği dosyaları önbellekler (veya önbelleklediği dosyaları bilir). Eğer Apache’yi bir vekil sunucu olarak çalıştırıyorsanız, önbelleklediğiniz dosyalar yerel olarak saklanmadan uzaktan sunulabilir. Ancak bellekiçi önbelleklemenin sağladığı hız artışının dayanılmaz çekiciliğine karşı koyamıyorsanız, Apache’nin kendi bellekiçi önbelleklemesine ihtiyacınız var demektir.

MMapFile yönergesi ile

mod_file_cache modülü, bir durağan dosyanın içeriğini sunucunun başlatılması sırasında (mmap sistem çağrısıyla) belleğe eşlenmesini mümkün kılmak için MMapFile yönergesini sağlar. Apache bu dosyaya gelecek sonraki istekler için dosyanın bellekiçi içeriğini kullanacaktır.

MMapFile /usr/local/apache2/htdocs/index.html

CacheFile yönergesinde olduğu gibi bu dosyalarda Apache başlatıldıktan sonra yapılacak bir değişiklikten Apache’nin haberi olmayacaktır.

MMapFile yönergesi ayırdığı belleğin toplam miktarı ile ilgilenmez, dolayısıyla yönergenin aşırı kullanımından kaçınmalısınız. Apache’nin çocuk süreçlerinin her biri bu belleğin kendilerine ait birer kopyasını yapacağından belleğe eşlenen dosyaların çok yer kaplamaması büyük önem taşımaktadır; aksi takdirde işletim sistemi belleği diske takaslayacağından beklenen fayda sağlanamayacaktır.

mod_mem_cache modülü ile

mod_mem_cache modülü HTTP belirtimine uygun olarak bellekiçi önbelleklemeyi akıllıca uygular. Ayrıca yüksek belleği doğrudan kullanabildiğinden MMap desteği olmayan sistemlerde bile bellekiçi önbellekleme yapabilir.

Bu tür önbellekleme şöyle etkin kılınabilir:

# Bellekiçi önbelleklemeyi etkin kılalım
CacheEnable mem /

# Önbellek 1 Megabayttan büyük olmasın
MCacheSize 1024

Disk Üzerinde Önbellekleme

İlgili Modüller İlgili Yönergeler
  • mod_disk_cache
  • CacheEnable
  • CacheDisable

mod_disk_cache modülü önbelleklemenin mod_cache için disk üzerinde yapılmasını mümkün kılar. mod_mem_cache modülünde olduğu gibi bu önbellekleme de akıllıca yapılır ve önbellekteki içerik sadece geçerli kabul edildiği sürece sunulabilir.

Modül bu amaçla genelde şöyle kullanılır:

CacheRoot /var/cache/apache/
CacheEnable disk /
CacheDirLevels 2
CacheDirLength 1

En önemlisi önbelleklenen dosyaların yerel olarak saklanması olup işletim sisteminin sağladığı bellekiçi önbelleklemeden de ayrıca faydalanılmış olur. Bu bakımdan, dosyalar disk üzerinde saklansa bile sıkça erişilen dosyalar işletim sistemi sayesinde aslında bellekten sunulmuş olacaklardır.

Önbellekte Saklamanın Anlamı

mod_disk_cache öğeleri önbellekte saklamak için istek yapılan URL’nin 22 karakterlik özetini oluşturur. Bu özet, çok sayıda URL’nin aynı özeti oluşturmaması için konak ismi, protokol, port ve varsa CGI argümanlarından oluşur.

Özeti oluşturan karakterler 64 karakterlik bir karakter kümesinden seçildiğinden oluşturulması olası farklı özet sayısı 64^22’dir. Örneğin, bir URL’nin xyTGxSMO2b68mBCykqkp1w gibi bir özeti olabilir. Bu özet, bu URL ile erişilen dosyalar önbellek içinde saklanırken dosya ismi öneki olarak kullanılır. Ancak bununla yetinilmez ve içerik CacheDirLevels ve CacheDirLength yönergelerinin değerlerine göre önce dizinlere ayrılır.

CacheDirLevels yönergesi kaç alt seviye dizin olacağını belirler. Örneğin, yukarıdaki özete sahip bir dosyanın isminin başına yukarıdaki yapılandırma örneğine uygun olarak /var/cache/apache/x/y/TGxSMO2b68mBCykqkp1w gibi bir önek getirilebilirdi.

Bu tekniğin asıl amacı belli bir dizin içinde bulunabilecek dosyaların ve alt dizinlerin sayısını düşük tutmaktır. Bu sayının büyük olması çoğu işletim sisteminde başarımın düşmesine sebep olur. CacheDirLength yönergesi "1" değeriyle kullanıldığında her dizin altında en fazla 64 alt dizin veya dosya açılabilir. "2" değeriyle kullanıldığında ise bu sayı 64^2’ye yükselir ve böyle artarak gider. İyi bir sebebiniz olmadıkça CacheDirLength için değer olarak "1" belirtmenizi öneririz.

CacheDirLevels yönergesine atanacak değer önbellekte saklamayı düşündüğünüz olası dosya sayısı ile ilgilidir. Yukarıdaki örnekte olduğu gibi "2" değerini belirtirseniz, toplamda en fazla 4096 dizin oluşturulabilir. 1 milyon dosyanın önbelleklendiği bir durumda bu, her dizinde yaklaşık olarak 245 önbelleklenmiş URL demektir.

Her URL için önbellekte en az iki dosya saklanır. Biri genellikle URL hakkındaki temel verilerden oluşan ".header" dosyasıdır, diğeri ise sunulacak içeriğin bire bir kopyası olan ".data" dosyasıdır.

"Vary" başlığı üzerinden içeriğin uzlaşıldığı durumda URL için bir ".vary" dizini oluşturulur. Bu dizin her biri farklı bir uzlaşıma ait çok sayıda ".data" dosyası içerebilir.

Disk Önbelleğinin Bakımı

mod_disk_cache zaman aşımına uğrayan önbellekli içeriği silse de önbelleğin toplam boyu ve ne kadar boş bellek kaldığı hakkında bilgi vermez.

Bunun yerine Apache önbellek içeriğini düzenli aralıklarla temizleyebilmeniz için htcacheclean adında bir araç içerir. Önbellek için azami ne kadar yer kullanılacağının ve bunun üzerinde htcacheclean’i hangi sıklıkta çalıştırılacağının tespiti biraz karmaşık bir işlem olup uygun değerler genellikle deneme yanılma yoluyla bulunur.

htcacheclean iki işlem kipine sahiptir. Kalıcı bir artalan süreci olarak çalışabileceği gibi cron üzerinden belli aralıklarla da çalıştırılabilir. Çok büyük (onlarca GB) önbelleklerde htcacheclean’in işini bitirmesi 1 saatten fazla sürebileceğinden, cron ile çalıştırma durumunda aynı anda birden fazla kopyanın çalışıyor durumda olmaması için htcacheclean’in çalıştırılma aralığını iyi belirlemek gerekir.

Şekil 1: Önbelleğin büyümesi ve düzenli aralıklarla temizlenmesi.

mod_disk_cache ne kadar önbellek alanı kullandığı ile ilgili bir bilgi vermediğinden htcacheclean’in bir temizlik sonrası yeterince büyük bir genişleme alanı kalacak şekilde yapılandırılması önemlidir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Sunucu Genelinde Yapılandırma - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Sunucu Genelinde Yapılandırma

Bu belgede core modülü ile sağlanan ve sunucunun temel işlemlerini yapılandırmakta kullanılan yönergelerden bazıları açıklanmıştır.

Sunucu Kimliği

İlgili Modüller İlgili Yönergeler
  • ServerName
  • ServerAdmin
  • ServerSignature
  • ServerTokens
  • UseCanonicalName
  • UseCanonicalPhysicalPort

ServerAdmin ve ServerTokens yönergeleri, hata iletileri gibi sunucu tarafından üretilen belgelerde sunucu ile ilgili hangi bilgilerin sunulacağını belirlerler. ServerTokens yönergesi sunucunun HTTP yanıt başlığı alanının değerini belirler.

ServerName, UseCanonicalName ve UseCanonicalPhysicalPort yönergeleri, sunucu tarafından, özüne yönelik URL’leri nasıl oluşturacağını saptamak için kullanılır. Örneğin bir istemci bir dizin isteğinde bulunurken URL’nin sonuna bölü çizgisi eklemese bile Apache’nin istemciyi bölü çizgisi ile bitirilmiş URL yoluna yönlendirmesi gerekir; böylece istemci belge içindeki göreli bağlantıları doğru şekilde çözümleyebilir.

Dosyaların Yerleri

İlgili Modüller İlgili Yönergeler
  • CoreDumpDirectory
  • DocumentRoot
  • ErrorLog
  • LockFile
  • PidFile
  • ScoreBoardFile
  • ServerRoot

Bu yönergeler Apache’nin doğru işlem yapması için gereksinim duyduğu çeşitli dosyaların yerlerini belirlerler. Bölü çizgisi (/) ile başlamayan dosya yolları kullanıldığında bu dosyaların yerlerinin ServerRoot yönergesinde belirtilen dizine göre belirtildiği varsayılır; root olmayan kullanıcılar tarafından yazılabilen dosya yollarına dosya yerleştirmemeye dikkat ediniz. Bu konuda daha ayrıntılı bilgi edinmek için güvenlik ipuçları belgesine bakınız.

Özkaynak Kullanımının Sınırlanması

İlgili Modüller İlgili Yönergeler
  • LimitRequestBody
  • LimitRequestFields
  • LimitRequestFieldsize
  • LimitRequestLine
  • RLimitCPU
  • RLimitMEM
  • RLimitNPROC
  • ThreadStackSize

LimitRequest* yönergeleri, Apache’nin istemcilerden gelen istekleri okumak için kullanacağı özkaynakların miktarları ile ilgili sınırlamalar koymak için kullanılırlar. Bu değerleri sınırlamak suretiyle bazı hizmet reddi saldırılarının etkileri azaltılabilir.

RLimit* yönergeleri ise Apache’nin çocuk süreçleri tarafından çatallanabilen özkaynakların miktarlarını sınırlamakta kullanılırlar. Özellikle de CGI betikleri ve SSI çalıştırma komutları tarafından kullanılan özkaynakları denetlemekte kullanılırlar.

ThreadStackSize yönergesi bazı platformlarda yığıt boyutunu denetim altında tutmak için kullanılır.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Günlük Dosyaları - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Günlük Dosyaları

Bir HTTP sunucusunu verimli şekilde yönetebilmek için oluşabilecek sorunlardan başka sunucunun başarımı ve etkinliği hakkında da bazı geri bildirimler almak gerekir. Apache HTTP Sunucusu çok kapsamlı ve esnek bir günlükleme yeteneğine sahiptir. Bu belgede sunucunun günlükleme yeteneğini nasıl yapılandıracağınızdan ve günlük kayıtlarını nasıl yorumlayacağınızdan bahsedilecektir.

Güvenlik Uyarısı

Apache’nin günlük dosyalarını yazdığı dizine yazabilen birinin sunucuyu başlatan kullanıcı kimliğine (bu genellikle root olur) erişim kazanabileceğine hemen hemen kesin gözüyle bakılabilir. Sonuçlarının neler olacağını kestiremiyorsanız günlüklerin yazıldığı dizinde hiç kimseye yazma erişimi vermeyin; ayrıntılı bilgi için güvenlik ipuçları belgesine bakınız.

Buna ilaveten, günlük dosyaları istemci tarafından sağlanmış bilgiler de içerebilir. Bu nedenle, kötü niyetli istemcilerin günlük dosyalarına denetim karakterleri girmeleri olasılığına karşı ham günlükler ele alınırken dikkatli olunmalıdır.

Hata Günlüğü

İlgili Modüller İlgili Yönergeler
  • ErrorLog
  • LogLevel

İsmi ve yeri ErrorLog yönergesi ile belirtilen sunucu hata günlüğü, en önemli günlük dosyasıdır. Apache httpd tarafından istekler işlenirken saptanan hatalar ve tanı bilgileri bu dosyaya gönderilir. Sunucuyu başlatırken veya sunucu çalışırken bir sorunla karşılaşıldığında, neyin yanlış gittiğini öğrenmek için bakılacak ilk yer burasıdır. Günlük kaydı çoğunlukla sorunun nasıl düzeltileceği ile ilgili ayrıntıları da içerir.

Hata günlüğü normal olarak bir dosyaya yazılır (genellikle, dosyanın ismi Unix sistemlerinde error_log, Windows ve OS/2’de ise error.log’dur). Ayrıca, Unix sistemlerinde sunucunun hataları syslog’a veya borulamak suretiyle bir programa aktarması da mümkündür.

Hata günlüğünün biçemi anlaşılır olup içeriği kısmen serbestçe belirlenir. Çoğu hata günlüğü girdisinde bulunan belli başlı bilgiler vardır. Örnek tipik bir hata iletisi içermektedir:

[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] client denied by server configuration: /export/home/live/ap/htdocs/test

Günlük girdisinin ilk öğesi iletinin yazıldığı tarih ve saatten oluşur. İkinci öğe raporlanan bilginin önem derecesini belirtir. Hata günlüğüne gönderilecek hata türlerinin önem seviyesini belirlemek için LogLevel yönergesi kullanılır. Üçüncü öğe hatanın üretilmesine sebep olan istemcinin IP adresini içerir. Kalanı iletinin kendisidir (duruma bakılırsa sunucu istemci erişimini reddetmek üzere yapılandırılmış). Sunucu istenen belgenin (belge yolunu değil) dosya sistemindeki yolunu raporlamıştır.

Hata günlüğünde görünebilecek ileti çeşitliliği oldukça fazladır. Çoğu yukarıdaki örneğin benzeridir. Hata günlüğü ayrıca, CGI betiklerinin hata ayıklama çıktılarını da içerir. Bir CGI betiği tarafından standart hataya (stderr) yazılan her türlü bilgi doğrudan hata günlüğüne kopyalanır.

Hata günlüğünü bilgi ekleyerek veya kaldırarak kişiselleştirmek mümkündür. Bununla birlikte, hata günlüğü girdilerinin ilgili olduğu isteklerin erişim günlüğünde de girdileri vardır. Örneğin, yukarıdaki girdi, erişim günlüğünde 403 durum kodlu bir girdiyle ilgilidir. Erişim günlüğünü de kişiselleştirmek mümkün olduğundan hata durumlarında bu günlük dosyasını da kullanarak daha fazla bilgi sağlayabilirsiniz.

Sunucuyu denerken olası sorunlara karşı hata günlüğünü sürekli izlemelisiniz. Unix sistemlerinde bunu şöyle bir komutla sağlayabilirsiniz:

tail -f error_log

Erişim Günlüğü

İlgili Modüller İlgili Yönergeler
  • mod_log_config
  • mod_setenvif
  • CustomLog
  • LogFormat
  • SetEnvIf

Sunucu erişim günlüğü sunucu tarafından işleme alınan tüm istekleri kaydeder. Erişim günlüğünün yeri ve içeriği CustomLog yönergesi ile belirlenir. LogFormat yönergesi ile günlük içeriğini kişiselleştirmek mümkündür. Bu bölümde sunucunun bilgileri erişim günlüğüne kaydetmesi için nasıl yapılandırılacağından bahsedilecektir.

Şüphesiz, bilginin erişim günlüğünde saklanması günlük yönetiminde ilk adımı oluşturur. Sonraki adım yararlı istatistikleri üretmek için bu bilgiyi incelemektir. Günlük incelemesi bu belgenin kapsamına dahil değildir ve aslında bu işlem sunucunun yaptığı işlerden biri değildir. Bu konu ve günlük incelemesi yapan uygulamalar hakkında daha ayrıntılı bilgi edinmek için dmoz.org veya Yahoo’ya bakınız.

Apache httpd’nin çeşitli sürümlerinde erişim günlüklerini denetlemek için kullanılan diğer modüller ve yönergeler arasında mod_log_referer, mod_log_agent modülleri ve TransferLog yönergesi sayılabilir. Artık, daha eski tüm diğer yönergelerin işlevselliklerini bir araya toplayan CustomLog yönergesi kullanılmaktadır.

Erişim günlüğünün girdi biçemi kolayca isteğe göre düzenlenebilmektedir. Biçemi belirtmekte kullanılan biçem dizgesi, C tarzı printf(1) biçem dizgesini andırır. Sonraki bölümlerde bazı örneklere yer verilmiştir. Biçem dizgesini oluşturan belirteçlerin tam listesi için mod_log_config belgesinin Günlük Girdilerinin Kişiselleştirilmesi bölümüne bakınız.

Ortak Günlük Biçemi (OGB)

Erişim günlüğü için sıklıkla kullanılan bir yapılandırma:

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common

İlk satırda belli bir biçem dizgesi için common diye bir takma ad tanımlanmaktadır. Biçem dizgesi, sunucuya hangi belli bir bilgi parçalarını günlükleyeceğini söyleyen % imli biçem belirteçlerinden oluşur. Biçem dizgesine ayrıca dizgesel sabitler de yerleştirilebilir ve bunlar erişim günlüğüne oldukları gibi kopyalanırlar. Biçem dizgesi içinde çift tırnak karakteri (") biçem dizgesini vaktinden önce sonlandırmaması için ters bölü çizgisi ile öncelenmelidir. Biçem dizgesi ayrıca, satır sonlarını belirtmek için "\n" ve sekmeleri belirtmek için "\t" denetim karakterlerini de içerebilir.

CustomLog yönergesi evvelce tanımlanmış bir takma adı kullanarak yeni bir günlük dosyası tanımlar. Erişim günlüğünün dosya ismi bölü çizgisi ile başlamadıkça dosya yolunun ServerRoot değerine göreli olduğu varsayılır.

Yukarıdaki yapılandırma günlük dosyasına girdileri Ortak Günlük Biçemi (Common Log Format) adı verilen standart biçemde yazar. Bu standart biçem başka HTTP sunucuları tarafından da kullanılır ve çoğu günlük inceleme yazılımı tarafından tanınır. Ortak Günlük Biçeminde üretilen günlük girdileri şöyle görünür:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326

Bu günlük girdisini parça parça açıklayalım:

127.0.0.1 (%h)
Bu, sunucuya istek yapan istemcinin (uzak konağın) IP adresidir. Eğer HostnameLookups yönergesine On değeri atanmışsa sunucu bu IP adresi için DNS sorgusu yapacak ve IP adresi yerine bulduğu konak ismini yazmaya çalışacaktır. Bununla birlikte, bu işlem sunucuyu epeyce yavaşlattığından önerilmemektedir. Konak isimlerini saptamak için en iyisi günlük girdilerini logresolve gibi bir günlük işlemcisinden geçirmektir. Burada raporlanan IP adresi doğrudan istemcinin IP adresi olmayabilir. Eğer sunucu ile istemci arasında bir vekil sunucu varsa bu IP adresi, vekil sunucunun IP adresi olacaktır.
- (%l)
Çıktıdaki bir "tire" imi istenen bilgi parçasının mevcut olmadığı anlamına gelir. Bu durumda, mevcut olmayan bilgi istemci makine üzerinde identd tarafından belirlenen istemcinin RFC 1413 kimliğidir. Bu bilgi oldukça güvenilmezdir ve sıkıca denetlenen iç ağlar haricinde hemen hemen asla kullanılmamalıdır. Apache, IdentityCheck yönergesine On değeri atanmış olmadıkça bu bilgiyi saptamaya uğraşmaz.
frank (%u)
Bu, belge isteğinde bulunan kişinin HTTP kimlik doğrulamasıyla saptanan kullanıcı kimliğidir. Bu değer CGI betiklerine REMOTE_USER ortam değişkeni ile sağlanır. Eğer istek için durum kodu 401 ise (aşağıya bakınız) henüz kullanıcının kimliği doğrulanmamış olacağından bu değere güvenilmemelidir. Eğer belge parola korumalı değilse günlüğün bu kısmı da yukarıdaki gibi "-" olacaktır.
[10/Oct/2000:13:55:36 -0700] (%t)
İsteğin alındığı tarih ve saat. Biçemi şöyledir:

[gün/ay/yıl:saat:dakika:saniye dilim]
gün    = 2 hane
ay     = 3 harf
yıl    = 4 hane
saat   = 2 hane
dakika = 2 hane
saniye = 2 hane
dilim  = (`+' | `-') 4 hane

Günlük biçem dizgesinde zaman gösterim biçemini %{biçem}t şeklinde belirtmek de mümkündür. Buradaki biçem dizgesi, stardart C kütüphanesindeki strftime(3) işlevi için tanımlanmış biçem belirteçleriyle oluşturulabilir.
"GET /apache_pb.gif HTTP/1.0" (\"%r\")
İstemciden alınan istek satırının çift tırnaklar arasında gösterilmesi istenmiştir. İstek satırı en yararlı bilgi parçalarını içerir. Birincisi, istemci tarafından kullanılan yöntem GET’miş. İkinci olarak istemci /apache_pb.gif dosyasını istemiş ve üçüncü olarak istemci HTTP/1.0 protokolünü kullanmış. İstek satırının bazı parçalarını bağımsız olarak da günlüklemek mümkündür. Örneğin, "%m %U%q %H" dizgesi, yöntem, yol, sorgu dizgesi ve protokolü kaydedecektir; bu dizge "%r" biçem belirtecinin tek başına yaptığı işi yapar.
200 (%>s)
Bu, sunucunun istemciye gönderdiği durum kodudur. İsteğin başarıyla yerine getirilip getirilmediğini gösterdiği için bu bilgi çok değerlidir. Durum kodu 2 ile başlıyorsa istek başarıyla yerine getirilmiştir, 3 ile başlıyorsa yönlendirilmiştir, 4 ile başlıyorsa istemci tarafında bir hata oluşmuştur, 5 ile başlıyorsa sunucuda bir hata oluşmuştur. Olası hata kodlarının tam listesi RFC2616 Hiper Metin Aktarım Protokolünün 10. bölümünde bulunabilir.
2326 (%b)
Son parça istemciye döndürülen nesnenin yanıt başlığı hariç uzunluğudur. Eğer istemciye bir içerik döndürülmemişse bu değer "-" olacaktır. Bunun yerine günlüğe "0" yazdırmak için %B belirtecini kullanınız.

Birleşik Günlük Biçemi

Sıklıkla kullanılan diğer bir biçem dizgesi Birleşik Günlük Biçemi (Combined Log Format) olup şöyle kullanılabilir:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log combined

Bu biçem ilaveten 2 alan içermesi dışında Ortak Günlük Biçemi ile aynıdır. İlave alanların ikisi de %{başlık}i biçeminde olup buradaki başlık, HTTP isteğindeki başlık alanlarından biridir. Bu biçemin kullanıldığı bir erişim günlüğü girdisi şöyle olurdu:

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gif HTTP/1.0" 200 2326 "http://www.example.com/start.html" "Mozilla/4.08 [en] (Win98; I ;Nav)"

Ek alanlar:

"http://www.example.com/start.html" (\"%{Referer}i\")
HTTP istek başlığı "Referer". İstemcinin raporladığı isteğin kaynaklandığı URI. (Bu isteğin yapılmasını sağlayan bağlantıyı içeren URL veya istek bir sayfanın bileşenleri ile ilgiliyse istenen sayfanın URL’si olabilir.)
"Mozilla/4.08 [en] (Win98; I ;Nav)" (\"%{User-agent}i\")
Tarayıcı kimliğini içeren HTTP istek başlığı. Bu istemcinin tarayıcısının raporladığı kendi tanıtım bilgisidir.

Çok Sayıda Erişim Günlüğü

Yapılandırma dosyasında çok sayıda CustomLog yönergesi kullanarak çok sayıda erişim günlüğü kolayca oluşturulabilir. Örneğin aşağıdaki yönergelerle 3 tane erişim günlüğü oluşturulacaktır. İlki temel OGB bilgisini içerirken diğer ikisi isteğin kaynaklandığı yeri ve tarayıcı kimliğini içerir. Son iki CustomLog satırı ayrıca, ReferLog ve AgentLog yönergelerinin etkilerinin nasıl taklit edileceğini de göstermektedir.

LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
CustomLog logs/referer_log "%{Referer}i -> %U"
CustomLog logs/agent_log "%{User-agent}i"

Bu örnek ayrıca, LogFormat yönergesi ile bir takma ad tanımlamanın şart olmadığını da göstermektedir. Günlük biçemi doğrudan CustomLog yönergesinde belirtilebilir.

Şarta Bağlı Günlükler

Bazı durumlarda istemcinin yaptığı isteğe bağlı olarak erişim günlüğünde belli girdilerin dışlanması gerekebilir. Bu, ortam değişkenleri sayesinde kolayca yerine getirilebilir. Önce isteğin belli koşulları sağladığını belirten bir ortam değişkeni ataması yapılır. Bu işlem SetEnvIf yönergesi ile yapılır. Sonra da, ortam değişkenine bağlı olarak isteklerin günlüğe dahil edilip edilmeyeceği CustomLog yönergesinin env= deyimi kullanılarak belirtilir. Bazı örnekler:

# yerel konaktan kaynaklanan istekleri imleyelim
SetEnvIf Remote_Addr "127\.0\.0\.1" kaydetme
# robots.txt dosyası isteklerini imleyelim
SetEnvIf Request_URI "^/robots\.txt$" kaydetme
# Kalanları günlüğe kaydedelim
CustomLog logs/access_log common env=!kaydetme

Başka bir örnek olarak, Türkçe belge isteklerini bir dosyaya diğer dillerdeki istekleri başka bir dosyaya kaydedelim.

SetEnvIf Accept-Language "tr" turkce
CustomLog logs/turkce_log common env=turkce
CustomLog logs/diger_diller_log common env=!turkce

Şarta bağlı günlük kaydının çok esnek ve güçlü olabileceğini göstermiş olsak da günlük içeriğini denetlemenin tek yolu bu değildir. Günlük dosyaları sunucu etkinliğini eksiksiz olarak kaydedebildikleri takdirde daha yararlı olurlar. Günlük dosyalarını sonradan işleme tabi tutarak istenmeyen girdileri kaldırılmış bir kopya almak hem kolay hem de daha yararlıdır.

Günlük Çevrimi

Yükü ağır sunucularda günlük dosyalarına kaydedilen bilginin miktarı çok büyük boyutlara ulaşabilir. 10.000 istek içeren bir erişim günlüğü yaklaşık 1MB yer kaplar. Etkin günlük dosyasını belirli aralıklarla değiştirmek veya silmek gerekebilir. Apache çalışırken dosyayı sürekli açık tuttuğu ve yazdığı için bu işlem sunucu çalışırken yapılamaz. Bu bakımdan, günlük dosyası değiştirildikten veya silindikten sonra yeni dosyanın açılması için sunucunun yeniden başlatılması gerekir.

Nazikçe yeniden başlatmak suretiyle sunucunun, mevcut ve bekleyen bağlantıları kaybetmeden yeni günlük dosyalarını açması sağlanabilir. Bununla birlikte, bu işlem sırasında sunucunun eski isteklere sunumu bitirene kadar eski günlük dosyalarına yazmaya devam edebilmesi gerekir. Bu bakımdan, yeniden başlatmanın ardından eski günlük dosyaları üzerinde bir işlem yapmadan önce biraz beklemek gerekir. Günlük dosyalarını döndürürken kullanılan senaryolarda genellikle eski günlük dosyaları yer kazanmak için sıkıştırılırlar:

mv access_log access_log.old
mv error_log error_log.old
apachectl graceful
sleep 600
gzip access_log.old error_log.old

Günlük çevrimi yapmanın başka bir yolu da sonraki bölümde açıklandığı gibi borulu günlükler kullanmaktır.

Borulu Günlükler

Apache httpd hata ve erişim günlüklerini doğrudan bir dosyaya yazmak yerine bir boru üzerinden başka bir sürece yazabilir. Bu yetenek ana sunucuya herhangi bir kod eklemeksizin günlükleme esnekliğini şaşırtıcı derecede arttırır. Günlükler boruya yazılmak istenirse dosya ismini boru karakteriyle ("|") değiştirip ardına günlük girdilerini standart girdisinden kabul edecek programın ismini eklemek yeterlidir. Apache sunucusu başlatıldığı zaman borulu günlük işlemini de başlatacaktır. Eğer sunucu çalışırken günlükleri kabul eden süreç çökerse Apache bu programı yeniden başlatır. (Bu son özelliği sebebiyle bu tekniğe “güvenilir borulu günlükleme” adını veriyoruz.)

Borulu günlük süreçleri ana Apache httpd süreci tarafından başlatılır ve bu süreçler ana Apache httpd sürecinin kullanıcı kimliğini miras alırlar. Yani borulu günlükleme programları aslında root tarafından çalıştırılmış gibi olur. Bu bakımdan, bu programları basit ve güvenilir kılmak çok önemlidir.

Borulu günlüklerin önemli kullanım alanlarından biri de sunucuyu yeniden başlatmak gerekmeksizin günlük çevrimini mümkün kılmaktır. Apache HTTP sunucusu bu amaçla kullanılmak üzere rotatelogs diye bir program içerir. Örneğin, günlükleri 24 saatte bir döndürmek isterseniz bunu şöyle yapabilirsiniz:

CustomLog "|/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common

Borunun diğer ucundaki süreci başlatacak komutun tırnak içine alındığına dikkat ediniz. Bu örnekler erişim günlüğü için verilmişse de aynı teknik hata günlüğü için de kullanılabilir.

Hariçten bir uygulama olarak cronolog isminde buna benzer ancak çok daha esnek bir program daha vardır.

Borulu günlükler de şarta bağlı günlükleme kadar güçlü olmakla beraber çevrimdışı ardıl işlemler gibi daha basit çözümler için kullanılmamalıdır.

Öntanımlı olarak borulu günlük süreci bir kabuk sayesinde yeniden oluşur. (normalde /bin/sh -c ile). Kabuk üzerinden kabuk çağrılarının özelliğinden dolayı borulu günlük programı çalışırken ve yeniden başlatma sırasındaki sinyal yakalama sorunlarından dolayı ek bir kabuk sürecinin başlatılmasi ihtimal dahilindedir.

Bir kabuk oluşturmaksızın borulu günlük sürecini yeniden oluşturmak için "|" yerine "||" kullanın:

# Kabuk kullanmadan "rotatelogs" kullanımı
CustomLog "||/usr/local/apache/bin/rotatelogs /var/log/access_log 86400" common

Sanal Konaklar

Bir sunucu çok sayıda sanal konak ile hizmet sunarken bunların günlük kayıtları için çeşitli seçenekler mevcuttur. İlk seçenekte, sanki sunucu tek bir konakla hizmet sunuyormuş gibi günlük kaydı yapılır. Günlükleme yönergelerini <VirtualHost> bölümlerinin dışına, ana sunucu bağlamına yerleştirerek tüm isteklerin aynı erişim ve hata günlüğüne yazılmasını sağlamak olasıdır. Bu teknik, tek tek sanal konaklar için kolayca istatistik toplamaya izin vermez.

Eğer CustomLog veya ErrorLog yönergesi bir <VirtualHost> bölümüne yerleştirilirse bu sanal konağa bütün erişimler veya hatalar belirtilen dosyaya günlüklenecektir. Böyle günlükleme yönergeleri içermeyen sanal konakların günlükleri hala ana sunucunun hata ve erişim günlüklerine yazılmaya devam edecektir. Bu teknik az sayıda sanal konak barındıran sunucular için çok kullanışlıdır. Fakat sanal konak sayısı çok fazlaysa bu teknikle günlük dosyalarını yönetmek çok karmaşık bir hal alabilir. Ayrıca, yetersiz dosya tanıtıcısı sorunlarıyla çok sık karşılaşılabilir.

Erişim günlükleri için çok az bir fedakarlıkla çok iyi bir çözüm vardır. Günlük biçemine sanal konaklarla ilgili bilgi eklemek suretiyle tüm konakların aynı günlük dosyasını kullanmaları olasıdır. Böylece günlük dosyası sonradan her sanal konak için ayrı bir dosya oluşturmak üzere ayrıştırılabilir. Örneğin, bu işlem için şu yönergeler kullanılıyor olsun:

LogFormat "%v %l %u %t \"%r\" %>s %b" ortaksankon
CustomLog logs/access_log ortaksankon

%v belirteci isteği sunan sanal konağın ismini günlüğe yazmak için kullanılır. Daha sonra split-logfile gibi bir program kullanarak, bu dosyadan her sanal konak için ayrı birer dosya elde edilebilir.

Diğer Günlük Dosyaları

İlgili Modüller İlgili Yönergeler
  • mod_logio
  • mod_log_forensic
  • mod_cgi
  • mod_rewrite
  • mod_log_config
  • LogFormat
  • BufferedLogs
  • ForensicLog
  • PidFile
  • RewriteLog
  • RewriteLogLevel
  • ScriptLog
  • ScriptLogBuffer
  • ScriptLogLength

Gönderilen ve alınan bayt sayısının günlüklenmesi

mod_logio modülü LogFormat yönergesinde kullanılan biçem belirteçlerine alınan ve gönderilen bayt sayıları için iki belirteç (%I ve %O) ekler.

Adli Günlük

mod_log_forensic modülü istemci isteklerinin kanıt olarak kullanılmak amacıyla günlüklenmesini sağlar. Günlükleme her istek için isteğe hizmet sunmadan önce ve sonra olmak üzere iki defa yapılır. Böylece günlük dosyasında başarılı her istek için iki satır bulunur. Adli günlükleme çok sıkı kurallara tabi olup kişiselleştirilemez. Güvenlik ve hata ayıklama aracı olarak yararlı değildir.

PID Dosyası

Apache httpd başlatıldığında, ana httpd sürecinin kimliği (PID) logs/httpd.pid dosyasına kaydedilir. Bu dosyanın ismi PidFile yönergesi ile değiştirilebilir. Bu süreç kimliği sistem yöneticisi tarafından ana sürece sinyal göndererek artalan sürecini sonlandırmak veya yeniden başlatmak için kullanılır. Windows üzerinde bu işlem için -k komut satırı seçeneği kullanılır. Bu konuda daha ayrıntılı bilgi edinmek için Durdurma ve Yeniden Başlatma belgesine bakınız.

Betik Günlüğü

ScriptLog yönergesi CGI betiklerinin girdi ve çıktılarını kaydetmenizi mümkün kılmak suretiyle hata ayıklamaya yardımcı olur. Bu sadece deneysel amaçla kullanılmalı, asıl sunucuya uygulanmamalıdır. mod_cgi belgesinde daha fazla bilgi bulunabilir.

Yeniden Yazım Günlüğü

Güçlü ve karmaşık mod_rewrite özellikleri kullanılırken, hata ayıklamaya yardımcı olmak için RewriteLog yönergesini kullanmak gerekebilir. Yönerge, günlük dosyasında yeniden yazım motorunun istekleri nasıl dönüştürdüğüyle ilgili ayrıntılı bir döküm üretir. Ayrıntı seviyesi RewriteLogLevel yönergesi ile belirlenir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


URL’lerin Dosya Sistemi ile Eşleştirilmesi - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

URL’lerin Dosya Sistemi ile Eşleştirilmesi

Bu belgede, bir istekte belirtilen URL’nin sunulacak dosyanın dosya sistemindeki yerini bulmak için Apache tarafından nasıl kullanıldığı açıklanmaktadır.

İlgili Modüller ve Yönergeler

İlgili Modüller İlgili Yönergeler
  • mod_alias
  • mod_proxy
  • mod_rewrite
  • mod_userdir
  • mod_speling
  • mod_vhost_alias
  • Alias
  • AliasMatch
  • CheckSpelling
  • DocumentRoot
  • ErrorDocument
  • Options
  • ProxyPass
  • ProxyPassReverse
  • ProxyPassReverseCookieDomain
  • ProxyPassReverseCookiePath
  • Redirect
  • RedirectMatch
  • RewriteCond
  • RewriteRule
  • ScriptAlias
  • ScriptAliasMatch
  • UserDir

DocumentRoot

Yapılan bir isteğe hangi dosyanın sunulacağına karar verirken Apache’nin öntanımlı davranışı istek için URL yolunu (URL’den konak ismi ve port ayrıldıktan sonra kalan kısım) alıp bunu yapılandırma dosyasında DocumentRoot yönergesi ile belirtilen dizinin sonuna eklemektir. Bu nedenle, DocumentRoot altındaki dizinler ve dosyalar sitenin dışardan görünen temel belge ağacını oluştururlar.

Örneğin, DocumentRoot yönergesine /var/http/html atanmış olsun. http://mesela.dom/balıklar/zargana.html şeklindeki bir istek için istemciye /var/http/html/balıklar/zargana.html dosyası sunulur.

Apache ayrıca, sunucunun birden fazla konak için istek kabul etmesini sağlayan sanal barındırmaya da muktedirdir. Bu durumda her sanal konak için ayrı bir DocumentRoot belirtilebileceği gibi sunulacak içeriğin istekte bulunulan IP adresi veya konak ismine dayanarak devingen olarak saptanmasını sağlayabilen mod_vhost_alias modülüyle gelen yönergeler de kullanılabilir.

DocumentRoot yönergesi yapılandırma dosyanızda ana sunucu için bir tane ve muhtemelen oluşturduğunuz her sanal konak için de birer tanedir.

Belge Kök Dizini Dışındaki Dosyalar

Bazen dosya sisteminde doğrudan DocumentRoot altında bulunmayan dosyalara da erişim izni vermek gerekir. Apache’de bunu sağlamanın çeşitli yolları vardır. Unix sistemlerinde sembolik bağlar sayesinde dosya sisteminin farklı yerlerindeki dosyaları ve dizinleri DocumentRoot altındaymış gibi göstermek mümkündür. Options yönergesine değer olarak FollowSymLinks veya SymLinksIfOwnerMatch atanmadıkça Apache olası güvenlik açıklarına karşı öntanımlı olarak sembolik bağları izlemez.

Bundan başka, dosya sisteminin farklı parçalarını belge kök dizini altında göstermek için Alias yönergesi de kullanılabilir. Örneğin,

Alias /belgeler /var/http

yapılandırması ile http://mesela.dom/belgeler/dizin/dosya.html URL’si için dosya sistemindeki /var/http/dizin/dosya.html dosyası sunulacaktır. Hedef dizindeki dosyaları birer CGI betiği olarak imlemesi dışında ScriptAlias yönergesi de aynı şekilde çalışır.

Biraz daha fazla esnekliğin gerektiği durumlarda düzenli ifadelere dayalı eşleşmeler sağlamak üzere AliasMatch ve ScriptAliasMatch yönergelerinin gücünden yararlanılabilir. Örneğin,

ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi-bin/(.+) /home/$1/cgi-bin/$2

satırı sayesinde http://mesela.dom/~user/cgi-bin/betik.cgi URL’si /home/user/cgi-bin/betik.cgi dosyası ile eşleştirilir ve dosya bir CGI betiği olarak çalıştırılırdı.

Kullanıcı Dizinleri

Geleneksel olarak Unix sistemlerinde belli bir kullanıcının (örn, birisi) ev dizinine ~birisi/ şeklinde atıfta bulunulabilir. mod_userdir modülü bu özelliği site üzerinden kullanıcıların ev dizinlerindeki dosyaları kişisel sayfalar olarak sunmalarını sağlamak üzere kullanır. Örnek:

http://mesela.dom/~birisi/dosya.html

Güvenlik sebebiyle kullanıcıların ev dizinlerine doğrudan HTTP erişimi vermek uygun olmaz. Bu bakımdan, kullanıcının ev dizini altında HTTP erişimi verilecek dosyaların bulunduğu dizini belirtmek için UserDir yönergesi sağlanmıştır. Öntanımlı olan Userdir public_html yapılandırması ile yukarıdaki gibi bir URL kullanıcının ev dizini (/etc/passwd dosyasında belirtilir) /home/birisi/ altında yer alan /home/birisi/public_html/dosya.html dosyası ile eşleşirdi.

Ev dizininin yerinin /etc/passwd dosyasında belirtilmediği sistemlerde kullanılmak üzere Userdir yönergesinin başka kullanım şekilleri de vardır.

Bazı kişiler (genellikle URL üzerinde %7e olarak kodlanması sebebiyle) "~" simgesini biçimsiz bulabilir ve kullanıcı dizinlerini imlemek için başka bir karakter kullanmayı tercih edebilirler. Bu işlevsellik mod_userdir tarafından desteklenmemektedir. Ancak, kullanıcı dizinleri düzgün şekilde yapılandırılmışsa istenen etki AliasMatch yönergesi ile sağlanabilir. Örneğin, http://mesela.dom/sayfalar/birisi/dosya.html URL’si ile /home/birisi/public_html/dosya.html dosyasını eşlemek için AliasMatch yönergesi şöyle kullanılabilirdi:

AliasMatch ^/sayfalar/([a-zA-Z0-9]+)/?(.*) /home/$1/public_html/$2

URL Yönlendirme

Yukarıdaki bölümlerde açıklanan yapılandırma yönergeleri Apache’ye içeriği dosya sisteminin belli bir yerinden alıp istemciye göndermesini söyler. Bazen istemciye, istediği içeriğe farklı bir URL ile erişebileceğini ve bu URL için ayrı bir istek yapması gerektiğini bildirmek gerekir. Bu işleme yönlendirme adı verilir ve bu işlevsellik Redirect yönergesi ile sağlanır. Örneğin, DocumentRoot altındaki /foo/ dizininin içeriğinin /bar/ adında yeni bir dizine taşınması halinde istemciye yeni konumun bildirilmesi şöyle sağlanabilirdi:

Redirect permanent /foo/ http://mesela.dom/bar/

Bu atama sayesinde /foo/ ile başlayan URL yolları mesela.dom sunucundaki /bar/ dizini altındaki içeriğe yönlendirilmektedir. Yönlendirmeyi aynı sunucu üzerinde yapmak zorunda değilsiniz, bu yönerge ile başka bir sunucuya da yönlendirme yapabilirsiniz.

Apache ayrıca, yeniden yazma ile ilgili daha karmaşık sorunlara çözüm olarak RedirectMatch diye bir yönerge daha sağlar. Örneğin bir sitenin baş sayfasını diğer isteklerden ayrı olarak farklı bir siteye yönlendirmek için yönergeyi şöyle kullanabilirsiniz:

RedirectMatch permanent ^/$ http://misal.dom/ilksayfa.html

Bundan başka, bir sitedeki tüm sayfalara yapılan istekleri başka bir siteye geçici olarak yönlendirmek için şöyle bir şey yapabilirsiniz:

RedirectMatch temp .* http://mesela.misal.dom/ilksayfa.html

Karşı Vekil

Apache ayrıca, uzak sunuculardaki belgelerin yerel sunucunun URL alanına getirilmesini de mümkün kılar. Bu tekniğe HTTP sunucunun belgeleri uzak bir sunucudan alıp istemciye sunmasını sağlayarak bir vekil sunucu gibi davranması nedeniyle ters vekalet adı verilir. Belgelerin istemciye özkaynağın bulunduğu sunucudan geliyormuş gibi değilde doğrudan isteği yaptığı sunucudan geliyormuş gibi sunulması nedeniyle bu işlem normal vekaletten farklıdır.

Aşağıdaki örnekte, istemci /foo/ dizini altından bir belge istemekte, sunucu ise bu belgeyi dahili.mesela.dom üzerindeki /bar/ dizininden alıp istemciye yerel sunucudan geliyormuş gibi sunmaktadır:

ProxyPass /foo/ http://dahili.mesela.dom/bar/
ProxyPassReverse /foo/ http://dahili.mesela.dom/bar/
ProxyPassReverseCookieDomain dahili.mesela.dom harici.mesela.dom
ProxyPassReverseCookiePath /foo/ /bar/

ProxyPass sunucuyu uygun belgeleri alması için yapılandırırken ProxyPassReverse yönergesi dahili.mesela.dom sunucusundan kaynaklanan yönlendirmeleri yeniden yazar, böylece bunların yerel sunucudaki yerleri belirlenmiş olur. Benzer şekilde, ProxyPassReverseCookieDomain ve ProxyPassReverseCookiePath yönergeleri de arka sunucu tarafından atanan çerezleri yeniden yazar.

Yalnız, belgelerin içindeki hiperbağların yeniden yazılmayacağına dikkat ediniz. Dolayısıyla, belge içinde dahili.mesela.dom’u ismiyle hedef alan mutlak hiperbağlar varsa bunlar istemci tarafından vekil sunucudan değil doğrudan dahili.mesela.dom’dan istenecektir. Üçüncü parti modüller arasında HTML ve XHTML’de hiperbağları yeniden yazabilen mod_proxy_html adında bir modül vardır.

Yeniden Yazma Motoru

Daha güçlü ikameler gerektiğinde mod_rewrite modülü tarafından sağlanan yeniden yazma motoru işe yarayabilir. Bu modüldeki yönergeler sunulacak içeriğin yerine karar vermek için kaynak IP adresi, tarayıcı türü gibi isteğe özgü özellikleri kullanırlar. mod_rewrite modülü buna ek olarak isteğin nasıl ele alınacağına karar vermek için harici yazılımları ve veritabanlarını kullanabilir. Yeniden yazma motoru yukarıda değinilen üç eşleşme türünü de uygulayabilecek yetenektedir: Dahili yönlendirmeler (rumuzlar), harici yönlendirmeler ve vekalet. mod_rewrite modülü tarafından sağlanan yeteneklerin ayrıntılı açıklamaları ve bunların kullanım örnekleri ayrıntılı olarak mod_rewrite belgelerinde bulunmaktadır.

Dosya orada yok

Kaçınılmaz olarak, dosya sisteminde mevcut olmayan dosyalar için de istek yapılacaktır. Bunun çeşitli sebepleri olabilir. Bazı durumlarda bu, belgelerin yerlerininin değiştirilmesinin bir sonucu olabilir. Bu durumda yapılacak en iyi şey, istemciyi belgeyi yeni yerinden istemesi için bilgilendirmek amacıyla URL yönlendirmesi kullanmaktır. Bu şekilde, içeriğin yeri değişse bile eski yer imlerinin ve hiperbağların çalışmaya devam edeceklerinden emin olabilirsiniz.

"Dosya orada yok" ("File Not Found") hatalarının diğer bir bildik sebebi de URL’lerin hiperbağlarda veya doğrudan tarayıcıda kasıtlı ya da kasıtsız, yanlış yazılmasıdır. Bu tür sorunlarda yardımcı olması için Apache mod_speling (sic) adında bir modülle gelir. Bu modül etkin kılındığında Apache, "Dosya orada yok" ("File Not Found") hatalarının önünü kesip başka bir yerde benzer isimde bir dosya var mı diye bakar. Böyle bir dosya varsa, mod_speling istemciye dosyanın doğru yerini bildiren bir HTTP yönlendirmesi yollar. Benzer çok sayıda dosya varsa bunlar istemciye bir liste halinde sunulur.

mod_speling modülünün en yararlı özelliklerinden biri de dosya isimlerini harf büyüklüğüne duyarsız olarak arayabilmesidir. Dosya isimlerinde harf büyüklüğünün önemli olduğu Unix benzeri sistemler hakkında bilgisi olmayan kullanıcılara sahip sistemlerin kullanıcılarına bu büyük yarar sağlar. Fakat modülün URL düzeltmekten başka şeyler için de kullanılması, istemcilerden gelen neredeyse her isteğin URL yönlendirmesine konu olmasına sebep olarak sunucunun yükünü arttırabilir.

Yerinde bulunmayan içeriğin bulunması çabalarının tümü Apache’nin 404 (Dosya orada yok) HTTP durum kodlu bir hata sayfası döndürmesine yol açar. Bu sayfanın içeriği ErrorDocument yönergesi ile denetlenebilir ve Hata Yanıtlarının Kişiselleştirilmesi bölümünde anlatıldığı gibi oldukça esnek bir şekilde kişiselleştirilebilir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Devingen Paylaşımlı Nesne Desteği - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Devingen Paylaşımlı Nesne Desteği

Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller sunucunun derlenmesi sırasında doğrudan httpd programının içinde derlenebileceği gibi Devingen Paylaşımlı Nesneler (DSO - Dynamic Shared Object) halinde httpd programından ayrı olarak da derlenebilir. DSO modülleri sunucunun derlenmesi sırasında derlenebileceği gibi ayrı olarak derlenip daha sonra Apache Eklenti Aracı (Apache Extension Tool) apxs programı kullanılarak sunucuya eklenebilir.

Bu belgede DSO modüllerinin kullanımının yanında teorisine de değinilecektir.

Gerçeklenim

İlgili Modüller İlgili Yönergeler
  • mod_so
  • LoadModule

Apache modüllerini yüklemek için DSO desteği, Apache çekirdeğine durağan olarak ilintilenerek derlenmiş olan mod_so adında bir modül tarafından sağlanır. core modülünden başka, bir DSO modülü olamayan tek modül mod_so modülüdür. Hemen hemen tüm diğer Apache modülleri kurulum belgesinde de açıklandığı gibi configure betiğinin --enable-modül=shared seçeneği her modül için ayrı ayrı belirtilerek birer DSO modülü olarak derlenebilir. Derlenmiş modüller mod_filanca.so biçeminde birer DSO ismi alırlar ve her biri istenirse httpd.conf dosyasında mod_so modülünün LoadModule yönergesiyle belirtilerek sunucu başlatılırken veya yeniden başlatılırken sunucuya yüklenebilir.

Apache modülleri için (özellikle üçüncü parti modüller için) DSO dosyası üretimini kolaylaştırmak amacıyla apxs (APache eXtenSion) adında yeni bir destek programı kullanılmaktadır. Bu program Apache modüllerini Apache kaynak ağacından ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache derlenirken DSO dosyalarını derlemek için platforma bağımlı derleyici ve ilintileyici seçenekleri apxs programının içine konur ve Apache’nin make install ile kurulumu sırasında Apache C başlık dosyaları da kurulur. Böylece kullanıcı Apache dağıtımının kaynak ağacına ihtiyaç duymadan ve platforma bağımlı derleyici ve ilintileyici seçeneklerini bilmek zorunda kalmadan istediği Apache modülünü apxs programını kullanarak derleyebilir.

Kullanıcı Özeti

Apache 2.x’in DSO özelliklerine bir giriş olarak burada kısaca bir bilgi vermekle yetinilecektir:

  1. Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir özgün Apache modülünü mod_filanca.so isminde bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:

    $ ./configure --prefix=/kurulum/yeri --enable-filanca=shared
    $ make install

  2. Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir üçüncü parti Apache modülünü mod_filanca.so isminde bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:

    $ ./configure --add-module=modül-türü:/bir/kurulum/yeri/mod_filanca.c \
    --enable-filanca=shared
     $ make install

  3. Paylaşımlı modülleri sonradan kurmak için Apache şöyle yapılandırılır:

    $ ./configure --enable-so
    $ make install

  4. Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir üçüncü parti Apache modülü mod_filanca.so isminde bir DSO modülü olarak Apache kaynak ağacının dışında apxs kullanarak derlemek ve kurmak için şöyle yapılır:

    $ cd /bir/kurulum/yeri
    $ apxs -c mod_filanca.c
    $ apxs -i -a -n filanca mod_filanca.la

Tüm durumlarda derlenen paylaşımlı modülü Apache’nin etkin kılabilmesi için httpd.conf dosyasında o modül için bir LoadModule yönergesi bulunmalıdır.

Artalan Bilgisi

Günümüzün Unix türevlerinde var olan şık bir mekanizma sayesinde çalıştırılabilir bir programın adres uzayına çalışma anında yüklenmek veya ilintilenmek üzere Devingen Paylaşımlı Nesneler (DSO - Dynamic Shared Object) adı verilen, özel bir biçem kullanarak kodlanmış program parçaları oluşturulabilir.

Bu yükleme normalde iki yolla yapılabilir: Ya çalıştırılabilir programın başlatılması sırasında yüklenen ld.so adlı bir sistem programınının devingen olarak yüklenmesi ile ya da çalıştırılabilir programın içinden Unix yükleyicisine programsal sistem arayüzü sağlayan dlopen()/dlsym() sistem çağrılarının elle yapılması suretiyle.

İlk yöntemde kullanılan DSO’lara genelde paylaşımlı kütüphaneler veya DSO kütüphaneleri adı verilir ve bunların dosyaları libfilanca.so veya libfilanca.so.1.2 biçiminde isimlendirilir. Belli bir sistem dizininde (normalde /usr/lib) bulunurlar ve derleme sırasında ilintileyici komutuna -lfilanca şeklinde belirtilerek çalıştırılabilir programla ilintilenirler. Doğrudan çalıştırılabilir koda eklenen bu kodlar Unix yükleyicisinin programın başlatılması sırasında kütüphaneyi /usr/lib altında libfilanca.so adıyla bulabilmesini sağlar. Kütüphanelerin aranacağı yerler ya -R gibi bir ilintileyici seçeneği ile koda eklenir ya da arama yolları LD_LIBRARY_PATH ortam değişkeni aracılığıyla yapılandırılır. Böylece çalıştırılabilir programda henüz çözümlenmemiş simgeler DSO içinde bulunarak çözümlenebilir.

Çalıştırılabilir program içindeki simgelere normalde DSO içinden atıfta bulunulmaz (genel kod kütüphanesinin başka programlarca da kullanılması nedeniyle). Bu bakımdan DSO tarafında böyle bir çözümleme yapılmaz. Çalıştırılabilir program da DSO’daki simgeleri kendisi çözümlemeye uğraşmaz, bu işlemlerden tamamen Unix yükleyicisi (ld.so) sorumludur. (Aslında, ld.so’yu çağıracak kod, her çalıştırılabilir programın içine ilintilenmiş (durağan değil) başlatma kodunun bir parçasıdır.) Programlar tarafından ortaklaşa kullanılan kütüphanelerin devingen olarak yüklenmesinin sebebi basittir: Kütüphane kodu libc.so gibi bir sistem kütüphanesine bir kere kaydedilip disk alanından yer kazanılmış olur.

İkinci yöntemde kullanılan DSO’lara yine paylaşımlı kütüphaneler veya DSO kütüphaneleri adı verilir fakat bunların dosyaları geçerli kabule göre filanca.so gibi isimlendirilse de genelde keyfi olarak seçilen bir dosya uzantısı kullanılarak isimlendirilirler. Bu dosyalar genellikle programa özel bir dizinde dururlar ve bu dosyaları kullanacak olan çalıştırılabilir programla aralarında özdevimli olarak bağ kurulmamıştır. Bunun yerine, çalıştırılabilir program DSO’yu çalışma anında dlopen() sayesinde kendi adres uzayına ekler. Çalıştırılabilir program için DSO’daki simgeler bu sırada çözümlenmez. Özdevimli olarak devreye giren Unix yükleyicisi, (varsa) artakalan simgeleri, çalıştırılabilir ihraç edilen simge kümelerini (ve özellikle her yerde hazır ve nazır libc.so içindeki tüm simgeleri) kullanarak çözümler. Bu yolla DSO, çalıştırılabilir programın simge kümesi bilgilerini sanki kendisine baştan durağan olarak ilintilenmiş gibi ulaşabilir.

Son olarak, DSO’nun programlama arayüzünün getirilerinden yararlanmak amacıyla çalıştırılabilir program, daha sonra dağıtım tabloları vb. yerlerde kullanmak üzere dlsym() üzerinden DSO’daki belli simgeleri çözümlemek zorundadır. Başka bir deyişle: Çalıştırılabilir program ihtiyaç duyduğu her simgeyi kullanmak için kendisi çözümleme yapmak zorundadır. Böyle bir mekanizmanın getirisi, programın isteğe bağlı parçalarının gerekli olana kadar yüklenmemesidir (böylece daha az bellek alanı kullanılır). Gerektiği zaman programın işlevselliğini arttırmak amacıyla bu parçalar devingen olarak programa yüklenebilir.

DSO mekanizmasının bu basit gibi görünen işleyişinde zorluk içeren bir adım şudur (başkaları da olabilir): Bir programın işlevselliğini genişletmek için DSO kullanılırken (ikinci yöntem) çalıştırılabilir programdan DSO için simgelerin çözümlenmesi. Zorluğun sebebi, "tersine çözümleme" yapılmasıdır; çalıştırılabilir programın simge kümesindeki DSO simgeleri kütüphane tasarımına aykırı bir şekilde çözümlenir ve bu uygulama tüm platformlarda hazır olarak desteklenmediği gibi standartlaşmış da değildir. Geçer uygulamada çalıştırılabilir programın evrensel simgeleri çoğunlukla yeniden dışa verilmez ve bu bakımdan bir DSO içinde kullanılmaları uygun değildir. Esas sorun, çalıştırılabilir bir programın işlevselliğini çalışma anında genişletmek için DSO kullanımı sırasında ilintileyicinin tüm evrensel simgeleri dışa vermesini zorlamanın bir yolunu bulmaktır.

Paylaşımlı kütüphane yaklaşımı bu bakımdan türünün tek örneğidir, çünkü DSO mekanizması özellikle bunun için tasarlanmıştır, dolayısıyla işletim sisteminin sağladığı hemen hemen tüm kütüphaneler için kullanılabilir. Diğer taraftan, bir programın işlevselliğini genişletmek için paylaşımlı nesne kullanımı çoğu program tarafından kullanılan bir şey değildir.

1998 itibariyle, DSO nesneleriyle çalışma anında çalıştırılabilir program işlevselliğini genişleten başlıca birkaç yazılım paketi vardır: Perl 5 (XS mekanizması ve DynaLoader modülü üzerinden), Netscape Sunucusu, vd. 1.3 sürümünden itibaren Apache de bu gruba katıldı. Çünkü Apache, modül kavramını zaten program işlevselliğini genişletmek için kullanıyordu ve temel işlevselliğine dış modülleri ilintilemek için dahili olarak dağıtım listesine dayalı bir yaklaşım kullanmaktaydı. Dolayısıyla Apache, modüllerini çalışma anında yüklemek için DSO kullanmaya baştan yazgılıydı.

Getiriler ve Götürüler

Yukarıda bahsedilen DSO’ya dayalı özelliklerin getirileri şunlardır:

  • Sunucu paketi çalışma anında daha esnektir çünkü, asıl sunucuyu oluşturan parçalar derleme sırasında configure seçenekleriyle birleştirilmek yerine httpd.conf içinde LoadModule yönergeleri sayesinde çalışma anında birleştirilebilmektedir. Bu yolla, örneğin tek bir Apache kurulumuyla birbirinden farklı yapılandırmalara sahip çok sayıda sunucu çalıştırmak mümkündür. (standart veya SSL sürümü; basitleştirilmiş veya güçlendirilmiş sürümü [mod_perl, PHP3], vs.)
  • Sunucu paketi kurulumdan sonra bile üçüncü parti modüllerle kolayca genişletilebilir. Bu özellikle, bir Apache temel paketinin yanında PHP3, mod_perl, mod_fastcgi gibi ek paketler oluşturan paket dağıtıcılarına büyük yarar sağlar.
  • Yeni Apache modülleri için daha kolay prototip geliştirilebilir: Modül kaynak kodunu DSO/apxs çifti sayesinde Apache kaynak ağacının dışında derleyip modülün yeni bir sürümünü bir apxs -i komutunun ardından apachectl restart yaparak çalışan bir Apache sunucusunda denemek daha kolay hale getirilmiştir.

DSO kullanımının götürüleri ise şunlardır:

  • Her platformda hazır olarak desteklenmeme: Tüm işletim sistemleri bir programa devingen olarak kod yükleme becerisine sahip olmadığından DSO mekanizması her platformda kullanılamaz.
  • İlk yüklemede %20 yavaşlama: Unix yükleyicisi simgeleri çözümlemek zorunda olduğundan sunucu ilk başlatılırken yaklaşık %20 daha yavaş faaliyete geçer.
  • Çalışma sırasında % 5 yavaşlama: Konumdan bağımsız kodun (PIC - Position Independent Code) göreli adresleme için karmaşık oyunlara girmesi ve bunun mutlak adresleme kadar hızlı olmaması nedeniyle sunucu bazı platformlarda çalışma anında yaklaşık %5 daha yavaş çalışabilir.
  • DSO'nun tüm modüller için uygun olmaması: DSO modülleri bazı platformlarda diğer DSO temelli kütüphanelerle ilintilenemediğinden (ld -lfilanca) DSO mekanizmasını tüm modül türleri için kullanamazsınız (örneğin a.out temelli platformlar bu işlevselliği ELF temelli platformlar kadar iyi sağlamaz). Başka bir deyişle, DSO dosyaları olarak derlenmiş modüllerin kullanabileceği simgeler ya Apache temel kodunda vardır ya Apache temel kodunun kullandığı C kütüphanesinde (libc) ve diğer durağan ve devingen kütüphanelerde vardır ya da konumdan bağımsız kodu içeren durağan kütüphane arşivlerinde (libfilanca.a) vardır. Diğer modülleri kullanmak için tek şansınız ya Apache çekirdeğinin modüle bir atıf içermesini sağlamak ya da modül kodunu dlopen() vasıtasıyla yüklemektir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


İçerik Uzlaşımı - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

İçerik Uzlaşımı

Apache, içerik uzlaşımını HTTP/1.1 belirtiminde bahsedildiği şekliyle destekler. Bir özkaynağın en iyi gösterimini, tarayıcının sağladığı karakter kodlaması, karakter kümesi, dil, ortam türü gibi kullanıcı tercihlerine bağlı olarak seçebilir. Ayrıca, tarayıcının kullanıcı tercihlerini tam yansıtamadığı durumlarda istekleri daha akıllıca ele alabilmeyi sağlayacak bir takım özelliklere de sahiptir.

İçerik uzlaşımı öntanımlı olarak derlenen mod_negotiation modülü tarafından sağlanır.

İçerik Uzlaşımı Hakkında

Bir özkaynağın bir çok farklı gösterimi olabilir. Örneğin, bir belgenin farklı ortam türleri ve/veya farklı diller için gösterimleri olabilir. En uygun seçimi yapmanın tek yolu kullanıcıya bir liste verip seçmesini istemektir. Bununla birlikte sunucunun bu seçimi kendiliğinden yapması da mümkündür. Tarayıcılar isteğin bir parçası olarak kullanıcı tercihlerini de gönderdiğinden bu istendiği gibi çalışır. Örneğin bir tarayıcı, kullanıcısınının mümkünse Fransızca içerik tercih ettiğini yoksa İngilizce içeriğe de razı olabileceğini belirtebilirdi. Tarayıcılar bu tercihleri başlıkta belirtirler. Tarayıcı sadece Türkçe içerik istendiğini şöyle belirtebilirdi:

Accept-Language: tr

Bu tercihin yerine getirilebilmesininin sadece, desteklenen diller arasında bu dilin varlığına ve istenen belgenin bu dilde bir gösteriminin bulunmasına bağlı oluşuna dikkat ediniz.

Daha karmaşık bir istek örneği olarak, tarayıcının Fransızca ve İngilizce içerik kabul etmeye ayarlandığını fakat Fransızcayı tercih ettiğini ve çeşitli ortam türlerini kabul etmekle birlikte salt metin ve diğer metin türlerinden ziyade HTML tercih ettiğini, ayrıca, diğer ortam türleri üzerinde GIF veya JPEG tercih ettiğini fakat başka çare yoksa her ortam türüne de izin verdiğini belirtiyor olsun:

Accept-Language: fr; q=1.0, en; q=0.5
Accept: text/html; q=1.0, text/*; q=0.8, image/gif; q=0.6, image/jpeg; q=0.6, image/*; q=0.5, */*; q=0.1

Apache, HTTP/1.1 belirtiminde tanımlanan şekliyle ‘sunucu yönetiminde’ içerik uzlaşımını destekler. Accept, Accept-Language, Accept-Charset ve Accept-Encoding istek başlıklarını tamamen destekler. Apache ayrıca, RFC 2295 ve RFC 2296’da tanımlanan bir deneysel uzlaşım olarak ‘şeffaf’ içerik uzlaşımını da destekler. Fakat ‘özellik uzlaşımını’ bu RFC’lerde tanımlandığı gibi desteklemez.

Bir özkaynak bir URI (RFC 2396) tarafından betimlenen kavramsal bir öğedir. Apache gibi bir HTTP sunucusu, ortam türü, karakter kümesi, kodlama ve saire ile tanımlanmış bir bayt dizisi şeklindeki her gösterimiyle, özkaynaklara kendi isim alanları dahilinde erişim sağlar. Her özkaynağın aynı anda bir veya daha fazla gösterimi mevcut olabileceği gibi hiç mevcut olmayabilir de. Eğer çok sayıda gösterim mevcutsa, bu özkaynağın uzlaşılabilir olduğundan ve her gösteriminin bir çeşitlilik oluşturduğundan bunun da uzlaşımın boyutlarından kaynaklandığından bahsedilebilir.

Apache’de İçerik Uzlaşımı

Bir özkaynak üzerinde uzlaşılırken gösterim çeşitlerinin her biri hakkında sunucuya bilgi verilmesi gerekir. Bu iki yolla yapılabilir:

  • Ya gösterim çeşitlerini içeren dosyaların isimleriyle eşleşmeyi sağlayan bir tür eşlemi kullanılır (bir *.var dosyası gibi).
  • Ya da sunucu örtük bir dosya ismi kalıbı eşleşmesinin ardından sonuçlar arasından seçim yapar; buna ‘Çoklu Görünüm’ araması adı verilir.

Bir türeşlem dosyası kullanmak

Bir türeşlem dosyası, type-map eylemcisi ile ilişkili bir belgedir (ya da eski Apache yapılandırmaları ile geriye uyumluluk için, application/x-type-map MIME türünde bir belgedir). Bu özelliği kullanmak için, yapılandırmada bir tür eşleyici olarak her dosya ismi uzantısı için bir type-map eylemcisi tanımlamalısınız. Bu, sunucu yapılandırma dosyasında en iyi şöyle yapılabilir:

AddHandler type-map .var

Türeşlem dosyaları kendilerini tanımlayan özkaynak ile aynı isimde olmalı ve her gösterim çeşidi için bir girdi içermelidir; bu girdiler ardarda belirtilen HTTP biçem başlık satırlarından oluşur. Farklı gösterimlerin girdileri bir boş satırla diğerlerinden ayrılır. Aynı girdi içinde boş satır kullanılamaz. Bir eşlem dosyasını bir birleşik öğenin tamamı için bir girdi ile başlatmak adet olmuştur (ise de, bu gerekli değildir, hele yoksayılacaksa hiç gerekli değildir). Eşlem dosyası için aşağıda bir örnek verilmiştir. Dosya misal isimli bir özkaynak hakkında olduğundan dosyaya misal.var ismi verilebilir.

URI: misal

URI: misal.en.html
Content-type: text/html
Content-language: en

URI: misal.fr.de.html
Content-type: text/html;charset=iso-8859-2
Content-language: fr, de

Ayrıca, MultiViews etkin olsa bile bir türeşlem dosyasının dosya ismi uzantılarının taranmasına göre öncelik alacağına dikkat ediniz. Eğer gösterimler bu örnekteki resim dosyasında olduğu gibi farklı kaynak üstünlüklerine sahipseler, ortam türünün qs parametresi kullanılarak kaynak üstünlükleri belirtilebilir:

URI: misal

URI: misal.jpeg
Content-type: image/jpeg; qs=0.8

URI: misal.gif
Content-type: image/gif; qs=0.5

URI: misal.txt
Content-type: text/plain; qs=0.01

qs değerleri 0.000-1.000 değer aralığı içinde belirtilebilir. 0.000 qs değerine sahip gösterimin asla seçilmeyeceğine dikkat ediniz. Bir qs değeri belirtilmeyen gösterimlerin kaynak üstünlüğü 1.000 kabul edilir. qs parametresinin belirttiği değer istemcinin yeteneklerinden bağımsız olarak olası gösterimler arasında göreli bir üstünlük ifade eder. Örneğin bir fotoğraf sözkonusu olduğunda bir JPEG dosyasının kaynak üstünlüğü bir ASCII çiziminkinden yüksek olacaktır. Diğer taraftan özgün resim bir ASCII çizim olduğu takdirde, ASCII çizim, bir JPEG gösterimine göre öncelikli olacaktır. Bu nedenle qs değeri özkaynağın doğasına bakarak belirlenir.

Tanınan başlıkların tam listesini mod_negotiation modülünün belgesinde bulabilirsiniz.

Çoklu Görünümler

MultiViews, httpd.conf dosyasındaki veya (AllowOverride yönergesinin değerine bağlı olarak) .htaccess dosyalarındaki <Directory>, <Location> veya <Files> bölümleri içinde Options yönergeleri ile belirtilebilen, dizine özgü bir seçenektir. Yalnız, dikkatli olun, Options All yaparak MultiViews seçeneğini etkin kılamazsınız; seçeneği ismiyle açıkça belirtmelisiniz.

MultiViews şöyle etki eder: Sunucudan, MultiViews seçeneğinin etkin olduğu /bir/dizin dizininden filanca dosyası için bir istekte bulunulmuşsa fakat dizinde bu dosya yoksa, sunucu dizin içeriğini filanca.* dosyaları için tarar ve bu dosyalar için istemcinin ismiyle talep ettiği ortam türlerini ve kodlamaları kullanarak bir türeşlem dosyası uydurup bu gösterimler arasından istemcinin gereksinimlerine en uygun gösterimi seçer.

MultiViews ayrıca, sunucunun bir dizin içeriğini listelemeye çalıştığı durumda DirectoryIndex yönergesi ile belirtilen dosya için de bir arama tertipleyebilir. Eğer yapılandırma dosyalarında

DirectoryIndex index

şeklinde bir atama varsa ve dizinde index.html ve index.html3 dosyaları varsa sunucu bunlar arasından hakem sıfatıyla bir seçim yapacaktır; ama bu ikisi yerine dizinde sadece index.cgi mevcutsa sunucu sadece bu dosyayı çalıştıracaktır.

Okunan dizinde bulunan dosyalar arasında mod_mime tarafından tanınan karakter kümesi, içerik türü, dil ve kodlama başlıklarına uygun gösterim uzantılarından birine sahip bir dosya yoksa sonuç MultiViewsMatch yönergesiyle yapılan tanıma bağlı olur. Bu yönerge hangi diğer dosya uzantılarının, eylemcilerin veya süzgeçlerin çok gösterimli uzlaşımla ilintileneceğini belirler.

Uzlaşım Yöntemleri

Apache’nin, bir türeşlem dosyası veya dizin içindeki bir dosya sayesinde belli bir özkaynağın gösterim çeşitlerinin bir listesini elde ettikten sonra ‘en uygun’ gösterime karar vermek için kullanabileceği iki yöntem vardır. Apache’nin içerik uzlaşım özelliklerinin kullanımı sırasında uzlaşımın nasıl yerine getirileceği ile ilgili ayrıntıları bilmek aslında gerekli değildir. Bununla birlikte belgenin kalanında bu konu açıklanmaya çalışılmıştır.

İki uzlaşım yöntemi vardır:

  1. Normal durumda sunucu yönetiminde Apache uzlaşım algoritması kullanılır. Bu algoritma aşağıda ayrıntılı olarak açıklanmıştır. Bu algoritma kullanıldığı zaman, Apache, en iyi sonuca ulaşmak için bazen belli boyutların üstünlük katsayılarıyla ‘oynar’. Apache’nin bu katsayılarla oynama işini nasıl yaptığı aşağıda daha ayrıntılı açıklanmıştır.
  2. İstemci bu işlem için özellikle RFC 2295’te tanımlanan mekanizmanın kullanılmasını isterse şeffaf içerik uzlaşımı kullanılır. Bu uzlaşım yöntemi, en uygun gösterimin seçilmesi konusunda tarayıcıya tam denetim imkanı verir; dolayısıyla sonuç tarayıcının bu işlem için kullandığı algoritmanın başarısına bağlıdır. Şeffaf uzlaşım sürecinin bir parçası olarak, tarayıcı, RFC 2296’da tanımlanan ‘gösterim çeşidini uzaktan seçme algoritması’nın çalıştırılmasını Apache’den isteyebilir.

Uzlaşımın Boyutları

Boyut | Açıklama
Ortam Türü | Tarayıcı ortam türü tercihlerini Accept başlık alanı ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı olabilir. Gösterimin açıklaması da ayrıca bir kaynak üstünlüğüne (qs parametresi) sahip olabilir.
Dil | Tarayıcı dil tercihlerini Accept-Language başlık alanı ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı olabilir. Gösterimler bir kaç dilde olabileceği gibi hiç bir dille ilişkilendirimemiş de olabilir.
Kodlama | Tarayıcı kodlama tercihlerini Accept-Encoding başlık alanı ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı olabilir.
Karakter Kümesi | Tarayıcı karakter kümesi tercihlerini Accept-Charset başlık alanı ile belirtir. Her öğenin kendine özgü bir üstünlük katsayısı olabilir. Gösterim çeşitleri karakter kümesini ortam türünün bir parametresi olarak belirtebilirler.

Apache Uzlaşım Algoritması

Apache, tarayıcıya döndürülecek en uygun gösterim çeşidini (varsa) seçmek için aşağıdaki algoritmayı kullanabilir. Bu algoritma pek de yapılandırılabilir değildir. Şöyle çalışır:

  1. Önce her uzlaşım boyutu için ilgili Accept* başlık alanına bakılıp her gösterim çeşidine bir üstünlük katsayısı atanır. Eğer boyutlardan bazıları için ilgili Accept* başlığı uygulanabilir değilse bu boyut elenir ve sonuçta hiçbir gösterim çeşidi kalmasza 4. adıma atlanır.
  2. ‘En uygun’ gösterim çeşidi bir eleme süreciyle seçilir. Bu süreç sırasında aşağıdaki sınamalar sırayla uygulanır. Sınamalardan geçemeyen bir gösterim çeşidi elenir. Sınamaların bir aşamasında tek bir gösterim çeşidi kalırsa bu en uygun eşleşme olarak seçilmiş olur ve 3. adıma atlanır. Eğer birden fazla gösterim çeşidi kalırsa sonraki sınamaya geçilir.
    1. Accept başlığındaki üstünlük katsayısı ile gösterimin ortam türünde belirtilen kaynak üstünlüğünün çarpımı en büyük olan gösterim çeşidi seçilir.
    2. En yüksek dil üstünlük katsayısına sahip gösterim çeşidi seçilir.
    3. En uygun dil eşleşmesine sahip gösterim çeşidini seçmek için önce varsa Accept-Language başlığındaki dil sıralamasına bakılır, aksi takdirde LanguagePriority yönergesi ile atanmışsa oradaki dil sıralamasına bakılır.
    4. En yüksek ‘seviyeden’ ortam parametresine (text/html ortam türü sürümünü belirtmekte kullanılır) sahip gösterim çeşitleri seçilir.
    5. Accept-Charset başlık satırında belirtilene bakarak en uygun karakter kümesine sahip gösterim çeşitleri seçilir. Alenen dışlanmadıkça ISO-8859-1 kabul edilebilir karakter kümesidir. text/* ortam türüne sahip gösterim çeşitlerinden belli bir karakter kümesi ile ilişkilendirilmemiş olanların karakter kümesinin ISO-8859-1 olduğu varsayılır.
    6. ISO-8859-1 karakter kümesi ile ilişkilendirilmemiş gösterim çeşitleri seçilir. Böyle hiçbir gösterim yoksa bütün gösterimler seçilir.
    7. En uygun kodlamaya sahip gösterim çeşitleri seçilir. Tarayıcı tarafından kabul edilebilir kodlamaya sahip gösterim çeşitleri varsa bunlar seçilir. Yoksa kodlanmış ve kodlanmamış gösterim çeşitleri karışık olarak mevcutsa sadece kodlanmamış olanlar seçilir. Eğer bütün gösterim çeşitlerinin sadece kodlanmış ya da sadece kodlanmamış gösterimleri mevcutsa hepsi seçilir.
    8. En küçük içerik uzunluğuna sahip gösterim çeşitleri seçilir.
    9. Kalan gösterim çeşitlerinin ilki seçilir. Bu ilk, ya türeşlem dosyasında listelenen ilk çeşittir ya da gösterimler bir dizinden okunuyorsa ASCII kod sıralamasına göre ilk sıradaki dosya ismine sahip gösterimdir.
  3. Algoritma, artık seçilmiş en uygun gösterim çeşidine sahipse bu artık yanıt olarak döndürülebilir. HTTP yanıt başlığı Vary’ye uzlaşım boyutları atanır (tarayıcı ve arabellekler özkaynağı kaydederken bu bilgiyi kullanırlar) ve algoritma sonlandırılır.
  4. Buraya gelinmişse hiçbir gösterim seçilmemiş demektir (hiçbiri tarayıcı tarafından kabul edilebilir bulunmadığından dolayı). Gövdesinde mevcut gösterim çeşitlerini listeleyen bir HTML belgesi 406 durum koduyla döndürülür (406: ‘kabul edilebilir bir gösterim yok’). Ayrıca HTTP Vary başlığında gösterim çeşitliliğinin boyutları belirtilir.

Üstünlük Değerleriyle Oynamak

Apache bazen yukarıdaki Apache uzlaşım algoritmasının kesin sonucunun beklenenden farklı olması için üstünlük değerleriyle oynar. Bunu tam ve doğru bilgi göndermeyen tarayıcılar için algoritmadan en iyi sonucu elde etmek amacıyla yapar. Bazen günümüzün en tanınmış tarayıcıları bile çoğu durumda yanlış bir seçimle sonuçlanmayacaksa Accept başlık bilgilerini göndermemektedir. Eğer tarayıcı eksiksiz ve doğru bilgi gönderirse Apache bu değerlerle oynamayacaktır.

Ortam Türleri ve Dosyaismi Kalıpları

Accept: istek başlığı ortam türü tercihlerini yansıtır. Ayrıca, * bir dizge ile eşleşmek üzere "image/*" veya "*/*" gibi ortam türü kalıpları da içerebilir. Dolayısıyla şöyle bir istek,

Accept: image/*, */*

diğer türler gibi "image/" ile başlayan ortam türlerini kabul edilebilir kılacaktır. Bazı tarayıcılar ortam türlerini örtük olarak elde etmek amacıyla hep bu tür kalıplar gönderirler. Örnek:

Accept: text/html, text/plain, image/gif, image/jpeg, */*

Bunun amacı, açıkça listelenmiş türlerin tercih edildiğini, fakat farklı gösterimler varsa onların da kabul edilebileceğini belirtmektir. Üstünlük değerlerini doğrudan kullanarak tarayıcılar gerçekte ne istediklerini şuna benzer şekilde belirtebilirler:

Accept: text/html, text/plain, image/gif, image/jpeg, */*; q=0.01

Açıkça belirtilen türler için üstünlük katsayısı belirtilmemiştir, dolayısıyla üstünlük katsayılarının 1.0 (en yüksek) olduğu varsayılmaktadır. */* kalıbı 0.01 gibi çok daha düşük bir öncelik belirtmektedir. Bu bakımdan, ancak, açıkça belirtilen türlerden hiçbirinin bulunmaması halinde diğer türler eşleşecektir.

Eğer Accept: başlığı hiçbir q katsayısı içermiyorsa ve başlıkta "*/*" belirtilmişse, Apache istenen davranışı taklit etmek için bu kalıba 0.01 katsayısını atar. Keza "type/*" kalıbına da 0.02 katsayısını atar (yani, */* kalıbına göre tercihli olur). Eğer Accept: alanındaki her ortam türü bir q katsayısı içeriyorsa bu özel değerler uygulanmaz. Dolayısıyla gerekli bilgiyi açıkça bildiren tarayıcılardan gelen istekler umulduğu gibi işlem görecektir.

Dil Uzlaşımında İstisnalar

Apache 2.0’dan itibaren, uzlaşım algoritmasına, bir eşleşme bulmak konusunda algoritma başarılı olamadığı takdirde hoş bir son çareye izin vermek için bazı istisnalar eklenmiştir.

İstemci sunucudan bir sayfa istediğinde, sunucu, tarayıcı tarafından gönderilen Accept-language başlığıyla eşleşen tek bir sayfa bulamadığı takdirde istemciye ya “Kabul edilebilir bir gösterim çeşidi yok” ya da “Çok sayıda seçim belirtilmiş” yanıtını döndürür. Bu hata iletilerinden kaçınmak için bu gibi durumlarda Apache Accept-language başlığını yoksaymaya ayarlanabilir. Böylece istemcinin isteğine tam olarak uymasa da bir belge sağlanır. Bu hata iletilerinin birini veya her ikisini de geçersiz kılmak için ForceLanguagePriority yönergesi kullanılabilir ve sunucunun kararını LanguagePriority yönergesine dayanarak vermesi sağlanabilir.

Sunucu ayrıca, tam bir eşleşme bulunmadığı zaman lehçelerle de eşleşme arayabilir. Örneğin, bir istemci Britanya İngilizcesi (en-GB) ile yazılmış belgeler için istekte bulunursa, sunucu normalde HTTP/1.1 standardına göre bir belgenin basitçe en olarak imlenmesine izin vermez. (Bir okuyucu Britanya İngilizcesini anlıyor ama genel İngilizceyi anlamıyor diye Accept-Language başlığında en değil de en-GB’yi belirtmesinin hemen hemen daima bir yapılandırma hatasına yol açacağına dikkat ediniz. Maalesef, mevcut istemcilerin çoğu öntanımlı yapılandırmalarında buna benzer şeyler yapmaktadır.) Bununla birlikte, başka bir dille eşleşme mümkün değilse ve sunucu “Kabul edilebilir bir gösterim çeşidi yok” hatasını döndürmeye hazırsa veya LanguagePriority son çaresine ayarlanmışsa alt küme belirtimini yok sayacak ve en belge isteklerine en-GB belgelerle yanıt verecektir. Apache, lehçenin üyesi olduğu anadili, istemcinin kabul edilebilir diller listesine örtük olarak düşük bir üstünlük değeri ile ekler. Yalnız şuna dikkat edin, eğer istemci tercihini "en-GB; q=0.9, fr; q=0.8" olarak belirtirse ve sunucuda sadece "en" ve "fr" belgeleri varsa sunucu "fr" belge ile yanıt verecektir. HTTP/1.1 belirtimi ile uyumluluğu sağlamak ve düzgün yapılandırılmış istemcilerle gerektiği gibi çalışabilmek için bu gereklidir.

Gelişmiş tekniklerin (çerezler, özel URL yolları gibi) desteklenmesi sırasında, kullanıcının tercih ettiği dili saptamak için Apache 2.0.47 sürümünden beri mod_negotiation modülü prefer-language ortam değişkenini tanımaktadır. Değişken mevcutsa ve uygun bir dil yaftası içeriyorsa mod_negotiation uygun gösterimi seçmeyi deneyecektir. Böyle bir gösterim çeşidi mevcut değilse normal uzlaşım işlemi uygulanacaktır.

Örnek

SetEnvIf Cookie "language=(.+)" prefer-language=$1
Header append Vary cookie

Şeffaf İçerik Uzlaşımının Genişletilmesi

Apache, şeffaf içerik uzlaşımı protokolünü (RFC 2295) şöyle genişletir: Sadece içerik kodlamasına özgü olmak üzere gösterim çeşidi listelerinde gösterim çeşitlerini imlemek için yeni bir {encoding ..} elemanı kullanılır. RVSA/1.0 algoritmasının (RFC 2296) gerçeklenimi, listedeki kodlanmış gösterim çeşitlerini tanımak ve onları Accept-Encoding başlık alanıyla ilgili olarak kabul edilebilir kodlamalara aday gösterim çeşitleri olarak kullanmak üzere genişletilmiştir. RVSA/1.0 gerçeklenimi, en uygun gösterim çeşidi seçiminin öncesinde hesaplanmış üstünlük katsayısını virgülden sonra beş haneye yuvarlamaz.

Hiperbağlar ve İsimlendirme Uzlaşımları

Eğer dil uzlaşımı kullanıyorsanız ve birden fazla dosya ismi uzantısına sahip dosyalarınız varsa uzantıların sıralamasının normalde uygunsuz düştüğü farklı isimlendirme yaklaşımlarında bulunabilirsiniz (ayrıntılar için mod_mime belgesine bakınız).

Bir MIME türü uzantısına sahip bir dosyanın (html gibi), kodlanmış bir gösterimi (gz gibi) mevcut olabilir. Bu dosyanın ayrıca farklı dillerdeki gösterimleri için de bir uzantısı (en gibi) olabilir.

Örnekler:

  • misal.en.html
  • misal.html.en
  • misal.en.html.gz

Hiperbağ olarak geçerli ve geçersiz bazı dosya ismi örnekleri:

Dosya ismi | Geçerli Hiperbağ | Geçersiz Hiperbağ
misal.html.en | misal misal.html | -
misal.en.html | misal | misal.html
misal.html.en.gz | misal misal.html | misal.gz misal.html.gz
misal.en.html.gz | misal | misal.html misal.html.gz misal.gz
misal.gz.html.en | misal misal.gz misal.gz.html | misal.html
misal.html.gz.en | misal misal.html misal.html.gz | misal.gz

Yukarıdaki tabloya bakarak hiperbağlarda bir dosya ismini uzantısız olarak (misal gibi) kullanmanın daima mümkün olduğunu farkedeceksiniz. Böylece br belgenin asıl türünü gizleyebilir ve sonradan bir hiperbağ değişikliği yapmaksızın örneğin html’den shtml veya cgi’ye geçebilirsiniz.

Hiperbağlarda MIME türlerini (misal.html gibi) kullanmaya devam etmek istiyorsanız dil uzantısı MIME türü uzantısının sağında kalmalıdır (misal.html.en gibi).

Arabellekler Hakkında

Bir arabellek, bir gösterimi istek URL’si ile ilişkilendirerek saklar. Böylece, sonradan aynı URL için bir istek yapıldığında kaydettiği gösterimi kullanabilir. Fakat özkaynak sunucuyla uzlaşılan türdeyse arabelleğe ilk istenen çeşit saklanmış olacağından isteğe yanlış gösterimle yanıt verilmiş olacaktır. Bunun olmaması için Apache, normal olarak içerik uzlaşımının sonucu olarak döndürülen tüm yanıtları HTTP/1.0 istemciler tarafından arabelleklenemez olarak imler. Apache ayrıca, uzlaşımlı yanıtların arabelleklenmesini mümkün kılan HTTP/1.1 protokolünü de destekler.

HTTP/1.0 uyumlu istemcilerden (bir tarayıcı veya arabellek) gelen istekler için, uzlaşıma konu yanıtların arabelleklenmesini mümkün kılmak üzere CacheNegotiatedDocs yönergesi kullanılabilir. Bu yönerge argümansızdır ve sunucu genelinde veya sanal konakların yapılandırılmasında kullanılabilir. Bunun HTTP/1.1 istemcilerinden gelen isteklere bir etkisi yoktur.

HTTP/1.1 istemciler için, Apache, yanıtın uzlaşım boyutlarını göstermek üzere bir Vary HTTP yanıt başlığı gönderir. Arabellekler bu bilgiyi sonraki istekleri yerel kopyadan sunarken kullanabilirler. Bir arabelleğin uzlaşım boyutlarına bakmaksızın yerel kopyasını kullanmaya teşvik etmek için force-no-vary ortam değişkenini etkin kılabilirsiniz.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Hata Yanıtlarının Kişiselleştirilmesi - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

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.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Dinleme - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Dinleme

Apache’nin belli adresleri ve portları dinlemek üzere yapılandırılması.

Ayrıca bakınız:

  • Sanal Konaklar
  • DNS Konuları

Genel Bakış

İlgili Modüller İlgili Yönergeler
  • core
  • mpm_common
  • <VirtualHost>
  • Listen

Apache başlatıldığında yerel makinedeki bazı adres ve portları kendine bağlar ve gelecek istekleri bekler. Öntanımlı olarak makine üzerindeki tüm adresleri dinler. Bununla birlikte, belli portları veya sadece seçilmiş bazı adresleri ya da her ikisini de dinlemesi için bunun belirtilmesi gerekebilir. Bu çoğunlukla, Apache’nin farklı IP adreslerine, konak isimlerine ve portlarına nasıl yanıt vereceğinin belirlendiği sanal konak özelliği ile birlikte yürür.

Listen yönergesi sunucuya gelen istekleri sadece belli portlardan veya belli adres ve port birleşimlerinden kabul etmesini söyler. Listen yönergesinde sadece port numarası belirtilmişse sunucu tüm arabirimlerin belirtilen portunu dinleyecektir. Portla birlikte bir IP adresi de belirtilmişse sunucu belirtilen portu ve arabirimi dinleyecektir. Çok sayıda adres ve portu dinlemek için çok sayıda Listen yönergesi kullanılabilir. Sunucu böyle bir durumda belirtilen bütün adres ve portlardan gelen isteklere yanıt verecektir.

Örneğin, sunucunun tüm arabirimlerin hem 80 portundan hem de 8000 portundan gelen bağlantıları kabul etmesini sağlamak için,

Listen 80
Listen 8000

yapılandırmasını kullanabilirsiniz. Sunucunun 80 portuna gelen bağlantıları bir arabirimden 8000 portuna gelenleri ise başka bir arabirimden kabul etmesini sağlamak için ise,

Listen 192.0.2.1:80
Listen 192.0.2.5:8000

yapılandırmasını kullanabilirsiniz. IPv6 adresleri aşağıdaki örnekteki gibi köşeli ayraçlar içine alınarak belirtilmelidir:

Listen [2001:db8::a00:20ff:fea7:ccea]:80

IPv6 Adreslerin Durumu

IPv6’yı gerçekleyen platformların sayısı giderek artmaktadır. Bu platformların çoğunda APR, Apache’nin IPv6 soketleri ayırmasını mümkün kılarak IPv6’yı desteklemekte ve IPv6 üzerinden gönderilmiş istekleri elde etmektedir.

Apache yöneticilerinin kafasını karıştırıran tek şey IPv6 soketlerin hem IPv4 hem de IPv6 bağlantılarını kabul edip etmeyeceğidir. IPv4 bağlantılarını kabul eden IPv6 soketleri IPv4 eşlemli IPv6 adresleri kullanırlar. Bu çoğu sistemde öntanımlı olarak böyleyken, FreeBSD, NetBSD ve OpenBSD’de sistem geneline uygulanan kurallar gereğince öntanımlı olarak buna izin verilmez; bu sistemlerde özel bir configure parametresi ile Apache’nin davranışı değiştirilebilir.

Diğer taraftan, Linux ve Tru64 gibi bazı platformlarda hem IPv4 hem de IPv6 adresleri kabul etmenin tek yolu eşlemli adresler kullanmaktır. Apache’nin IPv4 ve IPv6 adresleri, IPv4 eşlemli IPv6 adreslerin kullanımını gerektiren en az sayıda soketle kabul etmesini istiyorsanız, configure betiğine --enable-v4-mapped seçeneğini belirtiniz.

--enable-v4-mapped seçeneği, FreeBSD, NetBSD ve OpenBSD hariç tüm platformlarda öntanımlıdır. Muhtemelen siz de Apache’nin böyle derlenmesini isterdiniz.

Platformunuzun ve APR’nin neyi desteklediğine bakmaksızın Apache’nin sadece IPv4 adresleri kabul etmesini istiyorsanız, tüm Listen yönergelerinde örnekteki gibi IPv4 adresleri belirtiniz:

Listen 0.0.0.0:80
Listen 192.0.2.1:80

Platformunuz IPv4 ve IPv6 adresleri ayrı soketlerden kabul ediyorsa ve Apache’nin de buna uygun davranmasını (yani IPv4 eşlemli IPv6 adreslerin iptalini) istiyorsanız configure betiğine --disable-v4-mapped seçeneğini belirtiniz. Bu seçenek FreeBSD, NetBSD ve OpenBSD’de öntanımlıdır.

Sanal Konaklarla Nasıl Çalışır?

Listen yönergesi sanal konaklar için gerçeklenmemiştir; sadece ana sunucuya hangi adresleri ve portları dinleyeceğini söyler. Hiç <VirtualHost> yönergesi kullanılmamışsa sunucu kabul edilen tüm isteklere aynı şekilde davranacaktır. Eğer bir veya daha fazla adres veya port için farklı bir davranış belirtmek istiyorsanız <VirtualHost> kullanabilirsiniz. Bir sanal konağı gerçeklemek için önce sunucunun sanal konak için kullanacağı adres ve portu dinleyeceğini belirtmek gerekir. Bundan sonra bu sanal konağın davranışını ayarlamak üzere belirtilen adres ve port için bir <VirtualHost> bölümü oluşturulmalıdır. Yalnız dikkat edin, eğer <VirtualHost> için belirtilen adres ve port sunucu tarafından dinlenmiyorsa ona erişemezsiniz.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Çok Süreçlilik Modülleri (MPM’ler) - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Çok Süreçlilik Modülleri (MPM’ler)

Bu belgede Çok Süreçlilik Modülü denince ne anlaşıldığı ve bunların Apache HTTP Sunucusu tarafından nasıl kullanıldıkları açıklanmıştır.

Giriş

Apache HTTP Sunucusu çok çeşitli platformlar üstünde farklı ortamlarda çalışabilen güçlü ve esnek bir HTTP sunucusu olarak tasarlanmıştır. Farklı platformlar ve farklı ortamlar çoğunlukla farklı özellikler veya aynı özelliğin en yüksek verimlilikle gerçeklenmesi için farklı yöntemler gerektirir. Apache, geniş ortam çeşitliliğini daima modüler tasarımı sayesinde uzlaştırmıştır. Bu tasarım, site yöneticilerine, sunucularında bulunmasını istedikleri özellikleri derleme sırasında veya çalışma anında gerekli modülleri yüklemek suretiyle seçebilme imkanı verir.

Apache 2.0, bu modüler tasarımı sunucunun en temel işlevlerine kadar indirmiştir. Sunucu, Çok Süreçlilik Modülleri adı verilen ve makine üzerindeki ağ portlarının bağlanmasından, isteklerin kabul edilmesinden ve bu istekleri yanıtlayacak çocuklara dağıtmaktan sorumlu olan modüllerin seçimine imkan verecek bir yapılanma ile gelir.

Sunucunun modüler tasarımının bu seviyede genişletilmesi iki önemli yarar sağlar:

  • Apache geniş çeşitlilikteki işletim sistemlerini daha temiz ve daha verimli bir şekilde destekleyebilmektedir. Özellikle, mpm_winnt modülü, Apache 1.3’te kullanılan POSIX katmanının yerine işletim sistemine özgü özellikleri kullanabildiğinden, Apache HTTP Sunucusunun Windows sürümü artık çok daha verimli bir duruma gelmiştir. Aynı fayda özelleştirilmiş MPM’lerle diğer işletim sistemlerine de sağlanmıştır.
  • Sunucu, belli bir sitenin ihtiyaçlarına uygun olarak daha iyi kişiselleştirilebilmektedir. Örneğin, eski yazılım ile uyumluluk ve kararlılığa önem veren siteler prefork modülünü kullanabilirken, daha geniş ölçeklenebilirlik gerektiren siteler worker veya event gibi evreli MPM modüllerinden birini seçebilmektedir.

Kullanıcı açısından MPM’lerin diğer Apache modüllerinden görünüşte bir farkı yoktur. Asıl fark sunucuya yüklenebilecek azami MPM modülü sayısının bir ve yalnız bir olarak sınırlanmış olmasıdır. Mevcut MPM modülleri modül dizini sayfasında listelenmiştir..

MPM Seçimi

MPM’ler paket yapılandırması sırasında seçilmeli ve sunucu içinde derlenmelidir. Derleyiciler evrelerin kullanılacağını bildikleri takdirde çoğu işlevi evreleri kullanacak şekilde en iyileyebilmektedir.

Kullanmak istediğiniz MPM’yi kendiniz seçmek istediğiniz takdirde configure betiğini --with-mpm=AD seçeneği ile kullanınız. Burada AD istenen MPM’nin adıdır.

Sunucu derlendikten sonra hangi MPM’nin seçilmiş olduğunu ./httpd -l komutuyla saptamak mümkündür. Bu komut, MPM de dahil omak üzere sunucuyla birlikte derlenmiş tüm modülleri listeleyecektir.

Öntanımlı MPM’ler

Aşağıdaki tabloda çeşitli işletim sistemlerinde öntanımlı olan MPM’ler listelenmiştir. Derleme sırasında başka bir seçim yapmadığınız takdirde bu işletim sistemlerinde bu MPM’ler seçilmiş olacaktır.

BeOS | beos
Netware | mpm_netware
OS/2 | mpmt_os2
Unix | prefork
Windows | mpm_winnt

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache’de Ortam Değişkenleri - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > 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
  • mod_env
  • mod_rewrite
  • mod_setenvif
  • mod_unique_id
  • BrowserMatch
  • BrowserMatchNoCase
  • PassEnv
  • RewriteRule
  • SetEnv
  • SetEnvIf
  • SetEnvIfNoCase
  • UnsetEnv

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 listesi suexec.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, yani SetEnvIf ve RewriteCond gibi yönergeler SetEnv ile atanan değişken değerlerini görmezler.

Ortam Değişkenlerinin Kullanımı

İlgili Modüller İlgili Yönergeler
  • mod_authz_host
  • mod_cgi
  • mod_ext_filter
  • mod_headers
  • mod_include
  • mod_log_config
  • mod_rewrite
  • Allow
  • CustomLog
  • Deny
  • ExtFilterDefine
  • Header
  • LogFormat
  • RewriteCond
  • RewriteRule

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.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache Eylemcilerinin Kullanımı - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Apache Eylemcilerinin Kullanımı

Bu belgede Apache Eylemcilerinin kullanımı açıklanmıştır.

Eylemci Nedir?

İlgili Modüller İlgili Yönergeler
  • mod_actions
  • mod_asis
  • mod_cgi
  • mod_imagemap
  • mod_info
  • mod_mime
  • mod_negotiation
  • mod_status
  • Action
  • AddHandler
  • RemoveHandler
  • SetHandler

Bir eylemci bir dosya çağrıldığında uygulanacak eylemin Apache dahilindeki gösterimidir. Genellikle dosyaların kendi türüne bağlı olarak örtük eylemcileri vardır. Normalde tüm dosyalar basitçe sunucu tarafından sunulurlar, fakat bazı dosya türleri normalden farklı şekilde ele alınırlar.

Eylemciler, dosya türünden bağımsız olarak dosyanın bulunduğu yere veya dosya ismi uzantısına göre de yapılandırılabilirler. Gerek, zarif bir çözüm oluşuyla gerekse, hem dosya türünü hem de bir dosya ile ilişkili bir eylemciyi mümkün kılması sebebiyle bunun getirisi daha yüksektir. (Ayrıca, çok uzantılı dosyalara da bakınız.)

Eylemciler sunucu içinde derlenebileceği gibi bir modül olarak ya da Action yönergesi ile de sunucuya dahil edilebilirler. Standart dağıtımda bulunan yerleşik eylemciler şunlardır:

  • default-handler: Dosyayı, öntanımlı olarak durağan içeriği işlemekte kullanılan default_handler() işlevini kullanarak gönderir. (core)
  • send-as-is: Dosyayı HTTP başlıklarıyla olduğu gibi gönderir. (mod_asis)
  • cgi-script: Dosyayı bir CGI betiği olarak ele alır. (mod_cgi)
  • imap-file: Dosyayı bir resim eşleme kuralları dosyası olarak çözümler. (mod_imagemap)
  • server-info: Sunucunun yapılandırma bilgisini döndürür. (mod_info)
  • server-status: Sunucunun durum raporunu döndürür. (mod_status)
  • type-map: Dosyayı içerik uzlaşımı için bir tür eşlem dosyası olarak çözümler. (mod_negotiation)

Örnekler

Bir CGI betiği kullanarak durağan içeriğin değiştirilmesi

Aşağıdaki yönergeler sayesinde, html uzantılı dosyalar için yapılan istekler footer.pl CGI betiğininin çalıştırılmasına sebep olacaktır.

Action add-footer /cgi-bin/footer.pl
AddHandler add-footer .html

Bu yapılandırmayla, istenen belgenin özgün haliyle mi (yeri PATH_TRANSLATED ortam değişkenindedir) yoksa istenen değişiklikler veya eklemeler yapıldıktan sonra mı gönderileceğinden CGI betiği sorumlu olacaktır.

HTTP başlıklı dosyalar

Aşağıdaki yönergeler kendi HTTP başlıklarını içeren dosyalar için kullanılan send-as-is eylemcisini etkinleştirmek amacıyla kullanılmıştır. /siteler/htdocs/asis/ dizinindeki tüm dosyalar dosya ismi uzantılarına bakılmaksızın send-as-is eylemcisi tarafından işleme sokulacaktır.

<Directory /siteler/htdocs/asis>
SetHandler send-as-is </Directory>

Yazılım Geliştirenler İçin

Eylemci özellikleri gerçeklenirken kullanılmak üzere Apache API’ye bir ekleme yapılmıştır. Özellikle de, request_rec yapısına yeni bir kayıt eklenmiştir:

char *handler

Modülünüzün bir eylemciyi devreye sokmasını isterseniz, tek yapacağınız isteğin invoke_handler aşamasının hemen öncesinde r->handler alanına eylemcinin ismini atamak olacaktır. Eylemciler daha önce de bahsedildiği gibi bir içerik türü yerine bir eylemci ismi kullanılarak gerçeklenirler. Çok gerekli olmamakla birlikte, eylemciler için kullanılan adlandırma uzlaşımları gereğince, ismi oluşturan sözcükler, ortam türü isim alanını ihlal etmemek amacıyla bölü imleri ile değil tire imleri ile ayrılırlar.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Süzgeçler - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Süzgeçler

Bu belge, Apache’de süzgeç kullanımı hakkındadır.

Apache 2’de Süzme İşlemi

İlgili Modüller İlgili Yönergeler
  • mod_filter
  • mod_deflate
  • mod_ext_filter
  • mod_include
  • mod_charset_lite
  • FilterChain
  • FilterDeclare
  • FilterProtocol
  • FilterProvider
  • AddInputFilter
  • AddOutputFilter
  • RemoveInputFilter
  • RemoveOutputFilter
  • ExtFilterDefine
  • ExtFilterOptions
  • SetInputFilter
  • SetOutputFilter

Apache 2.0 ve sonrasında mevcut olan Süzgeç Zinciri, uygulamaların nereden geldiğine bakmaksızın gelen ve giden verileri oldukça esnek ve yapılandırılabilir tarzda işlemesini mümkün kılar. Böylece, gelen veriyi bir takım ön işlemlerden geçirebilir, giden veriyi de son bir defa bazı işlemlere sokabiliriz. Bu işlem temel olarak geleneksel istek işleme aşamalarından bağımsızdır.

Süzgeçler, İstek işleme eksenine dik bir veri eksenine peş peşe yerleştirilebilir.

Standard Apache dağıtımıyla gelen süzgeç uygulamalarından bazıları:

  • mod_include, sunucu taraflı içerik yerleştirmeyi gerçekler.
  • mod_ssl, SSL şifrelemesini gerçekler (https).
  • mod_deflate, veri sıkıştırma/açma işlemlerini çalışma anında gerçekleştirir.
  • mod_charset_lite, karakter kümeleri arasında dönüşümü gerçekleştirir.
  • mod_ext_filter, harici bir yazılımı bir süzgeç olarak çalıştırır.

Apache, bunlardan başka, bayt dizilerinin elde edilmesi ve içeriğin bölünmesi gibi işlemleri gerçekleştirmek için bir takım dahili süzgeçler de kullanabilir.

Üçüncü parti süzgeç modülleri tarafından gerçeklenmiş çok geniş bir uygulama alanı mevcuttur; modules.apache.org ve benzerlerinden temin edilebilecek bu tür modüllerden bazılarının uygulama alanları:

  • HTML ve XML belgelerin işlenmesi ve yazılması
  • XSLT dönüşümleri ve XInclude’lar
  • XML İsim-alanı desteği
  • HTML Formlarının çözümlenmesi ve sunucuya dosya yükleme
  • Resim işleme
  • PHP betikleri gibi zararlı olabilecek uygulamalardan korunma
  • Metin düzenleme ve arama işlemleri

Akıllı Süzme

Farklı süzgeç üreticilerinin uygulamaları istek işlemenin durumuna bağlı olarak akıllıca uygulanabilir.

mod_filter, Apache 2.1 ve sonrasında mevcut olup, süzgeç zincirinin çalışma anında devingen olarak yapılandırılabilmesini mümkün kılar. Böylece, örneğin, bir vekili, özgün sunucunun ne göndereceğini bilmeden HTML’yi bir HTML süzgeciyle yazmaya ve JPEG resimleri tamamen farklı bir süzgeçten geçirmeye ayarlayabilirsiniz. Bu, asıl içeriğe bağlı olarak çalışma anında içeriği farklı içerik sağlayıcılara dağıtan bir süzgeç düzeneği kullanılarak çalışır. Bir süzgeç, doğrudan zincire yerleştirilip koşulsuz olarak çalıştırılabileceği gibi bir içerik sağlayıcı gibi kullanılarak zincire devingen olarak yerleştirilebilir. Örneğin:

  • Bir HTML işleme süzgeci sadece içerik text/html veya application/xhtml+xml olduğu takdirde çalışır.
  • Bir sıkıştırma süzgeci sadece girdi sıkıştırılabilir nitelikteyse ve sıkıştırılmamışsa çalışır.
  • Bir karakter kümesi dönüşüm süzgeci, bir metin belgesi istenen karakter kümesine sahip değilse zincire yerleştirilir.

Süzgeçlerin Kullanımı

Süzgeçler iki şekilde kullanılır: Basit ve Devingen. Genelde ikisinden biri kullanılır; karışık kullanılırsa istenmeyen sonuçlara yol açabilir (ise de, basit girdi süzme ile çıktı süzme işlemi basit olsun olmasın karışık kullanılabilir).

Basit yol, girdi süzgeçlerini yapılandırmanın tek yoludur ve bir durağan süzgeç zincirinin gerektiği yerlerde çıktı süzgeçleri için yeterlidir. İlgili yönergeler: SetInputFilter, SetOutputFilter, AddInputFilter, AddOutputFilter, RemoveInputFilter ve RemoveOutputFilter.

Devingen yol, mod_filter belgesinde açıklandığı gibi, çıktı süzgeçlerinin hem durağan hem de esnek ve devingen olarak yapılandırılabilmesini mümkün kılar. İlgili yönergeler: FilterChain, FilterDeclare ve FilterProvider.

AddOutputFilterByType yönergesi hala desteklenmekteyse de sorun çıkarabilmesi sebebiyle kullanımı artık önerilmemektedir. Onun yerine devingen yapılandırma kullanınız.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


SuEXEC Desteği - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

SuEXEC Desteği

SuEXEC özelliği, Apache kullanıcılarına CGI ve SSI programlarını sunucunun aidiyetinde çalıştığı kullanıcıdan farklı bir kullanıcının aidiyetinde çalıştırma olanağı verir. Normalde, CGI ve SSI programlarını çalıştıranla sunucuyu çalıştıran aynı kullanıcıdır.

Gerektiği gibi kullanıldığında bu özellik, kullanıcılara CGI ve SSI programlarını çalıştırma ve geliştirmeye izin vermekle ortaya çıkan güvenlik risklerini azaltır. Bununla birlikte, suEXEC gerektiği gibi yapılandırılmadığı takdirde bazı sorunlara yol açabilir ve bilgisayar güvenliğinizde yeni delikler ortaya çıkmasına sebep olabilir. Güvenlikle ilgili mevcut sorunlarla başa çıkmada ve setuid root programları yönetmekte bilgi ve deneyim sahibi değilseniz suEXEC kullanmayı kesinlikle düşünmemenizi öneririz.

Başlamadan önce

Belgeye balıklama dalmadan önce, Apache Grubu ve bu belge ile ilgili kabuller hakkında bilgi sahibi olmalısınız.

Öncelikle, üzerinde setuid va setgid işlemlerinin yapılabildiği Unix türevi bir işletim sistemi kullandığınızı varsayıyoruz. Tüm komut örnekleri buna dayanarak verilmiştir. Bu desteğe sahip başka platformlar varsa onlardaki yapılandırma burada anlattığımız yapılandırmadan farklı olabilir.

İkinci olarak, bilgisayarınızın güvenliği ve yönetimi ile ilgili bazı temel kavramları bildiğinizi kabul ediyoruz. Buna setuid/setgid işlemlerinin sisteminiz ve güvenlik seviyesi üzerindeki etkilerini bilmek dahildir.

Üçüncü olarak, suEXEC kodunun değiştirilmemiş bir sürümünü kullandığınızı varsayıyoruz. Tüm suEXEC kodu, geliştiricilerin yanında sayısız beta kullanıcısı tarafından dikkatle incelenmiş ve denenmiştir. Kodların hem basit hem de sağlam bir şekilde güvenli olması için gerekli tüm önlemler alınmıştır. Bu kodun değiştirilmesi beklenmedik sorunlara ve yeni güvenlik risklerine yol açabilir. Özellikle güvenlikle ilgili programlarda deneyimli değilseniz suEXEC kodunda kesinlikle bir değişiklik yapmamalısınız. Değişiklik yaparsanız kodlarınızı gözden geçirmek ve tartışmak üzere Apache Grubu ile paylaşmanızı öneririz.

Dördüncü ve son olarak, Apache Grubunun suEXEC’i öntanımlı Apache kurulumunun bir parçası yapmama kararından bahsetmek gerekir. Bunun sonucu olarak, suEXEC yapılandırması sistem yöneticisinin ayrıntılı bir incelemesini gerektirir. Gerekli incelemeden sonra yönetici tarafından suEXEC yapılandırma seçeneklerine karar verilip, normal yollardan sisteme kurulumu yapılır. Bu seçeneklerin belirlenmesi, suEXEC işlevselliğinin kullanımı sırasında sistem güvenliğini gerektiği gibi sağlamak için yönetici tarafından dikkatle saptanmayı gerektirir. Bu sürecin ayrıntılarının yöneticiye bırakılma sebebi, Apache Grubunun suEXEC kurulumunu, suEXEC’i dikkatle kullanacak yeterliliğe sahip olanlarla sınırlama beklentisidir.

Hala bizimle misiniz? Evet mi? Pekala, o halde devam!

SuEXEC Güvenlik Modeli

SuEXEC yapılandırması ve kurulumuna girişmeden önce biraz da gerçekleşmesini istediğiniz güvenlik modelinin ayrıntıları üzerinde duralım. Böylece, suEXEC’in içinde olup bitenleri ve sisteminizin güvenliği için alınacak önlemleri daha iyi anlayabilirsiniz.

suEXEC işlevselliği, Apache HTTP Sunucusu tarafından gerektiği takdirde artalanda çalıştırılan bir setuid programa dayanır. Bu program, bir CGI veya SSI betiğine bir HTTP isteği yapıldığı zaman, bu betiği, yöneticinin ana sunucunun aidiyetinde çalıştığı kullanıcıdan farklı olarak seçtiği bir kullanıcının aidiyetinde çalıştırmak için çağrılır. Böyle bir istek geldiğinde, Apache artalandaki setuid programına, HTTP isteği yapılan programın ismiyle beraber aidiyetinde çalışacağı kullanıcı ve grup kimliklerini de aktarır.

Artalanda çalıştırılan setuid program başarıyı ve başarısızlığı aşağıdaki süreci izleyerek saptar. Bunlardan herhangi biri başarısız olursa program başarısızlık durumunu günlüğe kaydeder ve bir hata vererek çıkar. Aksi takdirde çalışmaya devam eder.

  1. Setuid programı çalıştıran kullanıcı sistemin geçerli kullanıcılarından biri mi?

    Bu, setuid programı çalıştıran kullanıcının sistemin gerçek bir kullanıcısı olduğunudan emin olunmasını sağlar.

  2. Setuid program yeterli sayıda argümanla çağrılmış mı?

    Apache’nin artalanda çağırdığı setuid program ancak yeterli sayıda argüman sağlandığı takdirde çalışacaktır. Argümanların sayısını ve sırasını Apache HTTP sunucusu bilir. Eğer setuid program yeterli sayıda argümanla çağrılmamışsa ya kendisinde bir değişiklik yapılmıştır ya da kurulu Apache çalıştırılabilirinin suEXEC ile ilgili kısmında yanlış giden bir şeyler vardır.

  3. Bu geçerli kullanıcının bu setuid programı çalıştırma yetkisi var mı?

    Sadece tek bir kullanıcı (Apache’nin aidiyetinde çalıştığı kullanıcı) bu programı çalıştırmaya yetkilidir.

  4. Hedef CGI veya SSI programı hiyerarşik olarak güvenliği bozacak bir dosya yolu üzerinde mi?

    Hedef CGI veya SSI programının dosya yolu '/' veya '..' ile başlıyor mu? Buna izin verilmez. Hedef CGI veya SSI programı suEXEC’in belge kök dizininde yer almalıdır (aşağıda --with-suexec-docroot=DİZİN seçeneğine bakınız).

  5. Hedef kullanıcı ismi geçerli mi?

    Hedef kullanıcı mevcut mu?

  6. Hedef grup ismi geçerli mi?

    Hedef grup mevcut mu?

  7. Hedef kullanıcı root değil, değil mi?

    Mevcut durumda, root kullanıcısının CGI/SSI programlarını çalıştırmasına izin verilmemektedir.

  8. Hedef kullanıcı kimliği asgari kullanıcı numarasından BÜYÜK mü?

    Asgari kullanıcı numarası yapılandırma sırasında belirtilir. Böylece CGI/SSI programlarını çalıştırmasına izin verilecek olası en düşük kullanıcı numarasını belirlemeniz mümkün kılınmıştır. Bu bazı “sistem” hesaplarını devreden çıkarmak için yararlıdır.

  9. Hedef grup root değil, değil mi?

    root grubunun CGI/SSI programlarını çalıştırmasına izin verilmez.

  10. Hedef grup numarası asgari grup numarasından BÜYÜK mü?

    Asgari grup numarası yapılandırma sırasında belirtilir. Böylece CGI/SSI programlarını çalıştırmasına izin verilecek olası en düşük grup numarasını belirlemeniz mümkün kılınmıştır. Bu bazı “sistem” hesaplarını devreden çıkarmak için yararlıdır.

  11. Apache’nin artalanda çağırdığı setuid program hedef kullanıcı ve grubun aidiyetine geçebildi mi?

    Bu noktadan itibaren program setuid ve setgid çağrıları üzerinden hedef kullanıcı ve grubun aidiyetine geçer. Erişim grubu listesi de ayrıca kullanıcının üyesi olduğu tüm gruplara genişletilir.

  12. Hedef CGI/SSI programının bulunduğu dizine geçebildik mi?

    Dizin mevcut değilse dosyaları da içeremez. Hedef dizine geçemiyorsak bu, dizin mevcut olmadığından olabilir.

  13. Hedef dizin Apache için izin verilen yerlerden biri mi?

    İstek sunucunun normal bir bölümü için yapılmış olsa da istenen dizin acaba suEXEC’in belge kök dizini altında mı? Yani, istenen dizin, suEXEC’in aidiyetinde çalıştığı kullanıcının ev dizini altında bulunan, UserDir ile belirtilen dizinin altında mı? (suEXEC’in yapılandırma seçeneklerine bakınız).

  14. Hedef dizin başkaları tarafından yazılabilen bir dizin değil, değil mi?

    Başkaları da yazabilsin diye bir dizin açmıyoruz; dizin içeriğini sadece sahibi değiştirebilmelidir.

  15. Hedef CGI/SSI programı mevcut mu?

    Mevcut değilse çalıştırılamaz.

  16. Hedef CGI/SSI program dosyasına başkaları tarafından yazılamıyor, değil mi?

    Hedef CGI/SSI programının dosyasına sahibinden başka kimsenin bir şeyler yazmasını istemeyiz.

  17. Hedef CGI/SSI program setuid veya setgid değil, değil mi?

    UID/GID‘i tekrar değiştirecek programlar çalıştırmayı istemeyiz.

  18. Hedef kullanıcı/grup, programın kullanıcı/grubu ile aynı mı?

    Hedef kullanıcı dosyanın sahibi mi?

  19. İşlemlerin güvenle yapılabilmesi için süreç ortamını başarıyla temizleyebildik mi?

    suEXEC, sürecin çalışacağı ortama güvenli bir program çalıştırma yolu sağlamaktan başka, yapılandırma sırasında oluşturulan güvenli ortam değişkenleri listesinde isimleri bulunan ortam değişkenlerinden başkasını aktarmayacaktır.

  20. Hedef CGI/SSI programı haline gelip çalışabildik mi?

    Burası suEXEC’in bitip CGI/SSI programının başladığı yerdir.

Bu süreç suEXEC güvenlik modelinin standart işlemlerini oluşturur. Biraz zorlayıcı ve CGI/SSI tasarımına yeni kurallar ve sınırlamalar getiriyor olsa da düşünülen güvenliği adım adım sağlayacak şekilde tasarlanmıştır.

Düzgün bir suEXEC yapılandırmasının hangi güvenlik risklerinden kurtulmayı sağladığı ve bu güvenlik modelinin sunucu yapılandırmasıyla ilgili sorumluluklarınızı nasıl sınırlayabildiği hakkında daha ayrıntılı bilgi edinmek için bu belgenin "Uyarılar ve Örnekler" bölümüne bakınız.

suEXEC’in Yapılandırılması ve Kurulumu

Eğlence başlıyor.

suEXEC yapılandırma seçenekleri

--enable-suexec
Bu seçenek, hiçbir zaman öntanımlı olarak kurulmayan ve etkinleştirilmeyen suEXEC özelliğini etkin kılar. suEXEC özelliğini kullanma isteğinizi Apache’nin kabul edebilmesi için --enable-suexec seçeneğinin yanında en azından bir tane de --with-suexec-xxxxx seçeneği belirtilmiş olmalıdır.
--with-suexec-bin=YOL
Güvenlik sebebiyle suexec çalıştırılabilirinin bulunduğu yer sunucu koduna yazılır. Bu seçenekle öntanımlı yol değiştirilmiş olur. Örnek:
--with-suexec-bin=/usr/sbin/suexec
--with-suexec-caller=KULLANICI
Normalde Apache’nin aidiyetinde çalıştığı kullanıcıdır. Bu, bu programı çalıştırmasına izin verilen tek kullanıcıdır.
--with-suexec-userdir=DİZİN

Kullanıcıların ev dizinleri altında suEXEC’in erişmesine izin verilen alt dizinin yerini tanımlar. Bu dizin altında suEXEC kullanıcısı tarafından çalıştırılacak tüm programlar "güvenilir" olmalıdır. Eğer “basit” bir UserDir yönergesi kullanıyorsanız ( içinde “*” bulunmayan), bunun aynı dizin olması gerekir. Eğer burada belirtilen dizin, passwd dosyasında kullanıcı için belirtilmiş dizinin altında UserDir yönergesinde belirtilen dizin olmadığı takdirde suEXEC işini gerektiği gibi yapmayacaktır. Öntanımlı değer public_html’dir.

Eğer, sanal konaklarınızın herbiri farklı UserDir yönergeleri içeriyorsa burada belirtilecek dizinin üst dizininin hepsinde aynı olması gerekir. Aksi takdirde, "~kullanıcı" istekleri düzgün çalışmayacaktır.

--with-suexec-docroot=DİZİN
Apache için belge kök dizinini belirler. Bu, (UserDir’lardan başka) suEXEC için kullanılacak tek hiyerarşi olacaktır. Öntanımlı dizin sonuna "/htdocs" eklenmiş --datadir dizinidir. Yani, seçeneği "--datadir=/home/apache" olarak belirtmişseniz suEXEC çalıştırıcısı için belge kök dizini "/home/apache/htdocs" olur.
--with-suexec-uidmin=UID
suEXEC kullanıcısının kullanıcı kimliği olarak izin verilen en düşük değeri belirler. Çoğu sistemde bu ya 500’dür ya da 100; 100 öntanımlıdır.
--with-suexec-gidmin=GID
suEXEC kullanıcısının grup kimliği olarak izin verilen en düşük değeri belirler. Çoğu sistemde bu 100 olup, seçeneğin de öntanımlı değeridir.
--with-suexec-logfile=DOSYA
suEXEC hareketlerinin ve hatalarının kaydedileceği günlük dosyasının adını belirler (denetim ve hata ayıklama için kullanışlıdır). Öntanımlı günlük dosyası ismi "suexec_log" olup yeri (--logfiledir seçeneği ile belirtilen) günlük dosyaları dizinidir.
--with-suexec-safepath=YOL
CGI çalıştırılabilirlerine aktarılacak güvenilir PATH ortam değişkeninin değerini tanımlar. "/usr/local/bin:/usr/bin:/bin" öntanımlıdır.

SuEXEC çalıştırıcısının derlenmesi ve kurulumu

SuEXEC özelliğini --enable-suexec seçeneği ile etkinleştirdiyseniz make komutunu verdiğinizde Apache ile birlikte suexec çalıştırılabilir dosyası da derlenecektir.

Tüm bileşenler derlendikten sonra make install komutunu vererek kurulumu tamamlayabilirsiniz. suexec çalıştırılabilir dosyası --sbindir seçeneği ile tanımlanan dizine kurulacaktır; öntanımlı yeri /usr/local/apache2/bin/ dizinidir.

Kurulum adımında root yetkisine sahip olmanız gerektiğini unutmayın. Çalıştırıcıya kullanıcı kimliğinin atanabilmesi ve dosyanın sahibi olan kullanıcı kimliği ile çalıştırılabilmesini mümkün kılan bitinin etkin kılınabilmesi için kurulumun root tarafından yapılması önemlidir.

Paranoyak yetkilendirme

SuEXEC çalıştırıcısı kendini çalıştıran kullanıcının configure betiğine --with-suexec-caller seçeneği ile belirtilen kullanıcı olup olmadığına bakacaksa da, bu sınamanın da bir sistem veya kütüphane çağrısı ile istismar edilmiş olma ihtimali gözardı edilmemelidir. Bunun meydana gelmesini önlemek için ve genelde yapıldığı gibi dosyanın izinlerini suEXEC çalıştırıcısı sadece Apache sunucusunun aidiyetinde çalıştığı kullanıcı tarafından çalıştırılacak şekilde ayarlayınız.

Örneğin, sunucunuz şöyle yapılandırılmışsa:

User apache
Group apache-grup

Ve suexec çalıştırılabilir de /usr/local/apache2/bin/ dizinine kurulmuşsa şu komutları vermelisiniz:

chgrp apache-grup /usr/local/apache2/bin/suexec
chmod 4750 /usr/local/apache2/bin/suexec

Böylece suEXEC çalıştırıcısını Apache’yi çalıştıran grubun üyelerinden başkasının çalıştıramayacağından emin olabilirsiniz.

suEXEC’in etkin kılınması ve iptal edilmesi

Apache başlatıldığı sırada suexec çalıştırıcısı için --sbindir seçeneği ile tanımlanan dizine bakar (seçeneğin öntanımlı değeri /usr/local/apache/sbin/suexec’tir). Apache düzgün yapılandırılmış bir suEXEC çalıştırıcısı bulduğu takdirde hata günlüğüne şöyle bir ileti yazacaktır:

[notice] suEXEC mechanism enabled (wrapper: /dosya/yolu/suexec)

Sunucu başlatıldığında bu ileti yazılmazsa sunucu ya çalıştırıcı programı umduğu yerde bulamamıştır ya da dosyanın setuid biti root tarafından etkin kılınmamıştır.

SuEXEC mekanizmasını etkin kılmak istediğiniz sunucu çalışmaktaysa sunucuyu önce öldürmeli sonra yeniden başlatmalısınız. Basit bir HUP veya USR1 sinyali ile yeniden başlamasını sağlamak yeterli olmayacaktır.

SuEXEC mekanizmasını iptal etmek için ise suexec dosyasını sildikten sonra Apache sunucusunu öldürüp yeniden başlamalısınız.

SuEXEC’in kullanımı

CGI programlarına yapılan isteklerin suEXEC çalıştırıcısı tarafından yerine getirilebilmesi için sanal konağın bir SuexecUserGroup yönergesi içermesi veya isteğin mod_userdir tarafından işleme konulması gerekir.

Sanal Konaklar:
SuEXEC çalıştırıcısını farklı bir kullanıcı ile etkin kılmanın tek yolu VirtualHost bölümleri içinde SuexecUserGroup yönergesini kullanmaktır. Bu yönergede ana sunucuyu çalıştıran kullanıcıdan farklı bir kullanıcı belirterek ilgili sanal konak üzerinden CGI kaynakları için yapılan tüm isteklerin belirtilen kullanıcı ve grup tarafından çalıştırılması sağlanır. Bu yönergeyi içermeyen sanal konaklar için ana sunucunun kullanıcısı öntanımlıdır.

Kullanıcı dizinleri:
mod_userdir tarafından işleme sokulan tüm istekler için suEXEC çalıştırıcısı istek yapılan kullanıcı dizininin sahibinin aidiyetinde çalıştırılacaktır. Bu özelliğin çalışması için tek gereklilik, kullanıcının SuEXEC çalıştırıcısı için etkin kılınmış olması ve çalıştırıcının yukarıdaki güvenlik sınamalarından geçebilmesidir. Ayrıca, --with-suexec-userdir derleme seçeneğinin açıklamasına da bakınız.

SuEXEC ve hata ayıklama

SuEXEC çalıştırıcısı yukarıda değinildiği gibi günlük bilgilerini --with-suexec-logfile seçeneği ile belirtilen dosyaya yazacaktır. Çalıştırıcıyı doğru yapılandırarak kurduğunuzdan emin olmak istiyorsanız, yolunda gitmeyen şeyler var mı diye bu günlük dosyasına bakmayı ihmal etmeyin.

Uyarılar ve Örnekler

UYARI! Bu bölüm henüz bitmedi. Bu bölümün son hali için çevrimiçi belgelere bakınız.

SuEXEC çalıştırıcısından dolayı sunucu ayarlarına bazı sınırlamalar getiren bir kaç önemli nokta mevcuttur. SuEXEC ile ilgili hata bildiriminde bulunmadan önce bunlara bir göz atmalısınız.

  • suEXEC ile ilgili önemli noktalar
  • Hiyerarşik sınırlamalar

    Güvenlik ve verimlilik adına, tüm suEXEC isteklerinin sanal konaklar için üst düzey belge kökünün altındaki dosyalarla, kullanıcı dizinleri için ise üst düzey bireysel belge köklerinin altındaki dosyalarla sınırlı kalması gerekir. Örneğin, dört sanal konağınız varsa ve suEXEC çalıştırıcısının getirilerinden faydalanmak istiyorsanız, sanal konaklarınızın belge kök dizinlerini ana sunucunun belge kök dizininin altında kalacak şekilde yapılandırmanız gerekir (örnek yolda).

  • SuEXEC'in PATH ortam değişkeni

    Bunu değiştirmek tehlikeli olabilir. Bu değişkende tanımladığınız her yolun güvenli bir dizini işaret ettiğinden emin olmalısınız. Başkalarının oralarda bir truva atı çalıştırmasını istemiyorsanız buna çok dikkat ediniz.

  • SuEXEC kodunda değişiklik

    Gerçekte ne yaptığınızı bilmiyorsanız bu, büyük bir sorun olabilir. Böyle şeyler yapmaktan mümkün olduğunca uzak durmalısınız.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache ve DNS ile ilgili Konular - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Apache ve DNS ile ilgili Konular

Bu sayfanın konusu şöyle özetlenebilirdi: Yapılandırma dosyalarınızda DNS sorguları yapılmasını gerektirecek ayarlamalardan kaçınınız. Eğer yapılandırma dosyalarınızda DNS sorgusu yapılarak çözümlenebilecek adresler bulunursa sunucunuz beklenmedik davranışlar (hiç başlamayabilir) gösterebileceği gibi hizmet reddi veya hizmet hırsızlığı (bazı kullanıcıların diğerlerine giden sayfaları çalma olasılığı dahil) saldırılarına açık hale gelebilir.

Basit Bir Örnek

<VirtualHost falan.fesmekan.dom> ServerAdmin filanca@fesmekan.dom
DocumentRoot /siteler/fesmekan </VirtualHost>

Apache’nin beklendiği gibi işlemesi için her sanal konak için iki veriye mutlaka ihtiyacı vardır: ServerName ve sunucunun bağlantı kabul edip hizmet sunacağı en az bir IP adresi. Yukarıdaki örnekte IP adresi bulunmamaktadır, dolayısıyla Apache, falan.fesmekan.dom adresi için bir DNS sorgusu yapmak zorundadır. Eğer sunucu, yapılandırma dosyasını çözümlediği sırada bir sebeple DNS sunucusuna erişemezse bu sanal konak yapılandırılmayacak (hApache 1.2 öncesinde sunucu hiç başlatılmazdı) ve bu sanal konağa yapılan isteklere yanıt verilemeyecektir.

falan.fesmekan.dom’un 192.168.2.1 IP adresine sahip olduğunu varsayarsak yapılandırma şöyle olurdu:

<VirtualHost 192.168.2.1>
ServerAdmin filanca@fesmekan.dom
DocumentRoot /siteler/fesmekan </VirtualHost>

Ancak, bu sefer de bu sanal konağın sunucu ismini öğrenmek için Apache’nin bir ters DNS sorgusu yapması gerekecektir. Eğer bu sorgu başarısız olursa kısmi bir yapılandırmaya gidilir (Apache 1.2 öncesinde sunucu hiç başlatılmazdı). Eğer sanal konak isme dayalı ise sanal konak kısmen bile yapılandırılmaz. IP’ye dayalı sanal konaklar büyük oranda çalışır, fakat sunucu ismini içeren tam bir adres üretilmesini gerektiren bir durumda, sunucu geçerli bir adres üretemez.

Her iki sorunu da çözen yapılandırma şöyle olurdu:

<VirtualHost 192.168.2.1>
ServerName falan.fesmekan.dom
ServerAdmin filanca@fesmekan.dom
DocumentRoot /siteler/fesmekan </VirtualHost>

Hizmet Reddi

Hizmet reddinin meydana gelebilecek (en az) iki türü vardır. Apache’nin 1.2 öncesi bir sürümünü kullanıyorsanız sanal konaklarınızdan herhangi biri için yukarıdaki iki sorgudan biri başarısız olursa sunucunuzu asla başlatamazsınız. Bazı durumlarda, DNS sorgularından alınacak yanıtlar sizin denetiminizde olmayabilir; örneğin fesmekan.dom müşterilerinizden birine aitse ve kendi DNS sunucuları varsa falan.fesmekan.dom kaydını silerek sunucunuzun hiç başlatılamamasına (1.2 öncesi) sebep olabilirler.

Diğer türü biraz daha sinsidir. Şöyle bir yapılandırmanız olsun:

<VirtualHost falan.fesmekan.dom>
ServerAdmin filanca@fesmekan.dom
DocumentRoot /siteler/fesmekan </VirtualHost>

<VirtualHost misal.mesela.dom>
ServerAdmin falanca@mesela.dom
DocumentRoot /siteler/mesela
 </VirtualHost>

falan.fesmekan.dom’a 192.168.2.1, misal.mesela.dom’a 192.168.2.2 atadığınızı fakat, fesmekan.dom’un DNS kaydının sizin denetiminizde olmadığını varsayalım. Bu yapılandırmayla, fesmekan.dom’u mesela.dom’a giden tüm trafiği çalabilecek duruma getirirsiniz. Bunu gerçekleştirmek için DNS kaydında falan.fesmekan.dom’a 192.168.2.2 adresinin atanması yeterlidir. Kendi DNS’lerine sahip olduklarından dolayı falan.fesmekan.dom’a istedikleri IP adresini atamaktan onları alıkoyamazsınız.

192.168.2.2’ye gelen isteklerin hepsine (http://misal.mesela.dom/biryer şeklinde yazılan adresler dahil) fesmekan.dom sanal konağınca hizmet sunulacaktır. Apache’nin gelen istekleri sunduğu sanal konaklarla nasıl eşleştirdiğini bilirseniz bunun sebebini kolayca anlarsınız. Bunu kabataslak açıklayan bir belgemiz mevcuttur.

"Ana Sunucu" Adresi

Apache 1.1’de isme dayalı sanal konak desteğine ek olarak, Apache’nin, httpd’nin çalıştığı makinenin IP adres(ler)ini de bilmeye ihtiyacı vardır. Bu adresi elde etmek için sunucu, ya sunucu genelinde geçerli ServerName yönergesine bakar ya da bir C işlevi olan gethostname’i kullanır (işlev, komut isteminden hostname komutuna dönen yanıtın aynısını döndürür) ve ardından bu adresle ilgili olarak bir DNS sorgusu yapar. Bu sorgudan kaçınmanın henüz bir yolu yoktur.

Eğer bu sorgunun (DNS sunucusunun çökmüş olması gibi bir nedenle) başarısız olabileceğinden korkuyorsanız, makine ismini ve IP adresini /etc/hosts dosyanıza yazabilirsiniz (Makinenizin düzgün olarak açılabilmesi için zaten bu kaydı yapmış olmanız gerekir). Kullandığınız işletim sistemine bağlı olarak bu kaydın /etc/resolv.conf veya /etc/nsswitch.conf dosyasında bulunması gerekebilir.

Herhangi bir nedenle sunucunuz bir DNS sorgusu yapmıyorsa veya yapmamalıysa, Apache’yi HOSTRESORDER ortam değişkenine "local" değerini atadıktan sonra çalıştırabilirsiniz. Bu tamamen işletim sistemine ve kullandığınız çözümleyici kütüphanelere bağlıdır. Ayrıca, ortamı denetlemek için mod_env kullanmıyorsanız, CGI’ler de bundan etkilenir. En iyisi işletim sisteminizin SSS belgelerini ve kılavuz sayfalarını okumaktır.

Bu Sorunlardan Kaçınmak için İpuçları

  • VirtualHost yönergelerinizde IP adresleri kullanınız.
  • Listen yönergelerinizde IP adresleri kullanınız.
  • Tüm sanal konakların ayrı birer ServerName yönergesi olsun.
  • Hiçbir sayfa sunulmayan bir <VirtualHost _default_:*> sanal konağınız olsun.

Ek: Ufuk Turu

DNS ile ilgili durum hiç de arzu edildiği gibi değildir. Apache 1.2 için, DNS sorguları başarısız olsa bile sunucunun başlatılabilmesini sağlamaya çalıştık, fakat belki yapabildiğimizden daha da iyisi mümkündür. Günümüz Genel Ağ’ında IP adresleri sık sık değiştiğinden yapılandırma dosyasına doğrudan IP adresini yazma gerekliliği asla arzu edilen davranış değildir.

Yukarıda nasıl yapıldığı açıklanan hizmet hırsızlığı saldırısına karşı önlem olarak, normal sorgudan dönen IP adresine bir ters DNS sorgusu yapıp bu iki sonucu karşılaştırmak ve eşleşmeme durumunda sanal konağı iptal etmek bir çözüm olabilir. Fakat bunun mümkün olabilmesi için uygun bir ters DNS kaydına ihtiyaç vardır. (FTP sunucuları ve TCP sarmalayıcılar tarafından yapılan çifte ters DNS sorgusu kullanımından dolayı çoğu ağ yöneticisi bu konuda zaten bilgi sahibidir.)

Her halükarda, IP adreslerinin kullanılmaması nedeniyle yapılan DNS sorgularının başarısız olması durumunda sanal konaklı bir sunucuyu düzgün bir şekilde başlatmak olası görünmektedir. Yapılandırmayı kısmen iptal etmek gibi kısmi çözümler, sunucudan beklentinizin ne olduğuna bağlı olarak sunucuyu hiç başlatmamaktan daha iyi olabilir.

HTTP/1.1’de belirtildiği gibi Host başlığını göndererek işlem yapabilen tarayıcılar ve vekiller IP’ye dayalı sanal konak kullanımını tamamen ortadan kaldırmanın mümkün olabileceğini göstermektedir. Bu durumda yapılandırmanın çözümlenmesi aşamasında DNS sorgusu yapma gereği kalmayacaktır. Fakat 1997 Mart’ından beri önemli sunucular üzerinde bunların yeterince geniş bir uygulama alanı bulmadığı görülmektedir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache Sanal Konak Belgeleri - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Apache Sanal Konak Belgeleri

Sanal Konak (Virtual Host) terimi tek bir makine üzerinde birden fazla sitenin (sirket1.example.com, sirket2.example.com gibi) barındırılma uygulamasını betimler. Sanal konaklar, "IP’ye dayalı" veya "isme dayalı" olabilir; birincisinde, her site ayrı bir IP adresinden sunulurken, ikincisinde her IP adresinde birden fazla site sunulur. Olayda aynı fiziksel sunucu kullanıldığı halde bu sunucu son kullanıcıya görünür değildir.

Apache yazılımsal olarak IP’ye dayalı sanal konakları destekleyen ilk sunuculardan biridir. 1.1 sürümünden itibaren Apache hem IP’ye dayalı hem de isme dayalı sanal konakları desteklemektedir. İsme dayalı sanal konaklara bazen konağa dayalı sanal konaklar veya IP’ye dayanmayan sanal konaklar da denmektedir.

Aşağıda, Apache HTTP Sunucusu için sanal konak desteğini bütün ayrıntıları ile açıklayan belgeler listelenmiştir.

Ayrıca bakınız:

  • mod_vhost_alias
  • İsme Dayalı Sanal Konaklar
  • IP Adresine Dayalı Sanal Konaklar
  • Sanal Konak Örnekleri
  • Dosya Tanıtıcı Sınırları
  • Kütlesel Sanal Konaklık
  • Ayrıntılı olarak Konak Eşleme

Sanal Konak Desteği

  • İsme Dayalı Sanal Konaklar (Her IP adresinde birden fazla site)
  • IP Adresine Dayalı Sanal Konaklar (Her site için ayrı IP adresi)
  • Çok kullanılan sanal konak yapılandırma örnekleri
  • Dosya Tanıtıcı Sınırları (veya, çok fazla günlük dosyası)
  • Devingen olarak Yapılandırılan Kütlesel Sanal Barındırma
  • Konak Eşlemenin Derinliğine İncelenmesi

Yapılandırma Yönergeleri

  • NameVirtualHost
  • <VirtualHost>
  • ServerName
  • ServerAlias
  • ServerPath

Sanal konak yapılandırmanız üzerinde hata ayıklamaya çalışıyorsanız Apache’nin -S komut satırı seçeneği şu şekilde çok işinize yarayabilir:

/usr/local/apache2/bin/httpd -S

Bu komut, yapılandırma dosyasının Apache yorumunu dökümler. IP adreslerinin ve sunucu isimlerinin dikkatli bir incelemesi, yapılandırma yanlışlarınızı keşfetmenize yardımcı olabilir. (Diğer komut satırı seçenekleri için httpd programının belgelerine bakınız.)

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


İsme Dayalı Sanal Konaklar - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Sanal Konaklar

İsme Dayalı Sanal Konaklar

Bu belgede isme dayalı sanal konakların ne zaman, nasıl kullanılacakları açıklanmıştır.

Ayrıca bakınız:

  • IP Adresine Dayalı Sanal Konaklar
  • Konak Eşlemenin Derinliğine İncelenmesi
  • Devingen olarak Yapılandırılan Kütlesel Sanal Barındırma
  • Çok kullanılan sanal konak yapılandırma örnekleri
  • ServerPath yapılandırma örneği

İsme dayalı ve IP’ye dayalı Sanal Konaklar

IP’ye dayalı sanal konaklarda sunulacak sanal konağı doğru tespit edebilmek için bağlantının yapıldığı IP adresine bakılır. Bu bakımdan her konak için ayrı bir IP adresine gereksinim vardır. İsme dayalı sanal konaklarda ise sunucu, istemcinin HTTP başlığının bir parçası olarak gönderdiği konak adını kullanır. Bu teknikte aynı IP adresini çok sayıda farklı konak kullanabilir.

İsme dayalı sanal barındırma nispeten daha kolaydır, çünkü her konak ismini doğru IP adresiyle eşlemek için DNS sunucunuzu yapılandırdıktan sonra Apache HTTP sunucusunu farklı konak isimlerini tanıyacak şekilde yapılandırmanız yeterli olur. İsme dayalı sanal barındırma ayrıca zaten kıt olan IP adreslerine talebi de azaltır. Bu nedenle, açıkça IP’ye dayalı sanal konakları talep eden donanım kullanmadıkça isme dayalı sanal konaklar kullanmalısınız. SNI desteksiz bir mod_ssl sürümü (Apache'nin 2.2.12 sürümüne kadar standart) kullanmıyorsanız, istemci desteğine bağlı IP’ye dayalı sanal konaklar için geçerli tarihsel sebepler, genel amaçlı bir HTTP sunucusu için artık uygulanabilir değildir.

İsme Dayalı Sanal Konakların Kullanımı

İlgili Modüller İlgili Yönergeler
  • core
  • DocumentRoot
  • NameVirtualHost
  • ServerAlias
  • ServerName
  • ServerPath
  • <VirtualHost>

İsme dayalı sanal konakları kullanmak için, bu konaklar için istekleri kabul edecek sunucuya IP adresini (ve muhtemelen portu da) belirtmelisiniz. Bu işlem NameVirtualHost yönergesiyle yapılır. Normal şartlar altında sunucu üzerinde bütün IP adreslerinin kullanılması gerekir; bunun için NameVirtualHost yönergesine argüman olarak * belirtebilirsiniz. Çok sayıda port kullanmayı planlıyorsanız (SSL çalıştırmak gibi), argümana *:80 şeklinde port ekleyebilirsiniz. Yalnız, NameVirtualHost yönergesinde bir IP adresi belirtmiş olmakla sunucunun kendiliğinden o IP adresini dinlemeyeceğine dikkat ediniz. Bu konuda ayrıntılı bilgi edinmek için Apache’nin kullanacağı adreslerin ve portların ayarlanması belgesine bakınız. Ayrıca, sunucuda, burada belirttiğiniz IP adresine sahip bir ağ arabirimi olmalıdır.

Sonraki adım sunacağınız her konak için ayrı bir <VirtualHost> bölümü oluşturmaktır. <VirtualHost> yönergesinin argümanı ile eşleşen bir NameVirtualHost yönergesi tanımlanmış olmalıdır (değer normalde "*:80" olacaktır). Her <VirtualHost> bölümü içinde sunulan konağı belirtmek üzere en azından bir adet ServerName yönergesine ve konak içeriğinin dosya sisteminde bulunduğu yeri gösteren bir DocumentRoot yönergesine ihtiyacınız olacaktır.

Ana konağı unutmayın

Mevcut sitenize sanal konaklar eklerseniz, mevcut siteniz için de bir <VirtualHost> bölümü oluşturmalısınız. Bu sanal konak bölümü içinde kullanacağınız ServerName ve DocumentRoot yönergelerinin argümanları, bu yönergelerin sunucu geneli için belirttiğiniz değerlerini içermelidir. Bu sanal konağı yapılandırma dosyanızdaki ilk sanal konak yapın ki, öntanımlı konak olsun.

Örnek olarak, www.biralan.tld adresinden sitenizi sunmakta olduğunuzu ve bunun yanına aynı IP adresini kullanan www.digeralan.tld sanal konağını eklemek istediğinizi varsayalım. Bunun için httpd.conf dosyanıza basitçe şu satırları ekleyebilirsiniz:

NameVirtualHost *:80

<VirtualHost *:80>
ServerName www.biralan.tld
ServerAlias biralan.tld *.biralan.tld
DocumentRoot /siteler/biralan
 </VirtualHost>

<VirtualHost *:80>
ServerName www.digeralan.tld
DocumentRoot /siteler/digeralan
 </VirtualHost>

İsterseniz, NameVirtualHost ve <VirtualHost> yönergelerinde argüman olarak * yerine doğrudan bir IP adresi belirtebilirsiniz. Hatta, daha sonra, isme dayalı sanal konakları bir IP adresinden ve IP’ye dayalı olanları veya isme dayalı diğer bir sanal konak grubunu diğer IP adreslerinden sunmak isteyebilirsiniz.

Çoğu sunucunun birden fazla isim ile erişilebilir olması istenir. Bu, <VirtualHost> bölümü içine bir ServerAlias yönergesi yerleştirmek suretiyle mümkün olur. Örneğin yukarıdaki örnekte, kullanıcıların aynı siteye farklı isimlerle erişmelerini mümkün kılmak için bölüm içine şu satırı ekleyebilirsiniz:

ServerAlias biralan.tld *.biralan.tld

Böylece biralan.tld alanındaki tüm konaklar için gelen isteklere www.biralan.tld sanal konağından hizmet sunulmuş olur. Konak isimleriyle eşleşmek üzere dosya ismi kalıp karakterleri * ve ? kullanılabilir. Şüphesiz bu isimleri sırf ServerName veya ServerAlias yönergesinde belirtmiş olmakla bu isimleri erişilebilir kılamazsınız. Öncelikle, bu isimleri sunucunuzdaki IP adresleriyle eşlemek üzere yapılandıracağınız bir DNS sunucunuz olmalıdır.

VirtualHost içindeki isimlerin tamamı (jokersiz) bir ServerAlias gibi ele alınır (fakat başka bir ServerAlias ile geçersiz kılınmazlar).

Son olarak, sanal konak yapılandırmanıza, <VirtualHost> bölümlerinin içine başka yönergeler yerleştirerek ince ayar çekebilirsiniz. Çoğu yönerge bu bölümlere yerleştirilebilir ve sadece o sanal konakla ilgili yapılandırmayı değiştirmek için kullanılabilir. Belli bir yönergenin sanal konak bölümlerinde kullanılıp kullanılmayacağını yönergenin açıklamasında Bağlam satırına bakarak öğrenebilirsiniz. Ana sunucu bağlamındaki (<VirtualHost> bölümleri dışındaki) yapılandırma yönergelerinden sadece sanal konak bölümlerinde geçersiz kılınmamış olanlar kullanılacaktır.

Sunucuya bir istek geldiğinde, sunucu önce IP adresiyle eşleşmesi olası NameVirtualHost bölümleri var mı diye bakar. Varsa, IP adresini eşleştirmek için NameVirtualHost bölümlerine tek tek bakar ve istenen konak ismi ile eşleşen bir ServerName veya ServerAlias yönergesi bulmaya çalışır. Bir tane bulduğunda, sunucu için onun yapılandırmasını kullanır. İsimle eşleşen bir sanal konak bulamazsa IP adresiyle eşleşen ilk sanal konağın yapılandırmasını kullanır.

Bir önkabul olarak yapılandırma dosyasında rastlanan ilk sanal konak öntanımlı sanal konaktır. IP adresi bir sanal konakla eşleştiği takdirde ana sunucunun DocumentRoot değeri asla kullanılmayacaktır. Sanal konaklardan hiçbiriyle eşleşmeyen istekler için özel bir yapılandırmanız olsun isterseniz, bu yapılandırmayı yapılandırma dosyanızdaki ilk <VirtualHost> bölümüne yerleştirmeniz yetecektir.

Artık Tarihe Karışmış Tarayıcılarla Uyumluluk

Evvelce de bahsedildiği gibi, isme dayalı sanal konakların gerektiği gibi çalışması için gerekli veriyi göndermeyen bazı istemciler vardır. Bu istemcilere daima o IP adresinin yapılandırma dosyasındaki ilk sanal konağının (isme dayalı başat sanal konak) sayfaları gönderilir.

Ne kadar eski?

Lütfen dikkat edin, eski deyince gerçekten de antika demek istiyoruz. Günümüzde bu tür tarayıcılara rastlamanız neredeyse imkansızdır. Günümüz tarayıcılarının hepsi isme dayalı sanal konakların gerektirdiği Host başlığını gönderirler.

Olayı fazla germeden ServerPath yönergesini kullanarak sorunun çevresinden dolanmak mümkündür:

Örnek yapılandırma:

NameVirtualHost 111.22.33.44

<VirtualHost 111.22.33.44>
ServerName www.biralan.tld
ServerPath /biralan
DocumentRoot /siteler/biralan
 </VirtualHost>

Bu ne anlama geliyor? Anlamı, "/biralan" ile başlayan her URI isteği www.biralan.tld sanal konağı tarafından sunulacak, demektir. Yani, tüm istemcilerin http://www.biralan.tld/biralan/ olarak eriştiği yere Host: başlığı gönderen istemciler http://www.biralan.tld/ olarak erişirler.

Bunu gerçekleştirebilmek için başat sanal konağın baş sayfasına http://www.biralan.tld/biralan/ için bir bağ koyduktan sonra sanal konağın sayfalarında ya tamamen göreli bağlar ("dosya.html", "../simgeler/resim.png" gibi) veya /biralan/ ile öncelenmiş bağlar ("http://www.biralan.tld/biralan/muht/dosya.html" veya "/biralan/muht/dosya.html" gibi) kullanın.

Bu işlem biraz disiplin gerektirse de bu yazılanlara sıkı sıkıya bağlı kalarak hem eski hem de yeni tarayıcıların sayfalarınızı doğru görüntülemesini sağlamış olursunuz.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache’de IP’ye Dayalı Sanal Konak Desteği - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Sanal Konaklar

Apache’de IP’ye Dayalı Sanal Konak Desteği

Ayrıca bakınız:

  • İsme Dayalı Sanal Konak Desteği

IP'ye dayalı sanal konak desteği nedir

IP'ye dayalı sanal konak desteği, bir isteğin alındığı IP adresi ve porta bağlı olarak farklı yönergeleri uygulamak için bir yoldur. Özetle, farklı siteleri farklı portlardan ve arayüzlerden sunmakta kullanılır.

Çoğu durumda, isme dayalı sanal konaklar birçok sanal konağın tek bir IP adresi/port çiftini paylaşmasını sağladığından daha kullanışlıdır. Neyi kullanacağınıza karar vermek için İsme dayalı ve IP’ye dayalı Sanal Konaklar bölümüne bakınız.

Sistem gereksinimleri

IP’ye dayalı deyince, sunucunun her IP’ye dayalı sanal konak için ayrı bir IP adresi/port çiftine sahip olduğunu anlıyoruz. Bunun olması için, makine ya çok sayıda ağ bağlantısına sahiptir ya da makinede, günümüzde çoğu işletim sistemi tarafından desteklenen sanal arabirimler ve/veya çok sayıda port kullanılıyordur. (Sanal arabirimlerle ilgili ayrıntılar için sistem belgelerinize bakınız; bu konu genellikle çoklu port kullanımı ve/veya IP rumuzları (ip aliases) olarak geçer ve ayarlamak için genellikle "ifconfig" komutu kullanılır.)

Apache HTTP Sunucusu terminolojisinde, tek bir IP adresinin çok sayıda TCP portuyla kullanımı IP'ye dayalı sanal konak desteği olarak bilinir.

Apache nasıl ayarlanır?

Çok sayıda konağı desteklemek üzere Apache iki şekilde yapılandırılabilir. Ya her konak için ayrı bir httpd süreci çalıştırırsınız ya da tüm sanal konakları destekleyen tek bir süreciniz olur.

Çok sayıda süreç kullanıyorsanız:

  • Güvenli bölgeler oluşturmanız gerekiyordur. Örneğin, şirket2’deki hiç kimse dosya sistemi üzerinden şirket1’e ait verileri okuyamasın, sadece herkes gibi tarayıcı kullanarak okuyabilsin istenebilir. Bu durumda, User, Group, Listen ve ServerRoot yönergeleri farklı değerlerle yapılandırılmış iki ayrı süreç çalıştırmanız gerekir.
  • Makine üzerindeki her IP adresini dinlemek için gereken dosya tanıtıcı ve bellek miktarını makul bir seviyede tutabilirsiniz. Bu sadece belli adresleri dinleyerek veya çok sayıda adresle eşleşen adres kalıpları kullanarak mümükün olabilir. Zaten, bir sebeple belli bir adresi dinleme ihtiyacı duyarsanız, diğer tüm adresleri de ayrı ayrı dinlemeniz gerekir. (Bir httpd programı N-1 adresi dinlerken diğerleri kalan adresleri dinleyebilir.)

Tek bir süreç kullanıyorsanız:

  • httpd yapılandırmasının sanal konaklar arasında paylaşılmasına izin veriliyor demektir.
  • Makine çok büyük miktarda isteği karşılayabilir ve ayrı ayrı süreçlerin çalışmasından kaynaklanan önemli başarım kayıpları yaşanmaz.

Çok sayıda sürecin yapılandırılması

Her sanal konak için ayrı bir httpd yapılandırması oluşturulur. Her yapılandırmada, o süreç tarafından sunulacak IP adresi (veya sanal konak) için Listen yönergesi kullanılır. Örnek:

Listen 192.168.0.1:80

Burada konak ismi yerine IP adresi kullanmanız önerilir (ayrıntılar için DNS ile ilgili konular belgesine bakınız).

Sanal konaklarla tek bir sürecin yapılandırılması

Bu durum için, ana sunucu ve sanal konakların tümüne gelen istekler tek bir httpd süreci tarafından karşılanır. Yapılandırma dosyasında, her sanal konak için, farklı değerlere sahip ServerAdmin, ServerName, DocumentRoot, ErrorLogveTransferLog veya CustomLog yönergeleri içeren ayrı birer VirtualHost bölümü oluşturulur. Örnek:

<VirtualHost 192.168.0.1:80> ServerAdmin bilgi@posta.birkobi.example.com
DocumentRoot /gruplar/birkobi/belgeler
ServerName birkobi.example.com
ErrorLog /gruplar/birkobi/günlükler/hatalar.log
TransferLog /gruplar/birkobi/günlükler/erisim.log </VirtualHost>

<VirtualHost 192.168.0.2:80> ServerAdmin bilgi@posta.digerkobi.example.com
DocumentRoot /gruplar/digerkobi/belgeler
ServerName digerkobi.example.com
ErrorLog /gruplar/digerkobi/günlükler/hatalar.log
TransferLog /gruplar/digerkobi/günlükler/erisim.log </VirtualHost>

<VirtualHost> yönergelerinde konak isimlerinin yerlerine IP adreslerini kullanmanız önerilir (ayrıntılar için DNS ile ilgili konular belgesine bakınız).

Belli bir IP adresi veya port kullanımı bunların joker eşdeğerlerine göre daha yüksek öncelik sağlar ve eşleşen bir sanal konak da genel sunucuya göre öncelik alır.

Süreç oluşturmayı denetleyen yönergeler ve bir kaç başka yönerge dışında hemen hemen tüm yapılandırma yönergeleri VirtualHost bölümleri içinde kullanılabilir. Bir yönergenin VirtualHost bölümlerinde kullanılıp kullanılmayacağını öğrenmek için yönerge dizinini kullanarak yönergenin Bağlam’ına bakınız.

suEXEC sarmalayıcısı kullanıldığı takdirde SuexecUserGroup yönergesi de bir VirtualHost bölümü içinde kullanılabilir.

GÜVENLİK:Günlük dosyalarının yazılacağı yeri belirlerken, Apache’yi başlatan kullanıcıdan başka kimsenin yazamayacağı bir yerin seçilmesi bazı güvenlik risklerini ortadan kaldırmak bakımından önemlidir. Ayrıntılar için güvenlik ipuçları belgesine bakınız.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Devingen olarak Yapılandırılan Kitlesel Sanal Barındırma - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Sanal Konaklar

Devingen olarak Yapılandırılan Kitlesel Sanal Barındırma

Bu belgede sanal konakların sonu belirsiz bir şekilde artışı karşısında Apache httpd sunucusunun nasıl daha verimli kullanılacağı açıklanmıştır.

Amaç

Burada açıklanan teknikler, httpd.conf dosyanızın örnekteki gibi, aslında hemen hemen birbirinin aynı çok sayıda <VirtualHost> bölümü içereceği zaman yapılacaklar ile ilgilidir.

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
ServerName musteri-1.dom
DocumentRoot /siteler/musteri-1.dom/belgeler
ScriptAlias /cgi-bin/ /siteler/musteri-1.dom/cgi-bin
 </VirtualHost>
<VirtualHost 111.22.33.44>
ServerName musteri-2.dom
DocumentRoot /siteler/musteri-2.dom/belgeler
ScriptAlias /cgi-bin/ /siteler/musteri-2.dom/cgi-bin
 </VirtualHost>
# blah blah blah
<VirtualHost 111.22.33.44>
ServerName musteri-N.dom
DocumentRoot /siteler/musteri-N.dom/belgeler
ScriptAlias /cgi-bin/ /siteler/musteri-N.dom/cgi-bin
 </VirtualHost>

Ana fikir, tüm durağan <VirtualHost> yapılandırmalarını devingen olarak çalışan tek bir <VirtualHost> bölümüyle değiştirmektir. Bunun elbette bazı getirileri olacaktır:

  1. Yapılandırma dosyanız küçüleceği için Apache daha çabuk başlatılabilecek ve daha az bellek harcayacaktır.
  2. Yeni sanal konakların eklenmesi, DNS’de yeni girdiler oluşturmak ve dosya sisteminde bununla ilgili dizinleri açmak dışında biraz daha basit olacaktır; en azından Apache’yi yeniden yapılandırmak ve yeniden başlatmak zorunda kalmayacaksınız.

Ana götürüsü ise her sanal konak için ayrı birer günlük dosyasına sahip olamayacak olmanızdır. Öte yandan, dosya tanıtıcılarının sınırlı olması nedeniyle bunu yapmayı zaten istemezsiniz. Günlük kayıtları için bir fifo veya bir boru hattı oluşturmak ve diğer uçta çalışan bir süreç vasıtasıyla günlükleri müşterilere paylaştırmak daha iyidir (ayrıca, bu, istatistikleri toplamanızı da kolaylaştırır).

Genel Bakış

Bir sanal konak iki bilgiye bakarak belirlenir: IP adresi ve HTTP isteğindeki Host: başlığının içeriği. Devingen sanal barındırma tekniği, isteği yerine getirmek için kullanılacak dosya yoluna bu bilgiyi kendiliğinden girmek esasına dayanır. Bu, Apache 2.0 ile mod_vhost_alias kullanarak oldukça kolay yapılabileceği gibi mod_rewrite da kullanılabilir. Bu modüllerin her ikisi de öntanımlı olarak devre dışıdır. Bu tekniği kullanmak isterseniz Apache’yi yeniden yapılandırıp derleyerek bu iki modülü etkin duruma getirmeniz gerekir.

Devingen sanal konağı normal bir sanal konak gibi göstermek için bazı şeyleri ’göstermelik’ olarak yapmak gerekir. Bunlardan en önemlisi, Apache tarafından göreli URL’lerden normal URL’leri ve benzerlerini üretmek için kullanılan sunucu ismidir. Sunucu ismi ServerName yönergesi ile yapılandırılır ve CGI’ler tarafından SERVER_NAME ortam değişkeni üzerinden kullanılır. Çalışma anındaki asıl değer UseCanonicalName yönergesi tarafından denetlenir. UseCanonicalName Off olduğunda sunucu ismi isteğin Host: başlık alanından elde edilir. UseCanonicalName DNS belirtilmişse, sunucu ismi, sanal konağın IP adresinden tersine DNS sorgusu yapılarak elde edilir. Birincisi isme dayalı sanal konaklar tarafından ikincisi ise IP’ye dayalı sanal konaklar tarafından kullanılır. Eğer Apache, istekte Host: başlığının olmayışı veya DNS sorgusunun başarısız olması sebebiyle sunucu ismini elde edemezse son çare olarak ServerName yönergesinde yazılı değeri kullanır.

‘Göstermelik’ yapılan şeylerden biri de DocumentRoot yönergesi ile yapılandırılan belge kök dizini olup CGI’ler tarafından DOCUMENT_ROOT ortam değişkeni üzerinden kullanılır. Normal yapılandırmada core modülü tarafından dosya isimlerini URI’lere eşlerken kullanılır. Fakat sunucu devingen sanal konakları kullanmak üzere yapılandırıldığında, eşleştirmeyi farklı yollardan yapan başka bir modül devreye girer (mod_vhost_alias veya mod_rewrite). DOCUMENT_ROOT ortam değişkenine değerini atamaktan sorumlu olan bu iki modülden biri kullanılmazsa CGI veya SSI belgeleri yanlış değerlerle üretilirler.

Basit Devingen Sanal Konaklar

Yukarıda Amaç bölümünde özetlenen sanal konak düzenlemesinin mod_vhost_alias kullanarak daha soysal bir tarzda gerçekleştirilmiş halini içeren httpd.conf bölümü aşağıdadır.

# sunucu ismini Host: başlığından elde edelim
UseCanonicalName Off

# Bu günlükleme biçiminde ilk alana bakarak
# sanal konak günlükleri ayrıştırılabilir
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon

# istekleri yerine getirmek için kullanılacak
# dosya isimlerine sunucu ismini ekleyelim
VirtualDocumentRoot /siteler/%0/belgeler
VirtualScriptAlias /siteler/%0/cgi-bin

Bu yapılandırmayı IP’ye dayalı sanal konaklar için kullanmak isterseniz UseCanonicalName Off yerine UseCanonicalName DNS yazmanız yeterlidir. Böylece dosya ismine eklenecek konak ismi sanal konağın IP adresinden türetilir.

Sanal Kişisel Sayfalar Sistemi

Bu sistem, yukarıdaki yapılandırmanın bir ISS’nin kişisel sayfalar sunucusuna uyarlanmasından başka bir şey değildir. Biraz daha karmaşık bir yapılandırma ile dosya isimlerine /home/kullanıcı/ dizinlerini ekleyebiliriz. Farklı olarak her sanal konak için bir tane değil hepsi için bir tane cgi-bin olacaktır.

# Son bölüm hariç yukarıdaki yapılandırma, burada...

# sunucu ismine eklenecek dosya isimlerini oluşturalım
VirtualDocumentRoot /siteler/%2/belgeler

# ortak cgi-bin dizini
ScriptAlias /cgi-bin/ /siteler/std-cgi/

mod_vhost_alias belgesinde daha karmaşık VirtualDocumentRoot örnekleri vardır.

Aynı Sunucuda Kişisel ve Kurumsal Sanal Konaklar

Daha karmaşık ayarlamalar yaparak Apache’inin normal <VirtualHost> bölümlerini farklı kitlesel sanal konak yapılandırmaları için kullanabilirsiniz. Örneğin, bireysel müşterileriniz için bir IP adresiniz, kurumsal müşterileriniz için de başka bir IP adresiniz olsun. Her biri için ayrı ayrı sanal konaklar ayarlamak yerine aşağıdaki gibi bir yapılandırma kullanabilirsiniz:

UseCanonicalName Off

LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon

<Directory /siteler/kurumsal>
Options FollowSymLinks
AllowOverride All
 </Directory>

<Directory /siteler/bireysel>
Options FollowSymLinks
AllowOverride None
 </Directory>

<VirtualHost 111.22.33.44>
ServerName kurumsal.iss.dom

CustomLog logs/access_log.kurumsal vcommon

VirtualDocumentRoot /siteler/kurumsal/%0/belgeler
VirtualScriptAlias /siteler/kurumsal/%0/cgi-bin
 </VirtualHost>

<VirtualHost 111.22.33.45>
ServerName bireysel.iss.dom

CustomLog logs/access_log.bireysel vcommon

VirtualDocumentRoot /siteler/bireysel/%0/belgeler
ScriptAlias /cgi-bin/ /siteler/std-cgi/
 </VirtualHost>

Bilginize

Eğer ilk <VirtualHost> bölümü bir ServerName yönergesi içermezse ilgili IP için ters DNS sorgusu yapılır. Eğer sorgudan elde edilen isim sunucunun ismi değilse bu istenmeyen duruma bir çözüm olarak bir bilgilendirme bölümü (ServerName isimsiz.iss.dom) eklenebilir.

IP’ye dayalı sanal konakları daha verimli kılmak

İlk örnekte IP’ye dayalı sanal konaklar için kullanılmak istenirse yapılandırmada neyin nasıl değiştirileceği belirtilmişti. Her istek için ayrı bir DNS sorgusu gerekeceğinden bu başarım düşmesine yol açar. DNS sorgusu ihtiyacını ortadan kaldırmak için, bir çözüm olarak dosya sistemi, konak isimleri yerine IP adreslerine göre düzenlenebilir. Günlük kayıtları da IP adreslerine göre ayrıştırılacak şekilde ayarlanabilir.

# Sunucu ismini IP adresinden ters DNS sorgusu ile elde edelim
UseCanonicalName DNS

# Günlük kayıtları IP adreslerine göre ayrıştırılabilsin
LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon

# dosya isimleri IP adreslerini içersin
VirtualDocumentRootIP /siteler/%0/belgeler
VirtualScriptAliasIP /siteler/%0/cgi-bin

mod_rewrite ile Kurumsal Müşteriler Sistemi

Buradaki httpd.conf bölümü de ilk örnekteki gibi elde edilmiştir. İlk yarı, bazı değişiklikler dışında yukarıdaki örneğe çok benzer. Bu değişiklikler yapılandırmanın mod_rewrite bölümünün düzgün çalışması ve geriye doğru uyumluluk için gereklidir. İkinci yarı, asıl işi yapan mod_rewrite yapılandırmasını içerir.

Biraz uzmanlık gerektiren bazı kısımlar var: Öntanımlı olarak mod_rewrite diğer (mod_alias, vs. gibi) URI dönüşüm modüllerinden önce çalışır. Dolayısıyla bu modülleri kullanmak isterseniz, mod_rewrite’ı bunlara izin verecek şekilde yapılandırmalısınız. Ayrıca her devingen sanal konağa eşdeğer bir ScriptAlias yapmak için de biraz büyü yapmak gerekir.

# Sunucu ismini Host: başlığınıdan alalım.
UseCanonicalName Off

# Günlük dosyasından bilgileri ayıklayabilelim.
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon

<Directory /siteler/hosts>
# ScriptAlias için yaptıklarımızla CGI betiklerini
# çalışmaya zorlayamayacağımızdan ExecCGI burada gerekli.
Options FollowSymLinks ExecCGI
 </Directory>

# İşin zor yanına geldik.

RewriteEngine On

# Host: başlığından elde edilen sunucu isminde harf
# büyüklükleri çeşitli olabilir. Hepsini küçük harf yapalım.
RewriteMap lowercase int:tolower

## önce normal belgelerle anlaşalım:
# Alias /icons/ çalışsın - diğer rumuzlar için yineleyelim
RewriteCond %{REQUEST_URI} !^/icons/
# CGI’ler de çalışsın.
RewriteCond %{REQUEST_URI} !^/cgi-bin/
# Biraz da büyü yapalım.
RewriteRule ^/(.*)$ /siteler/${lowercase:%{SERVER_NAME}}/belgeler/$1

## Artık CGI’lerle anlaşabiliriz. - Bir MIME türü isteyelim.
RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteRule ^/(.*)$ /siteler/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [T=application/x-httpd-cgi]

# Bu kadar!

mod_rewrite ile Kişisel Sayfalar Sistemi

Burada da ikinci örnekte yaptıklarımızı yapıyoruz.

RewriteEngine on

RewriteMap lowercase int:tolower

# CGI’ler çalışsın.
RewriteCond %{REQUEST_URI} !^/cgi-bin/

# konak ismi doğru mu bakalım yoksa RewriteRule çalışmaz.
RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.dom$

# URI’nin başına sanal konak ismini ekleyelim.
# [C], bunu bitirdikten sonra, sonraki rewrite ile devam et demek.
RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]

# Artık asıl dosya ismini oluşturabiliriz.
RewriteRule ^www\.([a-z-]+)\.isp\.dom/(.*) /home/$1/$2

# Ortak CGI dizinini tanımlayalım.
ScriptAlias /cgi-bin/ /siteler/std-cgi/

Sanal konaklar için ayrı bir yapılandırma dosyası kullanmak

Burada, sanal konak isimlerinden belge kök dizini elde ederken mod_rewrite modülünün daha gelişkin özelliklerinden yararlanarak isimleri ayrı bir dosyadan okutacağız. Bu, esnekliği artırır ama daha karmaşık bir yapılandırma gerekir.

Aşağıdaki içeriğe sahip bir vhost.mapdosyamız olsun:

musteri-1.dom /siteler/kurumsal/1
musteri-2.dom /siteler/kurumsal/2
# ...
musteri-N.dom /siteler/kurumsal/N

httpd.conf dosyamız da şunları içerecektir:

RewriteEngine on

RewriteMap lowercase int:tolower

# Eşlem dosyasını tanımlayalım
RewriteMap vhost txt:/siteler/conf/vhost.map

# Rumuzları yukarıdaki gibi halledelim.
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{REQUEST_URI} !^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
# Eşlemeyi dosyalar için de yapalım.
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/belgeler/$1

RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/cgi-bin/$1

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Sanal Konak Örnekleri - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Sanal Konaklar

Sanal Konak Örnekleri

Bu belgede sanal konaklar ile ilgili karşılaşılması olası tüm senaryolara yer verilmeye çalışılmıştır. Buradaki senaryolar, tek bir sunucu üzerinde isme dayalı veya IP’ye dayalı sanal konaklar aracılığıyla çok sayıda sitenin sunumu ile ilgilidir.

Tek bir IP ile çok sayıda isme dayalı site

Bu örnekte, makinenizin tek bir IP adresine sahip olduğunu ve bu makineye mesela.dom ve faraza.dom şeklinde (DNS A kayıtları sayesinde) farklı isimlerle erişilebildiğini varsayalım.

Bilginize

Apache sunucusu üzerinde sanal konakları yapılandırmakla bu konak isimleri için sihirli bir şekilde DNS kayıtlarının da oluşturulmasını sağlamış olmazsınız. Bu isimler için ilgili DNS kayıtlarında sizin IP adresinize çözümlenen A kayıtlarının olması gerekir, yoksa sitenize kimse erişemez. Sitelere erişimi yerel olarak denemek isterseniz, bu girdileri hosts dosyanıza yazabilirsiniz. Fakat bu sadece sizin makinenizde çalışır. Yerel ağınızdaki her makinenin hosts dosyasına bu girdileri yazarak yerel ağdan erişimi bu yolla sağlayabilirsiniz ama dış ağdan gelecek ziyaretçileriniz için DNS kayıtlarınızın olması şarttır.

Sunucu yapılandırması

# Apache’nin 80. portu dinlediğinden emin olalım
Listen 80

# Sanal konak istekleri için bütün IP adresleri dinlensin.
NameVirtualHost *:80

<VirtualHost *:80>
DocumentRoot /siteler/mesela
ServerName mesela.dom

# Diğer yönergeler, burada ...

 </VirtualHost>

<VirtualHost *:80>
DocumentRoot /siteler/faraza
ServerName faraza.dom

# Diğer yönergeler, burada ...

 </VirtualHost>

Yıldız imleri tüm adreslerle eşleşmeyi sağladığından ana sunucu (yapılandırma dosyası genelindeki yapılandırma - sunucu geneli) erişilebilir olmayacaktır. mesela.dom yapılandırma dosyasındaki ilk sanal konak olduğundan en yüksek önceliğe sahiptir ve öntanımlı veya baskın site olarak davranır. Yani, hiçbir ServerName yönergesi ile eşleşmeyen bir istek alındığında bu istek ilk VirtualHost yapılandırması ile karşılanır.

Bilginize

İsterseniz, * yerine kendi IP adresinizi yazabilirsiniz. Ancak bu durumda bunu hem VirtualHost hem de NameVirtualHost için yapmalısınız:

NameVirtualHost 192.168.1.22

<VirtualHost 192.168.1.22>
# vs. ...

Bununla birlikte, IP adresinin önceden kestirilebilir olmadığı sistemlerde, örneğin, hizmet sağlayıcınıza çevirmeli ağ ile bağlanıyor ve onun rasgele atadığı bir IP adresi için bir devingen DNS çözümü kullanıyorsanız, IP adresi değil de * kullanmak daha çok işinize yarayacaktır. Yıldız imi her IP adresi ile eşleşeceğinden IP adresiniz değişse bile bu yapılandırmayı değiştirmeden kullanabilirsiniz.

Yukarıdaki yapılandırmayı hemen hemen tüm isme dayalı sanal konaklar için kullanabilirsiniz. Bu yapılandırmanın çalışmayacağı tek durum, farklı içerikleri farklı IP adreslerinden sunma gereğiyle karşılaşmaktır.

IP adresleri farklı çok sayıda isme dayalı site

Bilginize

Burada açıklanan teknikler istendiği kadar çok IP adresine genişletilebilir.

Sunucunun iki IP adresi olsun. Birinden "ana sunucu" (192.168.1.2) diğerinden mesela.dom 192.168.2.2 hizmet versin. Bu arada başka sanal konakları da sunabilelim istiyoruz.

Sunucu yapılandırması

Listen 80

# Bu, 192.168.1.2 adresindeki "ana sunucu" olsun
ServerName sunucu.faraza.dom
DocumentRoot /siteler/anasunucu

# Burası da diğer adres için
NameVirtualHost 192.168.2.2

<VirtualHost 192.168.2.2>
DocumentRoot /siteler/mesela
ServerName mesela.dom

# Diğer yönergeler, burada ...

 </VirtualHost>

<VirtualHost 192.168.2.2>
DocumentRoot /siteler/falanca
ServerName falanca.dom

# Diğer yönergeler, burada ...

 </VirtualHost>

192.168.2.2 adresinden gelmeyen tüm isteklere ana sunucu (sunucu.faraza.dom), 192.168.2.2 adresinden gelen sunucu ismi belirtmeyenler ile Host: başlığı belirtmeyenlere ise mesela.dom hizmet verecektir.

Aynı içeriği farklı IP adresleriyle sunmak (örn., dahili ve harici ağlara)

Sunucu makine iki IP adresine sahip olsun. Biri iç ağa (192.168.1.1) diğeri dış ağa (172.20.30.40) bakıyor olsun. sunucu.mesela.dom ismi dış ağda dış ağa bakan IP’ye, iç ağda ise iç ağa bakan IP’ye çözümleniyor olsun.

Bu durumda, sunucu hem iç hem de dış ağdan gelen isteklere aynı içerik, dolayısıyla aynı VirtualHost bölümü ile hizmet verebilir.

Sunucu yapılandırması

NameVirtualHost 192.168.1.1
NameVirtualHost 172.20.30.40

<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot /siteler/sunucu
ServerName sunucu.mesela.dom
ServerAlias sunucu
 </VirtualHost>

Artık, hem iç hem de dış ağdan gelen isteklere aynı VirtualHost bölümünden hizmet sunulacaktır.

Bilginize:

İç ağdan istek yapan biri, tam nitelenmiş konak ismi sunucu.mesela.dom yerine makine ismini (sunucu) kullanabilir (ServerAlias sunucu satırına dikkat).

Ayrıca, yukarıdaki gibi iki ayrı IP adresi belirtmek yerine sadece * belirtmekle sunucunun tüm IP adreslerine yine aynı içerikle yanıt vereceğine dikkat ediniz.

Farklı portlarla farklı siteler

Aynı IP adresine sahip çok sayıda konak ismine sahip olduğunuzu ve bunların bazılarının farklı portları kullanmasını istediğinizi varsayalım. NameVirtualHost yönergesi ile port tanımlamak suretiyle bunu mümkün kılabilirsiniz. NameVirtualHost isim:port tanımı yapmadan veya bunun yerine Listen kullanarak VirtualHost isim:port kullanmaya kalkışırsanız, yapılandırmanız çalışmayacaktır.

Sunucu yapılandırması

Listen 80
Listen 8080

NameVirtualHost 172.20.30.40:80
NameVirtualHost 172.20.30.40:8080

<VirtualHost 172.20.30.40:80>
ServerName mesela.dom
DocumentRoot /siteler/mesela-80
 </VirtualHost>

<VirtualHost 172.20.30.40:8080>
ServerName mesela.dom
DocumentRoot /siteler/mesela-8080
 </VirtualHost>

<VirtualHost 172.20.30.40:80>
ServerName faraza.dom
DocumentRoot /siteler/faraza-80
 </VirtualHost>

<VirtualHost 172.20.30.40:8080>
ServerName faraza.dom
DocumentRoot /siteler/faraza-8080
 </VirtualHost>

IP’ye dayalı sanal konaklar

Sunucu makinenin, biri mesela.dom adından çözümlenen 172.20.30.40, diğeri faraza.dom adından çözümlenen 172.20.30.50 diye iki IP adresi olsun.

Sunucu yapılandırması

Listen 80

<VirtualHost 172.20.30.40>
DocumentRoot /siteler/mesela
ServerName mesela.dom
 </VirtualHost>

<VirtualHost 172.20.30.50>
DocumentRoot /siteler/faraza
ServerName faraza.dom
 </VirtualHost>

<VirtualHost> yönergelerinde belirtilmeyen adreslerle yapılan isteklere (örneğin, localhost) sunucu genelindeki yapılandırma ile ana sunucu yanıt verecektir.

Hem IP’ye hem de porta dayalı sanal konaklar

Sunucu makinenin, biri mesela.dom adından çözümlenen 172.20.30.40, diğeri faraza.dom adından çözümlenen 172.20.30.50 diye iki IP adresi olsun ve iki konak da hem 80 hem de 8080 portlarında çalışsınlar istiyoruz.

Sunucu yapılandırması

Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080

<VirtualHost 172.20.30.40:80>
DocumentRoot /siteler/mesela-80
ServerName mesela.dom
 </VirtualHost>

<VirtualHost 172.20.30.40:8080>
DocumentRoot /siteler/mesela-8080
ServerName mesela.dom
 </VirtualHost>

<VirtualHost 172.20.30.50:80>
DocumentRoot /siteler/faraza-80
ServerName faraza.dom
 </VirtualHost>

<VirtualHost 172.20.30.50:8080>
DocumentRoot /siteler/faraza-8080
ServerName faraza.dom
 </VirtualHost>

Hem isme hem de IP‘ye dayalı sanal konaklar

Bazı adreslerde isme dayalı, bazılarında da IP’ye dayalı sanal konaklar çalışsın istersek...

Sunucu yapılandırması

Listen 80

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>
DocumentRoot /siteler/mesela
ServerName mesela.dom
 </VirtualHost>

<VirtualHost 172.20.30.40>
DocumentRoot /siteler/faraza
ServerName faraza.dom
 </VirtualHost>

<VirtualHost 172.20.30.40>
DocumentRoot /siteler/falanca
ServerName falanca.dom
 </VirtualHost>

# IP-based
<VirtualHost 172.20.30.50>
DocumentRoot /siteler/filanca
ServerName filanca.dom
 </VirtualHost>

<VirtualHost 172.20.30.60>
DocumentRoot /siteler/fesmekan
ServerName fesmekan.dom
 </VirtualHost>

Virtualhost ve mod_proxy’nin birlikte kullanımı

Bu örnekte bir arabirimi dışarıya bakan bir makinede, başka bir makinede çalışan bir sunucuya sanal konak olarak, bir vekil sunucu çalıştırmak istediğimizi varsayıyoruz. 192.168.111.2 IP adresli bir makinede aynı isimde bir sanal konak yapılandırılmış olsun. Çok sayıda konak ismi için vekil olarak tek bir makine kullandığımızdan ve konak isminin de aktarılmasını arzuladığımızdan ProxyPreserveHost On yönergesini kullandık.

<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass / http://192.168.111.2/
ProxyPassReverse / http://192.168.111.2/
ServerName konak.mesela.dom
 </VirtualHost>

_default_ sanal konakları

Tüm portlar için _default_

Bir IP adresi ve port belirtilmeyen veya hiçbir sanal konağın hiçbir adresi/portu ile eşleşmeyen istekleri yakalamak istersek...

Sunucu yapılandırması

<VirtualHost _default_:*>
DocumentRoot /siteler/default
 </VirtualHost>

Bütün portlarla eşleşen böyle bir öntanımlı sanal konağın kullanımı hiçbir isteğin ana sunucuya gitmemesi sonucunu doğurur.

Bir öntanımlı sanal konak, asla, isme dayalı sanal konaklar için kullanılmış bir adrese/porta gönderilmiş bir isteğe hizmet sunmaz. Eğer istek bilinmeyen bir Host: başlığına sahipse veya hiç Host: başlığı içermiyorsa isteğe daima ilk (yapılandırma dosyasındaki ilk) isme dayalı sanal konak hizmet sunar.

Her isteği tek bir bilgilendirme sayfasına (veya betiğe) yönlendirmek isterseniz AliasMatch veya RewriteRule yönergesini kullanabilirsiniz.

Farklı portlardan _default_

Önceki yapılandırmaya ek olarak 80. portta ayrı bir _default_ sanal konağı kullanmak istersek...

Sunucu yapılandırması

<VirtualHost _default_:80>
DocumentRoot /siteler/default80
# ...
 </VirtualHost>

<VirtualHost _default_:*>
DocumentRoot /siteler/default
# ...
 </VirtualHost>

80. porttan hizmet sunan _default_ sanal konağı IP adresi belirtilmeyen tüm istekleri yakalar, bunu yapabilmesi için yapılandırma dosyasında tüm portlara hizmet sunan benzerinden önce yer almalıdır. Bu durumda ana sunucu hiçbir isteğe yanıt vermeyecektir.

Tek portluk _default_

_default_ sanal konağının sadece 80. porttan hizmet sunmasını istersek...

Sunucu yapılandırması

<VirtualHost _default_:80>
DocumentRoot /siteler/default
...
</VirtualHost>

80. porttan gelen IP adresi belirtilmemiş isteklere _default_ sanal konağı, diğer portlardan gelen adres belirtilmemiş isteklere ise ana sunucu hizmet verecektir.

Bir isme dayalı sanal konağı bir IP’ye dayalı sanal konakla yansılamak

İsme dayalı sanal konak örneklerinin 2. sinde adı geçen falanca.dom bu örnekte kendi IP adresinden hizmet veriyor olsun. İsme dayalı sanal konağı eski IP adresiyle kaydetmiş vekiller ve isim sunucularından kaynaklanacak olası sorunlardan kaçınmak için yansılama sırasında sanal konağı hem eski hem de yeni IP adresiyle sunmamız lazım.

Çözüm kolay, çünkü yapacağımız sadece VirtualHost yönergesine yeni IP adresini (192.168.2.2) eklemek olacak.

Sunucu yapılandırması

Listen 80
ServerName mesela.dom
DocumentRoot /siteler/mesela

<VirtualHost 192.168.1.2>

<VirtualHost 192.168.1.2 192.168.2.2>
DocumentRoot /siteler/falanca
ServerName falanca.dom
# ...
 </VirtualHost>

<VirtualHost 192.168.1.2>
DocumentRoot /siteler/faraza
ServerName faraza.dom
ServerAlias *.faraza.dom
# ...
 </VirtualHost>

Böylece sanal konağa hem yeni (bir IP’ye dayalı sanal konak olarak) hem de eski adresinden (bir isme dayalı sanal konak olarak) erişilebilecektir.

ServerPath yönergesinin kullanımı

İsme dayalı iki sanal konağı olan bir sunucumuz olsun. Doğru sanal konağa erişebilmek için istemcinin doğru Host: başlığı göndermesi gerekir. Eski HTTP/1.0 istemcileri böyle bir başlık göndermedikleri için Apache istemcinin hangi sanal konağa erişmek istediğini bilemez (ve isteğe ilk sanal konaktan hizmet sunar). Daha iyi bir geriye uyumluluk sağlamak için isme dayalı sanal konağa bir önek bağlantısı içeren bir bilgilendirme sayfası sunmak üzere yeni bir sanal konak oluşturabiliriz.

Sunucu yapılandırması

NameVirtualHost 172.20.30.40

<VirtualHost 172.20.30.40>
# ilk sanal konak
DocumentRoot /siteler/baska
RewriteEngine On
RewriteRule ^/.* /siteler/baska/index.html
# ...
 </VirtualHost>

<VirtualHost 172.20.30.40>
DocumentRoot /siteler/baska/bir
ServerName bir.baska.tld
ServerPath /bir/
RewriteEngine On
RewriteRule ^(/bir/.*) /siteler/baska$1
# ...
 </VirtualHost>

<VirtualHost 172.20.30.40>
DocumentRoot /siteler/baska/iki
ServerName iki.baska.tld
ServerPath /iki/
RewriteEngine On
RewriteRule ^(/iki/.*) /siteler/baska$1
# ...
 </VirtualHost>

ServerPath yönergesinden dolayı http://bir.baska.tld/bir/ şeklinde yapılan isteklere daima “bir” sanal konağı hizmet sunacaktır.

http://bir.baska.tld/ şeklinde yapılan isteklere ise istemcinin doğru Host: başlığı göndermesi şartıyla “bir” sanal konağı hizmet sunacaktır. İstemci, bir Host: başlığı göndermediği takdirde ilk konaktan bir bilgilendirme sayfası alacaktır.

Yalnız buradaki bir tuhaflığa dikkat edin: Eğer istemci bir Host: başlığı göndermeden http://iki.baska.tld/bir/ şeklinde bir istek yaparsa bu isteğe de “bir” sanal konağı hizmet sunacaktır.

RewriteRule yönergesi, bir istemcinin, bir URL öneki belirtsin ya da belirtmesin doğru Host: başlığı gönderdiğinden emin olmak için kullanılmıştır.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Sanal Konak Eşlemenin Derinliğine İncelenmesi - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Sanal Konaklar

Sanal Konak Eşlemenin Derinliğine İncelenmesi

Sanal konak kodu Apache 1.3 sürümünde baştan yeniden yazıldı. Bu belgede, bir istek aldığında Apache’nin hangi sanal konak ile hizmet sunacağına nasıl karar verdiği açıklanmaya çalışılmıştır. NameVirtualHost yönergesi sayesinde sanal konak yapılandırması 1.3 sürümünün öncesine göre daha kolay ve daha güvenilir hale gelmiştir.

Sanal konakların nasıl çalıştığını öğrenmeden sadece çalıştırmak isterseniz doğrudan örneklerin bulunduğu sayfaya bakabilirsiniz.

Yapılandırma Dosyasının Çözümlenmesi

Bu belgede <VirtualHost> bölümleri dışında kalan tanımlardan bahsederken ana_sunucu, <VirtualHost> bölümlerindeki tanımlamalardan bahsederken sankonlar diyeceğiz.

ServerName ve ServerPath yönergeleri bir sunucu yapılandırmasının her yerinde karşımıza çıkabilir. Bununla birlikte, sunucu dahilinde son göründükleri yerlerde önceki eşdeğerlerini geçersiz kılarlar.

ServerPath ve ServerAlias yönergelerinin ana_sunucu için öntanımlı değerleri yoktur. Öntanımlı ServerName değeri ise sunucunun IP adresinden elde edilir.

VirtualHost yönergesinde belirtilen port numaraları Apache'nin dinleyeceği port numaraları olarak değerlendirilmez. Bunlar sadece, bir isteği işleme sokmak üzere seçilecek VirtualHost'lar arasında ayrım yapabilmek için kullanılır.

VirtualHost yönergesinde görünen her adresin seçimlik bir portu olabilir. Eğer bir port belirtilmemişse * belirtildiği varsayılır. Port olarak * belirtildiği takdirde bütün portlar dinlenir. Adreslerin tamamını (DNS sorgularındaki çoklu A kayıtları dahil) içeren kümeye sankonların adres kümesi denir.

NameVirtualHost yönergesi, VirtualHost yönergesindeki IP adresini ve portu aynen içermediği takdirde, Apache bu çiftle en iyi eşleşeni seçer. Eğer çok sayıda eşleşen varsa yapılandırma dosyasında ilk eşleşen VirtualHost seçilir.

Eğer Apache'nin istemci tarafından sağlanan HTTP Host başlığına dayanarak ayrım yapmasını istiyorsanız NameVirtualHost yönergesindeki IP adresi ve portun VirtualHost yönergesindeki ile tamamen eşleşmesi gerekir.

İsme dayalı sanal konak seçimi sadece tek bir IP'ye dayalı sanal konak seçildikten sonra ve bu sanal konaklar aynı IP-port çiftini taşıyorlarsa mümkün olabilir.

Bir sanal konak tanımında IP adresi yerine konak ismi de kullanılabilirse de çözümleme işlemi sunucu başlatılırken yapılacağından bu önerilmez.

Çok sayıda NameVirtualHost yönergesi belirtebilirse de her IP:port çifti için birden fazla NameVirtualHost yönergesi belirtilmemelidir.

Aşağıdaki iki örneğin eşdeğer olması için NameVirtualHost ve VirtualHost yönergelerinin sıralamasının bir önemi yoktur. (Sadece tek adreslik küme içindeki VirtualHost yönergelerinin sırası önemlidir; aşağıya bakınız:)

NameVirtualHost 111.22.33.44
<VirtualHost 111.22.33.44>
# sunucu A
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# sunucu B
...
</VirtualHost>

NameVirtualHost 111.22.33.55
<VirtualHost 111.22.33.55>
# sunucu C
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# sunucu D
...
</VirtualHost>

<VirtualHost 111.22.33.44>
# sunucu A
</VirtualHost>
<VirtualHost 111.22.33.55>
# sunucu C
...
</VirtualHost>
<VirtualHost 111.22.33.44>
# sunucu B
...
</VirtualHost>
<VirtualHost 111.22.33.55>
# sunucu D
...
</VirtualHost>

NameVirtualHost 111.22.33.44
NameVirtualHost 111.22.33.55

(Okuma kolaylığı bakımından soldaki sürümü tercih etmenizi öneririz.)

İsim listeleri IP adreslerine göre gruplanır ve bir çiftler tablosuna kaydedilir. Eğer IP adresi bir NameVirtualHost yönergesinde kullanılmışsa, liste bu IP adresi için tanımlanmış tüm sankonları içerir. Eğer bu IP adresinin tanımlandığı bir sankon yoksa o NameVirtualHost yönergesi yoksayılır ve günlüğe bir hata kaydı düşülür. IP’ye dayalı sankonlar için çiftler listesinde isim alanları boştur.

Çiftler listesini işleyen işlevin hızı nedeniyle bir istek sırasında IP adresine göre gruplama yaparken kaynak harcaması en düşük düzeyde olur hatta neredeyse hiç olmaz. Ek olarak, tablo, IP adresinin son sekizlisindeki değişikliklere göre de en iyilenir.

Her sankon için bazı değerler öntanımlı olarak atanır. Bunların başlıcaları:

  1. Sankon bir ServerAdmin yönergesi içermiyorsa, Timeout, KeepAliveTimeout, KeepAlive, MaxKeepAliveRequests, ReceiveBufferSize ve SendBufferSize yönergeleri için öntanımlı değerler ana_sunucudaki eşdeğerlerinden miras alınır. (Yani, bu yönergeler için ana_sunucudaki son değerler miras alınır.)
  2. Sankon için öntanımlı dizin erişim izinlerinin tanımlandığı "arama öntanımlıları" ana_sunucununkilere katılır. Buna her modülün dizinlere özgü yapılandırma bilgileri dahildir.
  3. Her modülün ana_sunucudaki sunuculara özgü yapılandırmaları sankon sunucusununkilerle katıştırılır.

Esasen, ana_sunucu, sankon sunucularını oluştururken bir öntanımlılar listesi veya öntanımlı değerlere dayanak noktası olarak ele alınır. Fakat bu ana_sunucu tanımlarının yapılandırma dosyasındaki yerlerinin saptanmasının konumuzla ilgisi yoktur; ana_sunucu yapılandırmasının tamamı son katıştırma yapılacağı zaman çözümlenir. Bu bakımdan, ana_sunucu tanımlarından bir kısmı sankon tanımlarından sonra yer alsa bile sankon tanımlarında etkili olabilir.

Eğer, bu noktada ana_sunucu hiçbir ServerName satırı içermiyorsa httpd programının çalıştığı makinenin konak ismi öntanımlıdır. Ana_sunucunun ServerName için yaptığı DNS sorgusundan dönen IP adreslerine ana_sunucu adres kümesi diyoruz.

Tanımsız ServerName alanları için bir isme dayalı sankon, sankonu tanımlayan VirtualHost yönergesinde belirtilen ilk adresi öntanımlı değer kabul eder.

Sihirli _default_ sankonları için ana_sunucunun ServerName değeri kullanılır.

Sanal Konağın Belirlenmesi

Sunucu bir istek durumunda hangi sankonun kullanılacağını şöyle belirler:

Değer çiftleri tablosu aranır

Bir istemci tarafından bağlantı ilk yapıldığında önce IP-isim çiftleri tablosunda istemcinin bağlandığı IP adresi için bir arama yapılır.

Arama başarısız olursa (IP adresi yoksa) hizmet, istekte belirtilen port için bir _default_ sankon varsa, o sankondan, yoksa ana_sunucudan sunulur.

Eğer çiftler tablosunda IP adresi yoksa port numarası ile eşleştirme çabası ayrıca, diğer isme dayalı sanal konaklardaki gibi ard arda ele alınmayı gerektiren NameVirtualHost * durumundaki bir girdiyle sonuçlanabilir.

Arama sonucunda tabloda IP adresi bulunursa sonraki adım hizmetin bir IP’ye dayalı sankondan mı yoksa isme dayalı bir sankondan mı sunulacağına karar vermektir.

IP’ye dayalı sankon

Eğer tabloda bulduğumuz girdinin isim alanları boşsa bir IP’ye dayalı sanal konak bulmuşuz demektir. Artık karar vermek için başka bir şey yapmaya gerek yoktur ve istek bu sankondan sunulur.

İsme dayalı sankon

Tabloda bulduğumuz girdi için bir isim listesi varsa bir isme dayalı sankon sözkonusudur. Bu isim listesi, sankonları, ilgili VirtualHost bölümlerinin yapılandırma dosyasında yer alış sırasına göre içerir.

Bu listedeki ilk sankon (yapılandırma dosyasında belirtilen IP adresine sahip ilk sankon) en yüksek önceliğe sahiptir ve sunucu ismi belirtilmeyen veya Host: başlık alanı olmayan istekleri bu sankon karşılar.

Eğer istemci bir Host: başlık alanı ile istek yapmışsa liste bu sankon için aranır ve hizmet ServerName veya ServerAlias ile ilk eşleşmenin sağlandığı sankondan sunulur. Host: alanında bir port belirtilebilirse de Apache daima istemcinin isteği gönderdiği portu gerçek port kabul eder.

VirtualHost içindeki isimlerin tamamı (jokersiz) bir ServerAlias gibi ele alınır (fakat başka bir ServerAlias ile geçersiz kılınmazlar).

Eğer istemci Host: başlık alanı bulunmayan bir HTTP/1.0 isteği yapmışsa istemcinin hangi sankona bağlanmayı denediğini bilemeyiz ve istekteki URI ile mevcut ServerPath değerini eşleştirmeye çalışırız. Listedekilerden ilk eşleşen yola sahip sankondan hizmeti sunarız.

İstekle eşleşen bir sankon bulunamazsa IP listesinde istemcinin bağlandığı portla eşleşen ilk sankondan hizmeti sunarız.

Kalıcı bağlantılar

Yukarıda açıklanan IP araması belli bir TCP/IP oturumunda bir defaya mahsus yapıldığı halde bir kalıcı/KeepAlive bağlantı sırasında her istek için ayrı bir arama yapılır. Başka bir deyişle, bir istemci tek bir kalıcı bağlantı üzerinde farklı isme dayalı sankonlardan sayfa talebinde bulunabilir.

Mutlak URI

Eğer istekte belirtilen URI bir mutlak URI ise ve istek yapılan konak ismi ve port ana sunucuyla veya sankonlardan biriyle eşleşiyorsa, şema/konakadı/port öneki ayrılır ve elde edilen göreli URI ilgili sankondan veya ana sunucudan sunulur. Eğer bir eşleşme sağlanamazsa URI’ye dokunulmaz ve istek bir vekil isteği olarak ele alınır.

İzlenimler

  • Bir isme dayalı sankon asla bir IP’ye dayalı sankon ile (veya tersi) etkileşime girmez. IP’ye dayalı sankonlara sadece kendi adres kümesindeki bir IP adresi üzerinden erişilebilir, asla başka bir adresten erişilemez. Aynısı isme dayalı sankonlara da uygulanır; onlara sadece bir NameVirtualHost yönergesi ile tanımlanmış adres kümesindeki bir IP adresi üzerinden erişilebilir.
  • Bir IP’ye dayalı sankon için asla ServerAlias ve ServerPath değerine bakılmaz.
  • Yapılandırma dosyası içinde isme/IP’ye dayalı ve _default_ sankonlar ile NameVirtualHost yönergelerinin yer alış sırasının birbirlerine göre bir önemi yoktur. Sıralama sadece aynı IP adresine sahip isme dayalı sankonlar arasında önemlidir. Aynı adres kümesine mensup isme dayalı sankonlardan yapılandırma dosyasında ilk sırada yer alanı en yüksek önceliğe sahiptir.
  • Host: başlık alanı eşleştirme işlemi sırasında asla kullanılmaz. Apache istemcinin bağlantı kurduğu gerçek portu kullanır.
  • Değeri başka bir ServerPath yönergesinin değeri için önek olan bir ServerPath yönergesi yapılandırma dosyasında daha önce yer alıyorsa sonrakiyle eşleşme asla gerçekleşmez. (Bu belirsizliği giderecek bir Host: başlık alanının mümkün olmadığı varsayılır.)
  • Eğer tek bir IP adresine sahip IP’ye dayalı iki sankon varsa eşleşme daima yapılandırma dosyasında ilk yer alanla gerçekleşir. Böyle bir şey kasten yapılmaz. Sunucu böyle bir durumu saptadığında hata günlüğünde bir uyarı verecektir.
  • Bir _default_ sankon sadece istekle eşleşen bir IP adresi bulunamadığında port numarası eşleştiği takdirde isteğe hizmet sunabilir. Port düzeyinde eşleşmenin olabilmesi için isteğin geldiği port ile sankon için belirtilen port eşleşmelidir. Olası tüm portlarla eşleşmeyi sağlamak üzere yıldız imi (_default_:* şeklinde) kullanılabilir. Aynı şey NameVirtualHost * sankonlarına da uygulanır. Bunun, "en iyi eşleşme" kuralının bir uzantısı olarak bir basitleştirme oluşuna dikkat ediniz; belirgin ve tıpatıp bir eşleşme yıldız imine göre önceliklidir.
  • Ana_sunucunun bir isteğe hizmet sunabilmesi için istemcinin bağlandığı IP adresi ve port hiçbir yerde belirtilmemiş ve _default_ dahil hiçbir sankon ile eşleşme sağlanamamış olmalıdır. Başka bir deyişle, istemcinin bağlandığı port ile eşleşen bir _default_ sankon olmadıkça adres ve port belirtmeyen bir isteğe ana_sunucu yanıt verecektir.
  • Host: başlık alanı içermeyen veya hedefi bilinmeyen bir istek geldiği takdirde, eğer bu istemcinin bağlandığı adres ve port için (örneğin, NameVirtualHost ile) tanımlanmış bir isme dayalı sankon varsa bu isteğe ne ana_sunucu ne de bir _default_ sankon hizmet sunabilir.
  • VirtualHost yönergelerinde asla DNS isimleri belirtmemelisiniz. Aksi takdirde sunucuyu başlatma sırasında DNS sorgusu yapmaya zorlamış olursunuz. Listelenen tüm alanlar için DNS üzerinde tam denetime sahip değilseniz bu ayrıca bir güvenlik tehdidine yol açar. Bu konuda daha ayrıntılı bilgi edinmek için DNS ile ilgili konular ve Apache belgesine bakınız.
  • ServerName her sankon için ayrı ayrı belirlenmiş olmalıdır. Aksi takdirde her sankon için bir DNS sorgusu gerekir.

İpuçları

DNS konuları sayfasındaki ipuçlarına ilaveten burada da bazı ipuçları bulacaksınız:

  • Ana_sunucu tanımlarının hepsini VirtualHost tanımlarının öncesinde bitirin. Bu ayrıca yapılandırmanızın okunabilirliğini de arttırır; VirtualHost tanımlarının sonrasına sarkan yapılandırmaların katıştırılması işlemi tüm sanal konakları etkileyebilen tanımlar bakımından bir karışıklığa/belirsizliğe sebep olabilir.)
  • Birbirleriyle ilgili NameVirtualHost ve VirtualHost tanımlarını okunabilirliği arttırmak için gruplayın.
  • Değeri başka bir ServerPath için önek olan tanımlamalar yapmaktan kaçının. Bundan kaçınamıyorsanız, yolu uzun olanı yolu kısa olanın öncesine yerleştirin. Örneğin, "ServerPath /abc/def" önce "ServerPath /abc" sonra yer alsın.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Dosya Tanıtıcı Sınırları - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Sanal Konaklar

Dosya Tanıtıcı Sınırları

Çok büyük sayıda sanal konak kullanıyorsanız ve bunların her biri için ayrı günlük kayıtları tutuyorsanız, Apache dosya tanıtıcılarını tüketebilir. Apache tarafından, dahili olarak 10-20 dosya tanıtıcıya ek olarak her hata günlüğü için bir ve her diğer günlük kaydı için bir dosya tanıcı kullanılır. Unix işletim sisteminde dosya tanıtıcıların sayısı süreç başına 64 taneyle sınırlıdır ve gerekirse donanıma bağlı olarak arttırılabilir.

Apache gerektiğinde bu sınırı kendisi arttırmaya çalışırsa da bu her zaman mümkün olmaz. Şöyle ki:

  1. Sisteminiz setrlimit() sistem çağrısını sağlamıyordur.
  2. Sisteminizde setrlimit(RLIMIT_NOFILE) çağrısı hiçbir işe yaramıyordur (örneğin, Solaris 2.3).
  3. Dosya tanıtıcılarının sayısı donanıma bağlı olarak daha fazla arttırılamıyordur.
  4. Sisteminiz dosya tanıtıcı sayısını başka sınırlara bağlı kılmıştır: örneğin stdio akımları ile ilgili sınır, dosya tanıtıcı sayısının 256’nın altında ollmasını gerektiriyordur (Solaris 2).

Böyle sorunlar karşısında yapabilecekleriniz:

  • Ana günlük dosyaları hariç, <VirtualHost> bölümlerinde günlük dosyası belirtmeyerek günlük dosyası sayısını düşürürsünüz. (Bunun nasıl yapılacağını öğrenmek için Günlük kayıtlarının ayrıştırılması bölümüne bakınız.)
  • Sisteminizde serbest dosya tanıtıcı sayısı 1-2 civarına düşerse Apache’yi aşağıdaki gibi bir betikle yeniden çalıştırarak dosya tanıtıcı sayısını arttırabilirsiniz:

    #!/bin/sh
    ulimit -S -n 100
    exec httpd

Günlük kayıtlarının ayrıştırılması

Günlük dosyalarını çok sayıda sanal konak için ortak olarak kullanıyorsanız, sanal konaklar için istatistiksel çözümlemeler yapmak amacıyla sırası geldiğinde bunları ayrıştırabilirsiniz. Bu işlem aşağıda anlatıldığı gibi yapılabilir.

İlk iş olarak, sanal konak bilgilerini günlük girdilerine eklemeniz gerekir. Bu işlem, LogFormat yönergesi ve %v biçem değişkeni ile yapılabilir. Günlük girdisi biçem dizgesinin başına bunu ekleyiniz:

LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
CustomLog logs/multiple_vhost_log vhost

Bu yapılandırma ile her günlük kaydının başında sanal konağın ServerName yönergesine belirtilen ismi eklenir. (Günlük dosyalarınızın kişiselleştirilmesi ile ilgili daha fazla bilgi için mod_log_config belgesine bakınız.)

Günlük dosyanızdaki kayıtları bileşenlere göre gruplamak isterseniz split-logfile programını kullanabilirsiniz. Bu programı Apache dağıtımının support dizininde bulabilirsiniz.

Programı aşağıdaki gibi çalıştırın:

split-logfile < /logs/multiple_vhost_log

Bu programı sanal konaklar için tuttuğunuz günlük dosyasının ismini argüman olarak belirterek çalıştırdığınızda o dosyadaki kayıtlardan her sanal konak için ayrı bir günlük dosyası (konakadı.log) üretilir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache mod_rewrite - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Apache mod_rewrite

mod_rewrite gelen URL isteklerini düzenli ifade kurallarına dayanarak devingen olarak dönüştürmek için bir yöntem sağlar. Böylece keyfi URL'leri kendi URL yapınızla istediğiniz şekilde eşleştirmeniz mümkün olur.

Gerçekten esnek ve güçlü bir URL kurgulama mekanizması oluşturmak için sınısız sayıda kural ve her kural için de sınırsız sayıda koşul destekler. URL değişiklikleri çeşitli sınamalara bağlı olabilir: sunucu değişkenleri, HTTP başlıkları, ortam değişkenleri, zaman damgaları, çeşitli biçimlerde harici veritabanı sorguları. Ayrıca, harici birtakım uygulamalar da bu amaçla kullanılabilir.

Bu modül URL’lerin tamamında (path-info kısmı dahil), sunucu bağlamında (httpd.conf), sanal konaklar bağlamında (<VirtualHost> bölümleri), dizin bağlamında (.htaccess dosyaları ve <Directory> bölümleri) çalışır. Kurallara eklediğiniz seçeneklere bağlı olarak, yeniden yazılan URL sonuçta dahili işlemlerde, harici yönlendirmelerde ve hatta dahili vekalet işlemlerinde kullanılabilir.

mod_rewrite çok güçlü bir araç olduğundan oldukça karmaşık görünebilir. Bu belge mod_rewrite başvuru kılavuzunun tamamlayıcısı olup bu karmaşıklığı biraz hafifletmeyi amaçlar ve mod_rewrite ile elde edilebilen kullanışlı ve oldukça açıklamalı senaryo örnekleri içerir. Ayrıca, mod_rewrite'ı hangi durumlarda kullanmamanız gerektiğini ve bunun yerine standart Apache özelliklerinin kullanımını göstermeye, böylece gereksiz karmaşıklıktan sizi kurtarmayı amaçladık.

  • mod_rewrite ve düzenli ifadelere giriş
  • URL'lerin yeniden eşlenmesi ve yönlendirilmesi için mod_rewrite kullanımı
  • Erişim denetimi için mod_rewrite kullanımı
  • mod_rewrite ile devingen sanal konaklar
  • mod_rewrite ile devingen vekil kullanımı
  • RewriteMap kullanımı
  • Gelişkin teknikler ve püfler
  • mod_rewrite ne zaman kullanılMAZ
  • RewriteRule Seçenekleri
  • Teknik ayrıntılar

Ayrıca bakınız:

  • mod_rewrite Başvuru Kılavuzu
  • URL’lerin Dosya Sistemine Eşlenmesi
  • mod_rewrite wiki
  • Terimler

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_rewrite - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_rewrite

Description: | Provides a rule-based rewriting engine to rewrite requested URLs on the fly
Status: | Extension
Module Identifier: | rewrite_module
Source File: | mod_rewrite.c
Compatibility: | Available in Apache 1.3 and later

Summary

This module uses a rule-based rewriting engine (based on a regular-expression parser) to rewrite requested URLs on the fly. It supports an unlimited number of rules and an unlimited number of attached rule conditions for each rule, to provide a really flexible and powerful URL manipulation mechanism. The URL manipulations can depend on various tests, of server variables, environment variables, HTTP headers, or time stamps. Even external database lookups in various formats can be used to achieve highly granular URL matching.

This module operates on the full URLs (including the path-info part) both in per-server context (httpd.conf) and per-directory context (.htaccess) and can generate query-string parts on result. The rewritten result can lead to internal sub-processing, external request redirection or even to an internal proxy throughput.

Further details, discussion, and examples, are provided in the detailed mod_rewrite documentation.

See also

  • Rewrite Flags

Quoting Special Characters

As of Apache 1.3.20, special characters in TestString and Substitution strings can be escaped (that is, treated as normal characters without their usual special meaning) by prefixing them with a backslash ('\') character. In other words, you can include an actual dollar-sign character in a Substitution string by using '\$'; this keeps mod_rewrite from trying to treat it as a backreference.

Environment Variables

This module keeps track of two additional (non-standard) CGI/SSI environment variables named SCRIPT_URL and SCRIPT_URI. These contain the logical Web-view to the current resource, while the standard CGI/SSI variables SCRIPT_NAME and SCRIPT_FILENAME contain the physical System-view.

Notice: These variables hold the URI/URL as they were initially requested, that is, before any rewriting. This is important to note because the rewriting process is primarily used to rewrite logical URLs to physical pathnames.

Example

SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
SCRIPT_FILENAME=/u/rse/.www/index.html
SCRIPT_URL=/u/rse/
SCRIPT_URI=http://en1.engelschall.com/u/rse/

Rewriting in Virtual Hosts

By default, mod_rewrite configuration settings from the main server context are not inherited by virtual hosts. To make the main server settings apply to virtual hosts, you must place the following directives in each <VirtualHost> section:

RewriteEngine On
RewriteOptions Inherit

Practical Solutions

For numerous examples of common, and not-so-common, uses for mod_rewrite, see the extended rewrite documentation.

RewriteBase Directive

Description: | Sets the base URL for per-directory rewrites
Syntax: | RewriteBase URL-path
Default: | None
Context: | directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_rewrite

The RewriteBase directive specifies the URL prefix to be used for per-directory (htaccess) RewriteRule directives that substitute a relative path.

This directive is required when you use a relative path in a substitution in per-directory (htaccess) context unless either of the following conditions are true:

  • The original request, and the substitution, are underneath the DocumentRoot (as opposed to reachable by other means, such as Alias).
  • The filesystem path to the directory containing the RewriteRule, suffixed by the relative substitution is also valid as a URL path on the server (this is rare).

In the example below, RewriteBase is necessary to avoid rewriting to http://example.com/opt/myapp-1.2.3/welcome.html since the resource was not relative to the document root. This misconfiguration would normally cause the server to look for an "opt" directory under the document root.

DocumentRoot /var/www/example.com
Alias /myapp /opt/myapp-1.2.3
<Directory /opt/myapp-1.2.3>
RewriteEngine On
RewriteBase /myapp/
RewriteRule ^index\.html$  welcome.html
</Directory>

RewriteCond Directive

Description: | Defines a condition under which rewriting will take place
Syntax: | RewriteCond TestString CondPattern
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_rewrite

The RewriteCond directive defines a rule condition. One or more RewriteCond can precede a RewriteRule directive. The following rule is then only used if both the current state of the URI matches its pattern, and if these conditions are met.

TestString is a string which can contain the following expanded constructs in addition to plain text:

  • RewriteRule backreferences: These are backreferences of the form $N (0 <= N <= 9), which provide access to the grouped parts (in parentheses) of the pattern, from the RewriteRule which is subject to the current set of RewriteCond conditions..
  • RewriteCond backreferences: These are backreferences of the form %N (1 <= N <= 9), which provide access to the grouped parts (again, in parentheses) of the pattern, from the last matched RewriteCond in the current set of conditions.
  • RewriteMap expansions: These are expansions of the form ${mapname:key|default}. See the documentation for RewriteMap for more details.
  • Server-Variables: These are variables of the form %{ NAME_OF_VARIABLE } where NAME_OF_VARIABLE can be a string taken from the following list:
    HTTP headers: connection & request:
    HTTP_USER_AGENT
    HTTP_REFERER
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_ACCEPT
             REMOTE_ADDR
    REMOTE_HOST
    REMOTE_PORT
    REMOTE_USER
    REMOTE_IDENT
    REQUEST_METHOD
    SCRIPT_FILENAME
    PATH_INFO
    QUERY_STRING
    AUTH_TYPE
    server internals: date and time: specials:
    DOCUMENT_ROOT
    SERVER_ADMIN
    SERVER_NAME
    SERVER_ADDR
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE
             TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME
             API_VERSION
    THE_REQUEST
    REQUEST_URI
    REQUEST_FILENAME
    IS_SUBREQ
    HTTPS

    These variables all correspond to the similarly named HTTP MIME-headers, C variables of the Apache server or struct tm fields of the Unix system. Most are documented elsewhere in the Manual or in the CGI specification.

    SERVER_NAME and SERVER_PORT depend on the values of UseCanonicalName and UseCanonicalPhysicalPort respectively.

    Those that are special to mod_rewrite include those below.

    IS_SUBREQ
    Will contain the text "true" if the request currently being processed is a sub-request, "false" otherwise. Sub-requests may be generated by modules that need to resolve additional files or URIs in order to complete their tasks.
    API_VERSION
    This is the version of the Apache module API (the internal interface between server and module) in the current httpd build, as defined in include/ap_mmn.h. The module API version corresponds to the version of Apache in use (in the release version of Apache 1.3.14, for instance, it is 19990320:10), but is mainly of interest to module authors.
    THE_REQUEST
    The full HTTP request line sent by the browser to the server (e.g., "GET /index.html HTTP/1.1"). This does not include any additional headers sent by the browser. This value has not been unescaped (decoded), unlike most other variables below.
    REQUEST_URI
    The path component of the requested URI, such as "/index.html". This notably excludes the query string which is available as as its own variable named QUERY_STRING.
    REQUEST_FILENAME
    The full local filesystem path to the file or script matching the request, if this has already been determined by the server at the time REQUEST_FILENAME is referenced. Otherwise, such as when used in virtual host context, the same value as REQUEST_URI.
    HTTPS
    Will contain the text "on" if the connection is using SSL/TLS, or "off" otherwise. (This variable can be safely used regardless of whether or not mod_ssl is loaded).

Other things you should be aware of:

  1. The variables SCRIPT_FILENAME and REQUEST_FILENAME contain the same value - the value of the filename field of the internal request_rec structure of the Apache server. The first name is the commonly known CGI variable name while the second is the appropriate counterpart of REQUEST_URI (which contains the value of the uri field of request_rec).

    If a substitution occurred and the rewriting continues, the value of both variables will be updated accordingly.

    If used in per-server context (i.e., before the request is mapped to the filesystem) SCRIPT_FILENAME and REQUEST_FILENAME cannot contain the full local filesystem path since the path is unknown at this stage of processing. Both variables will initially contain the value of REQUEST_URI in that case. In order to obtain the full local filesystem path of the request in per-server context, use an URL-based look-ahead %{LA-U:REQUEST_FILENAME} to determine the final value of REQUEST_FILENAME.

  2. %{ENV:variable}, where variable can be any environment variable, is also available. This is looked-up via internal Apache structures and (if not found there) via getenv() from the Apache server process.
  3. %{SSL:variable}, where variable is the name of an SSL environment variable, can be used whether or not mod_ssl is loaded, but will always expand to the empty string if it is not. Example: %{SSL:SSL_CIPHER_USEKEYSIZE} may expand to 128.
  4. %{HTTP:header}, where header can be any HTTP MIME-header name, can always be used to obtain the value of a header sent in the HTTP request. Example: %{HTTP:Proxy-Connection} is the value of the HTTP header ``Proxy-Connection:''.

    If a HTTP header is used in a condition this header is added to the Vary header of the response in case the condition evaluates to true for the request. It is not added if the condition evaluates to false for the request. Adding the HTTP header to the Vary header of the response is needed for proper caching.

    It has to be kept in mind that conditions follow a short circuit logic in the case of the 'ornext|OR' flag so that certain conditions might not be evaluated at all.

  5. %{LA-U:variable} can be used for look-aheads which perform an internal (URL-based) sub-request to determine the final value of variable. This can be used to access variable for rewriting which is not available at the current stage, but will be set in a later phase.

    For instance, to rewrite according to the REMOTE_USER variable from within the per-server context (httpd.conf file) you must use %{LA-U:REMOTE_USER} - this variable is set by the authorization phases, which come after the URL translation phase (during which mod_rewrite operates).

    On the other hand, because mod_rewrite implements its per-directory context (.htaccess file) via the Fixup phase of the API and because the authorization phases come before this phase, you just can use %{REMOTE_USER} in that context.

  6. %{LA-F:variable} can be used to perform an internal (filename-based) sub-request, to determine the final value of variable. Most of the time, this is the same as LA-U above.

CondPattern is the condition pattern, a regular expression which is applied to the current instance of the TestString. TestString is first evaluated, before being matched against CondPattern.

Remember: CondPattern is a perl compatible regular expression with some additions:

  1. You can prefix the pattern string with a '!' character (exclamation mark) to specify a non-matching pattern.
  2. There are some special variants of CondPatterns. Instead of real regular expression strings you can also use one of the following:
    • '<CondPattern' (lexicographically precedes)
      Treats the CondPattern as a plain string and compares it lexicographically to TestString. True if TestString lexicographically precedes CondPattern.
    • '>CondPattern' (lexicographically follows)
      Treats the CondPattern as a plain string and compares it lexicographically to TestString. True if TestString lexicographically follows CondPattern.
    • '=CondPattern' (lexicographically equal)
      Treats the CondPattern as a plain string and compares it lexicographically to TestString. True if TestString is lexicographically equal to CondPattern (the two strings are exactly equal, character for character). If CondPattern is "" (two quotation marks) this compares TestString to the empty string.
    • '-d' (is directory)
      Treats the TestString as a pathname and tests whether or not it exists, and is a directory.
    • '-f' (is regular file)
      Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.
    • '-s' (is regular file, with size)
      Treats the TestString as a pathname and tests whether or not it exists, and is a regular file with size greater than zero.
    • '-l' (is symbolic link)
      Treats the TestString as a pathname and tests whether or not it exists, and is a symbolic link.
    • '-x' (has executable permissions)
      Treats the TestString as a pathname and tests whether or not it exists, and has executable permissions. These permissions are determined according to the underlying OS.
    • '-F' (is existing file, via subrequest)
      Checks whether or not TestString is a valid file, accessible via all the server's currently-configured access controls for that path. This uses an internal subrequest to do the check, so use it with care - it can impact your server's performance!

    • '-U' (is existing URL, via subrequest)
      Checks whether or not TestString is a valid URL, accessible via all the server's currently-configured access controls for that path. This uses an internal subrequest to do the check, so use it with care - it can impact your server's performance!

      This flag only returns information about things like access control, authentication, and authorization. This flag does not return information about the status code the configured handler (static file, CGI, proxy, etc.) would have returned.

    Note:

    All of these tests can also be prefixed by an exclamation mark ('!') to negate their meaning.
  3. You can also set special flags for CondPattern by appending [flags] as the third argument to the RewriteCond directive, where flags is a comma-separated list of any of the following flags:
    • 'nocase|NC' (no case)
      This makes the test case-insensitive - differences between 'A-Z' and 'a-z' are ignored, both in the expanded TestString and the CondPattern. This flag is effective only for comparisons between TestString and CondPattern. It has no effect on filesystem and subrequest checks.
    • 'ornext|OR' (or next condition)
      Use this to combine rule conditions with a local OR instead of the implicit AND. Typical example:
      RewriteCond %{REMOTE_HOST}  =host1  [OR]
RewriteCond %{REMOTE_HOST}  =host2  [OR]
RewriteCond %{REMOTE_HOST}  =host3
RewriteRule ...some special stuff for any of these hosts...
      Without this flag you would have to write the condition/rule pair three times.
    • 'novary|NV' (no vary)
      If a HTTP header is used in the condition, this flag prevents this header from being added to the Vary header of the response.
      Using this flag might break proper caching of the response if the representation of this response varies on the value of this header. So this flag should be only used if the meaning of the Vary header is well understood.

Example:

To rewrite the Homepage of a site according to the ``User-Agent:'' header of the request, you can use the following:

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla
RewriteRule  ^/$                 /homepage.max.html  [L]

RewriteCond  %{HTTP_USER_AGENT}  ^Lynx
RewriteRule  ^/$                 /homepage.min.html  [L]

RewriteRule  ^/$                 /homepage.std.html  [L]

Explanation: If you use a browser which identifies itself as 'Mozilla' (including Netscape Navigator, Mozilla etc), then you get the max homepage (which could include frames, or other special features). If you use the Lynx browser (which is terminal-based), then you get the min homepage (which could be a version designed for easy, text-only browsing). If neither of these conditions apply (you use any other browser, or your browser identifies itself as something non-standard), you get the std (standard) homepage.

RewriteEngine Directive

Description: | Enables or disables runtime rewriting engine
Syntax: | RewriteEngine on|off
Default: | RewriteEngine off
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_rewrite

The RewriteEngine directive enables or disables the runtime rewriting engine. If it is set to off this module does no runtime processing at all. It does not even update the SCRIPT_URx environment variables.

Use this directive to disable the module instead of commenting out all the RewriteRule directives!

Note that rewrite configurations are not inherited by virtual hosts. This means that you need to have a RewriteEngine on directive for each virtual host in which you wish to use rewrite rules.

RewriteMap directives of the type prg are not started during server initialization if they're defined in a context that does not have RewriteEngine set to on

RewriteLock Directive

Description: | Sets the name of the lock file used for RewriteMap synchronization
Syntax: | RewriteLock file-path
Context: | server config
Status: | Extension
Module: | mod_rewrite

This directive sets the filename for a synchronization lockfile which mod_rewrite needs to communicate with RewriteMap programs. Set this lockfile to a local path (not on a NFS-mounted device) when you want to use a rewriting map-program. It is not required for other types of rewriting maps.

RewriteLog Directive

Description: | Sets the name of the file used for logging rewrite engine processing
Syntax: | RewriteLog file-path|pipe
Context: | server config, virtual host
Status: | Extension
Module: | mod_rewrite

The RewriteLog directive sets the name of the file to which the server logs any rewriting actions it performs. If the name does not begin with a slash ('/') then it is assumed to be relative to the Server Root. The directive should occur only once per server config.

To disable the logging of rewriting actions it is not recommended to set Filename to /dev/null, because although the rewriting engine does not then output to a logfile it still creates the logfile output internally. This will slow down the server with no advantage to the administrator! To disable logging either remove or comment out the RewriteLog directive or use RewriteLogLevel 0!

The RewriteLog log file format is as follows:

Description | Example
Remote host IP address | 192.168.200.166
Remote login name | Will usually be "-"
HTTP user auth name | Username, or "-" if no auth
Date and time of request | [28/Aug/2009:13:09:09 --0400]
Virtualhost and virtualhost ID | [www.example.com/sid#84a650]
Request ID, and whether it's a subrequest | [rid#9f0e58/subreq]
Log entry severity level | (2)
Text error message | forcing proxy-throughput with http://127.0.0.1:8080/index.html

Security

See the Apache Security Tips document for details on how your security could be compromised if the directory where logfiles are stored is writable by anyone other than the user that starts the server.

Example

# Log to a file:
RewriteLog "/usr/local/var/apache/logs/rewrite.log"

# Log to a pipe:
RewriteLog "|/path/to/parser.pl"

RewriteLogLevel Directive

Description: | Sets the verbosity of the log file used by the rewrite engine
Syntax: | RewriteLogLevel Level
Default: | RewriteLogLevel 0
Context: | server config, virtual host
Status: | Extension
Module: | mod_rewrite

The RewriteLogLevel directive sets the verbosity level of the rewriting logfile. The default level 0 means no logging, while 9 or more means that practically all actions are logged.

To disable the logging of rewriting actions simply set Level to 0. This disables all rewrite action logs.

Using a high value for Level will slow down your Apache server dramatically! Use the rewriting logfile at a Level greater than 2 only for debugging!

Example

RewriteLogLevel 3

RewriteMap Directive

Description: | Defines a mapping function for key-lookup
Syntax: | RewriteMap MapName MapType:MapSource
Context: | server config, virtual host
Status: | Extension
Module: | mod_rewrite
Compatibility: | The choice of different dbm types is available in Apache 2.0.41 and later

The RewriteMap directive defines a Rewriting Map which can be used inside rule substitution strings by the mapping-functions to insert/substitute fields through a key lookup. The source of this lookup can be of various types.

The MapName is the name of the map and will be used to specify a mapping-function for the substitution strings of a rewriting rule via one of the following constructs:

${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }

When such a construct occurs, the map MapName is consulted and the key LookupKey is looked-up. If the key is found, the map-function construct is substituted by SubstValue. If the key is not found then it is substituted by DefaultValue or by the empty string if no DefaultValue was specified. Empty values behave as if the key was absent, therefore it is not possible to distinguish between empty-valued keys and absent keys.

For example, you might define a RewriteMap as:

RewriteMap examplemap txt:/path/to/file/map.txt

You would then be able to use this map in a RewriteRule as follows:

RewriteRule ^/ex/(.*) ${examplemap:$1}

The following combinations for MapType and MapSource can be used:

  • Standard Plain Text
    MapType: txt, MapSource: Unix filesystem path to valid regular file

    This is the standard rewriting map feature where the MapSource is a plain ASCII file containing either blank lines, comment lines (starting with a '#' character) or pairs like the following - one per line.

    MatchingKey SubstValue

    Example

    ##
##  map.txt -- rewriting map
##

Ralf.S.Engelschall    rse   # Bastard Operator From Hell
Mr.Joe.Average        joe   # Mr. Average

    RewriteMap real-to-user txt:/path/to/file/map.txt

  • Randomized Plain Text
    MapType: rnd, MapSource: Unix filesystem path to valid regular file

    This is identical to the Standard Plain Text variant above but with a special post-processing feature: After looking up a value it is parsed according to contained ``|'' characters which have the meaning of ``or''. In other words they indicate a set of alternatives from which the actual returned value is chosen randomly. For example, you might use the following map file and directives to provide a random load balancing between several back-end servers, via a reverse-proxy. Images are sent to one of the servers in the 'static' pool, while everything else is sent to one of the 'dynamic' pool.

    Example:

    Rewrite map file

    ##
##  map.txt -- rewriting map
##

static   www1|www2|www3|www4
dynamic  www5|www6

    Configuration directives

    RewriteMap servers rnd:/path/to/file/map.txt

    RewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1 [NC,P,L]
    RewriteRule ^/(.*) http://${servers:dynamic}/$1 [P,L]

  • Hash File
    MapType: dbm[=type], MapSource: Unix filesystem path to valid regular file

    Here the source is a binary format DBM file containing the same contents as a Plain Text format file, but in a special representation which is optimized for really fast lookups. The type can be sdbm, gdbm, ndbm, or db depending on compile-time settings. If the type is omitted, the compile-time default will be chosen.

    To create a dbm file from a source text file, use the httxt2dbm utility.

    $ httxt2dbm -i mapfile.txt -o mapfile.map

  • Internal Function
    MapType: int, MapSource: Internal Apache function

    Here, the source is an internal Apache function. Module authors can provide additional internal functions by registering them with the ap_register_rewrite_mapfunc API. The functions that are provided by default are:

    • toupper:
      Converts the key to all upper case.
    • tolower:
      Converts the key to all lower case.
    • escape:
      Translates special characters in the key to hex-encodings.
    • unescape:
      Translates hex-encodings in the key back to special characters.
  • External Rewriting Program
    MapType: prg, MapSource: Unix filesystem path to valid regular file

    Here the source is a program, not a map file. To create it you can use a language of your choice, but the result has to be an executable program (either object-code or a script with the magic cookie trick '#!/path/to/interpreter' as the first line).

    This program is started once, when the Apache server is started, and then communicates with the rewriting engine via its stdin and stdout file-handles. For each map-function lookup it will receive the key to lookup as a newline-terminated string on stdin. It then has to give back the looked-up value as a newline-terminated string on stdout or the four-character string ``NULL'' if it fails (i.e., there is no corresponding value for the given key). A trivial program which will implement a 1:1 map (i.e., key == value) could be:

    External rewriting programs are not started if they're defined in a context that does not have RewriteEngine set to on

    .
    #!/usr/bin/perl
$| = 1;
while (<STDIN>) {
    # ...put here any transformations or lookups...
    print $_;
}

    But be very careful:

    1. ``Keep it simple, stupid'' (KISS). If this program hangs, it will cause Apache to hang when trying to use the relevant rewrite rule.
    2. A common mistake is to use buffered I/O on stdout. Avoid this, as it will cause a deadloop! ``$|=1'' is used above, to prevent this.
    3. The RewriteLock directive can be used to define a lockfile which mod_rewrite can use to synchronize communication with the mapping program. By default no such synchronization takes place.

The RewriteMap directive can occur more than once. For each mapping-function use one RewriteMap directive to declare its rewriting mapfile. While you cannot declare a map in per-directory context it is of course possible to use this map in per-directory context.

Note

For plain text and DBM format files the looked-up keys are cached in-core until the mtime of the mapfile changes or the server does a restart. This way you can have map-functions in rules which are used for every request. This is no problem, because the external lookup only happens once!

RewriteOptions Directive

Description: | Sets some special options for the rewrite engine
Syntax: | RewriteOptions Options
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_rewrite
Compatibility: | MaxRedirects is no longer available in version 2.1 and later

The RewriteOptions directive sets some special options for the current per-server or per-directory configuration. The Option string can currently only be one of the following:

inherit

This forces the current configuration to inherit the configuration of the parent. In per-virtual-server context, this means that the maps, conditions and rules of the main server are inherited. In per-directory context this means that conditions and rules of the parent directory's .htaccess configuration are inherited.

Rules inherited from the parent scope are applied after rules specified in the child scope.
AllowAnyURI

When RewriteRule is used in VirtualHost or server context with version 2.2.23 or later of httpd, mod_rewrite will only process the rewrite rules if the request URI is a URL-path. This avoids some security issues where particular rules could allow "surprising" pattern expansions (see CVE-2011-3368 and CVE-2011-4317). To lift the restriction on matching a URL-path, the AllowAnyURI option can be enabled, and mod_rewrite will apply the rule set to any request URI string, regardless of whether that string matches the URL-path grammar required by the HTTP specification.

Security Warning

Enabling this option will make the server vulnerable to security issues if used with rewrite rules which are not carefully authored. It is strongly recommended that this option is not used. In particular, beware of input strings containing the '@' character which could change the interpretation of the transformed URI, as per the above CVE names.

MergeBase

With this option, the value of RewriteBase is copied from where it's explicitly defined into any sub-directory or sub-location that doesn't define its own RewriteBase. Not copying was the default until 2.2.22. In version 2.2.23 copying was the default. The flag to explicitly control it is available for Apache HTTP Server 2.2.24 and later.

RewriteRule Directive

Description: | Defines rules for the rewriting engine
Syntax: | RewriteRule Pattern Substitution [flags]
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_rewrite

The RewriteRule directive is the real rewriting workhorse. The directive can occur more than once, with each instance defining a single rewrite rule. The order in which these rules are defined is important - this is the order in which they will be applied at run-time.

Pattern is a perl compatible regular expression. On the first RewriteRule it is applied to the (%-decoded) URL-path of the request; subsequent patterns are applied to the output of the last matched RewriteRule.

What is matched?

In VirtualHost context, The Pattern will initially be matched against the part of the URL after the hostname and port, and before the query string (e.g. "/app1/index.html").

In Directory and htaccess context, the Pattern will initially be matched against the filesystem path, after removing the prefix that led the server to the current RewriteRule (e.g. "app1/index.html" or "index.html" depending on where the directives are defined).

If you wish to match against the hostname, port, or query string, use a RewriteCond with the %{HTTP_HOST}, %{SERVER_PORT}, or %{QUERY_STRING} variables respectively.

Per-directory Rewrites

  • The rewrite engine may be used in .htaccess files and in <Directory> sections, with some additional complexity.
  • To enable the rewrite engine in this context, you need to set "RewriteEngine On" and "Options FollowSymLinks" must be enabled. If your administrator has disabled override of FollowSymLinks for a user's directory, then you cannot use the rewrite engine. This restriction is required for security reasons.
  • When using the rewrite engine in .htaccess files the per-directory prefix (which always is the same for a specific directory) is automatically removed for the RewriteRule pattern matching and automatically added after any relative (not starting with a slash or protocol name) substitution encounters the end of a rule set. See the RewriteBase directive for more information regarding what prefix will be added back to relative substitutions.
  • If you wish to match against the full URL-path in a per-directory (htaccess) RewriteRule, use the %{REQUEST_URI} variable in a RewriteCond.
  • The removed prefix always ends with a slash, meaning the matching occurs against a string which never has a leading slash. Therefore, a Pattern with ^/ never matches in per-directory context.
  • Although rewrite rules are syntactically permitted in <Location> and <Files> sections, this should never be necessary and is unsupported.

For some hints on regular expressions, see the mod_rewrite Introduction.

In mod_rewrite, the NOT character ('!') is also available as a possible pattern prefix. This enables you to negate a pattern; to say, for instance: ``if the current URL does NOT match this pattern''. This can be used for exceptional cases, where it is easier to match the negative pattern, or as a last default rule.

Note

When using the NOT character to negate a pattern, you cannot include grouped wildcard parts in that pattern. This is because, when the pattern does NOT match (ie, the negation matches), there are no contents for the groups. Thus, if negated patterns are used, you cannot use $N in the substitution string!

The Substitution of a rewrite rule is the string that replaces the original URL-path that was matched by Pattern. The Substitution may be a:

file-system path
Designates the location on the file-system of the resource to be delivered to the client. Substitutions are only treated as a file-system path when the rule is configured in server (virtualhost) context and the first component of the path in the substitution is exists in the file-system
URL-path
A DocumentRoot-relative path to the resource to be served. Note that mod_rewrite tries to guess whether you have specified a file-system path or a URL-path by checking to see if the first segment of the path exists at the root of the file-system. For example, if you specify a Substitution string of /www/file.html, then this will be treated as a URL-path unless a directory named www exists at the root or your file-system (or, in the case of using rewrites in a .htaccess file, relative to your document root), in which case it will be treated as a file-system path. If you wish other URL-mapping directives (such as Alias) to be applied to the resulting URL-path, use the [PT] flag as described below.
Absolute URL
If an absolute URL is specified, mod_rewrite checks to see whether the hostname matches the current host. If it does, the scheme and hostname are stripped out and the resulting path is treated as a URL-path. Otherwise, an external redirect is performed for the given URL. To force an external redirect back to the current host, see the [R] flag below.
- (dash)
A dash indicates that no substitution should be performed (the existing path is passed through untouched). This is used when a flag (see below) needs to be applied without changing the path.

In addition to plain text, the Substition string can include

  1. back-references ($N) to the RewriteRule pattern
  2. back-references (%N) to the last matched RewriteCond pattern
  3. server-variables as in rule condition test-strings (%{VARNAME})
  4. mapping-function calls (${mapname:key|default})

Back-references are identifiers of the form $N (N=0..9), which will be replaced by the contents of the Nth group of the matched Pattern. The server-variables are the same as for the TestString of a RewriteCond directive. The mapping-functions come from the RewriteMap directive and are explained there. These three types of variables are expanded in the order above.

Rewrite rules are a applied to the results of previous rewrite rules, in the order in which they are defined in the config file. The URL is completely replaced by the Substitution and the rewriting process continues until all rules have been applied, or it is explicitly terminated by a L flag, or other flag which implies immediate termination, such as END or F.

Modifying the Query String

By default, the query string is passed through unchanged. You can, however, create URLs in the substitution string containing a query string part. Simply use a question mark inside the substitution string to indicate that the following text should be re-injected into the query string. When you want to erase an existing query string, end the substitution string with just a question mark. To combine new and old query strings, use the [QSA] flag.

Additionally you can set special actions to be performed by appending [flags] as the third argument to the RewriteRule directive. Flags is a comma-separated list, surround by square brackets, of any of the flags in the following table. More details, and examples, for each flag, are available in the Rewrite Flags document.

Flag and syntax | Function
B | Escape non-alphanumeric characters before applying the transformation. details ...
chain|C | Rule is chained to the following rule. If the rule fails, the rule(s) chained to it will be skipped. details ...
cookie|CO=NAME:VAL | Sets a cookie in the client browser. Full syntax is: CO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly]]]] details ...
discardpath|DPI | Causes the PATH_INFO portion of the rewritten URI to be discarded. details ...
env|E=[!]VAR[:VAL] | Causes an environment variable VAR to be set (to the value VAL if provided). The form !VAR causes the environment variable VAR to be unset.details ...
forbidden|F | Returns a 403 FORBIDDEN response to the client browser. details ...
gone|G | Returns a 410 GONE response to the client browser. details ...
Handler|H=Content-handler | Causes the resulting URI to be sent to the specified Content-handler for processing. details ...
last|L | Stop the rewriting process immediately and don't apply any more rules. Especially note caveats for per-directory and .htaccess context (see also the END flag). details ...
next|N | Re-run the rewriting process, starting again with the first rule, using the result of the ruleset so far as a starting point. details ...
nocase|NC | Makes the pattern comparison case-insensitive. details ...
noescape|NE | Prevent mod_rewrite from applying hexcode escaping of special characters in the result of the rewrite. details ...
nosubreq|NS | Causes a rule to be skipped if the current request is an internal sub-request. details ...
proxy|P | Force the substitution URL to be internally sent as a proxy request. details ...
passthrough|PT | Forces the resulting URI to be passed back to the URL mapping engine for processing of other URI-to-filename translators, such as Alias or Redirect. details ...
qsappend|QSA | Appends any query string from the original request URL to any query string created in the rewrite target.details ...
redirect|R[=code] | Forces an external redirect, optionally with the specified HTTP status code. details ...
skip|S=num | Tells the rewriting engine to skip the next num rules if the current rule matches. details ...
type|T=MIME-type | Force the MIME-type of the target file to be the specified type. details ...

Home directory expansion

When the substitution string begins with a string resembling "/~user" (via explicit text or backreferences), mod_rewrite performs home directory expansion independent of the presence or configuration of mod_userdir.

This expansion does not occur when the PT flag is used on the RewriteRule directive.

Here are all possible substitution combinations and their meanings:

Inside per-server configuration (httpd.conf)
for request ``GET /somepath/pathinfo'':

Given Rule                                      Resulting Substitution
----------------------------------------------  ----------------------------------
^/somepath(.*) otherpath$1                      invalid, not supported

^/somepath(.*) otherpath$1  [R]                 invalid, not supported

^/somepath(.*) otherpath$1  [P]                 invalid, not supported
----------------------------------------------  ----------------------------------
^/somepath(.*) /otherpath$1                     /otherpath/pathinfo

^/somepath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
                                                via external redirection

^/somepath(.*) /otherpath$1 [P]                 doesn't make sense, not supported
----------------------------------------------  ----------------------------------
^/somepath(.*) http://thishost/otherpath$1      /otherpath/pathinfo

^/somepath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
                                                via external redirection

^/somepath(.*) http://thishost/otherpath$1 [P]  doesn't make sense, not supported
----------------------------------------------  ----------------------------------
^/somepath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
                                                via external redirection

^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
                                                via external redirection
                                                (the [R] flag is redundant)

^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
                                                via internal proxy

Inside per-directory configuration for /somepath
(/physical/path/to/somepath/.htaccess, with RewriteBase /somepath)
for request ``GET /somepath/localpath/pathinfo'':

Given Rule                                      Resulting Substitution
----------------------------------------------  ----------------------------------
^localpath(.*) otherpath$1                      /somepath/otherpath/pathinfo

^localpath(.*) otherpath$1  [R]                 http://thishost/somepath/otherpath/pathinfo
                                                via external redirection

^localpath(.*) otherpath$1  [P]                 doesn't make sense, not supported
----------------------------------------------  ----------------------------------
^localpath(.*) /otherpath$1                     /otherpath/pathinfo

^localpath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
                                                via external redirection

^localpath(.*) /otherpath$1 [P]                 doesn't make sense, not supported
----------------------------------------------  ----------------------------------
^localpath(.*) http://thishost/otherpath$1      /otherpath/pathinfo

^localpath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
                                                via external redirection

^localpath(.*) http://thishost/otherpath$1 [P]  doesn't make sense, not supported
----------------------------------------------  ----------------------------------
^localpath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
                                                via external redirection

^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
                                                via external redirection
                                                (the [R] flag is redundant)

^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
                                                via internal proxy


Apache mod_rewrite Introduction - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

Apache mod_rewrite Introduction

This document supplements the mod_rewrite reference documentation. It describes the basic concepts necessary for use of mod_rewrite. Other documents go into greater detail, but this doc should help the beginner get their feet wet.

See also

  • Module documentation
  • Redirection and remapping
  • Controlling access
  • Virtual hosts
  • Proxying
  • Using RewriteMap
  • Advanced techniques
  • When not to use mod_rewrite

Introduction

The Apache module mod_rewrite is a very powerful and sophisticated module which provides a way to do URL manipulations. With it, you can do nearly all types of URL rewriting that you may need. It is, however, somewhat complex, and may be intimidating to the beginner. There is also a tendency to treat rewrite rules as magic incantation, using them without actually understanding what they do.

This document attempts to give sufficient background so that what follows is understood, rather than just copied blindly.

Remember that many common URL-manipulation tasks don't require the full power and complexity of mod_rewrite. For simple tasks, see mod_alias and the documentation on mapping URLs to the filesystem.

Finally, before proceeding, be sure to configure mod_rewrite's log level to one of the trace levels using the LogLevel directive. Although this can give an overwhelming amount of information, it is indispensable in debugging problems with mod_rewrite configuration, since it will tell you exactly how each rule is processed.

Regular Expressions

mod_rewrite uses the Perl Compatible Regular Expression vocabulary. In this document, we do not attempt to provide a detailed reference to regular expressions. For that, we recommend the PCRE man pages, the Perl regular expression man page, and Mastering Regular Expressions, by Jeffrey Friedl.

In this document, we attempt to provide enough of a regex vocabulary to get you started, without being overwhelming, in the hope that RewriteRules will be scientific formulae, rather than magical incantations.

Regex vocabulary

The following are the minimal building blocks you will need, in order to write regular expressions and RewriteRules. They certainly do not represent a complete regular expression vocabulary, but they are a good place to start, and should help you read basic regular expressions, as well as write your own.

Character | Meaning | Example
. | Matches any single character | c.t will match cat, cot, cut, etc.
+ | Repeats the previous match one or more times | a+ matches a, aa, aaa, etc
* | Repeats the previous match zero or more times. | a* matches all the same things a+ matches, but will also match an empty string.
? | Makes the match optional. | colou?r will match color and colour.
^ | Called an anchor, matches the beginning of the string | ^a matches a string that begins with a
$ | The other anchor, this matches the end of the string. | a$ matches a string that ends with a.
( ) | Groups several characters into a single unit, and captures a match for use in a backreference. | (ab)+ matches ababab - that is, the + applies to the group. For more on backreferences see below.
[ ] | A character class - matches one of the characters | c[uoa]t matches cut, cot or cat.
[^ ] | Negative character class - matches any character not specified | c[^/]t matches cat or c=t but not c/t

In mod_rewrite the ! character can be used before a regular expression to negate it. This is, a string will be considered to have matched only if it does not match the rest of the expression.

Regex Back-Reference Availability

One important thing here has to be remembered: Whenever you use parentheses in Pattern or in one of the CondPattern, back-references are internally created which can be used with the strings $N and %N (see below). These are available for creating the strings Substitution and TestString as outlined in the following chapters. Figure 1 shows to which locations the back-references are transferred for expansion as well as illustrating the flow of the RewriteRule, RewriteCond matching. In the next chapters, we will be exploring how to use these back-references, so do not fret if it seems a bit alien to you at first.

Flow of RewriteRule and RewriteCond matching
Figure 1: The back-reference flow through a rule.
In this example, a request for /test/1234 would be transformed into /admin.foo?page=test&id=1234&host=admin.example.com.

RewriteRule Basics

A RewriteRule consists of three arguments separated by spaces. The arguments are

  1. Pattern: which incoming URLs should be affected by the rule;
  2. Substitution: where should the matching requests be sent;
  3. [flags]: options affecting the rewritten request.

The Pattern is a regular expression. It is initially (for the first rewrite rule or until a substitution occurs) matched against the URL-path of the incoming request (the part after the hostname but before any question mark indicating the beginning of a query string) or, in per-directory context, against the request's path relative to the directory for which the rule is defined. Once a substitution has occurred, the rules that follow are matched against the substituted value.

Syntax of the RewriteRule directive
Figure 2: Syntax of the RewriteRule directive.

The Substitution can itself be one of three things:

A full filesystem path to a resource

RewriteRule ^/games.* /usr/local/games/web

This maps a request to an arbitrary location on your filesystem, much like the Alias directive.

A web-path to a resource

RewriteRule ^/foo$ /bar

If DocumentRoot is set to /usr/local/apache2/htdocs, then this directive would map requests for http://example.com/foo to the path /usr/local/apache2/htdocs/bar.

An absolute URL

RewriteRule ^/product/view$ http://site2.example.com/seeproduct.html [R]

This tells the client to make a new request for the specified URL.

The Substitution can also contain back-references to parts of the incoming URL-path matched by the Pattern. Consider the following:

RewriteRule ^/product/(.*)/view$ /var/web/productdb/$1

The variable $1 will be replaced with whatever text was matched by the expression inside the parenthesis in the Pattern. For example, a request for http://example.com/product/r14df/view will be mapped to the path /var/web/productdb/r14df.

If there is more than one expression in parenthesis, they are available in order in the variables $1, $2, $3, and so on.

Rewrite Flags

The behavior of a RewriteRule can be modified by the application of one or more flags to the end of the rule. For example, the matching behavior of a rule can be made case-insensitive by the application of the [NC] flag:

RewriteRule ^puppy.html smalldog.html [NC]

For more details on the available flags, their meanings, and examples, see the Rewrite Flags document.

Rewrite Conditions

One or more RewriteCond directives can be used to restrict the types of requests that will be subject to the following RewriteRule. The first argument is a variable describing a characteristic of the request, the second argument is a regular expression that must match the variable, and a third optional argument is a list of flags that modify how the match is evaluated.

Syntax of the RewriteCond directive
Figure 3: Syntax of the RewriteCond directive

For example, to send all requests from a particular IP range to a different server, you could use:

RewriteCond %{REMOTE_ADDR} ^10\.2\.
RewriteRule (.*) http://intranet.example.com$1

When more than one RewriteCond is specified, they must all match for the RewriteRule to be applied. For example, to deny requests that contain the word "hack" in their query string, unless they also contain a cookie containing the word "go", you could use:

RewriteCond %{QUERY_STRING} hack
RewriteCond %{HTTP_COOKIE} !go
RewriteRule .* - [F]

Notice that the exclamation mark specifies a negative match, so the rule is only applied if the cookie does not contain "go".

Matches in the regular expressions contained in the RewriteConds can be used as part of the Substitution in the RewriteRule using the variables %1, %2, etc. For example, this will direct the request to a different directory depending on the hostname used to access the site:

RewriteCond %{HTTP_HOST} (.*)
RewriteRule ^/(.*) /sites/%1/$1

If the request was for http://example.com/foo/bar, then %1 would contain example.com and $1 would contain foo/bar.

Rewrite maps

The RewriteMap directive provides a way to call an external function, so to speak, to do your rewriting for you. This is discussed in greater detail in the RewriteMap supplementary documentation.

.htaccess files

Rewriting is typically configured in the main server configuration setting (outside any <Directory> section) or inside <VirtualHost> containers. This is the easiest way to do rewriting and is recommended. It is possible, however, to do rewriting inside <Directory> sections or .htaccess files at the expense of some additional complexity. This technique is called per-directory rewrites.

The main difference with per-server rewrites is that the path prefix of the directory containing the .htaccess file is stripped before matching in the RewriteRule. In addition, the RewriteBase should be used to assure the request is properly mapped.


Redirecting and Remapping with mod_rewrite - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

Redirecting and Remapping with mod_rewrite

This document supplements the mod_rewrite reference documentation. It describes how you can use mod_rewrite to redirect and remap request. This includes many examples of common uses of mod_rewrite, including detailed descriptions of how each works.

Note that many of these examples won't work unchanged in your particular server configuration, so it's important that you understand them, rather than merely cutting and pasting the examples into your configuration.

See also

  • Module documentation
  • mod_rewrite introduction
  • Controlling access
  • Virtual hosts
  • Proxying
  • Using RewriteMap
  • Advanced techniques and tricks
  • When not to use mod_rewrite

From Old to New (internal)

Description:

Assume we have recently renamed the page foo.html to bar.html and now want to provide the old URL for backward compatibility. However, we want that users of the old URL even not recognize that the pages was renamed - that is, we don't want the address to change in their browser.

Solution:

We rewrite the old URL to the new one internally via the following rule:

RewriteEngine on
RewriteRule ^/foo\.html$ /bar.html [PT]

Rewriting From Old to New (external)

Description:

Assume again that we have recently renamed the page foo.html to bar.html and now want to provide the old URL for backward compatibility. But this time we want that the users of the old URL get hinted to the new one, i.e. their browsers Location field should change, too.

Solution:

We force a HTTP redirect to the new URL which leads to a change of the browsers and thus the users view:

RewriteEngine on
RewriteRule ^/foo\.html$ bar.html [R]

Discussion

In this example, as contrasted to the internal example above, we can simply use the Redirect directive. mod_rewrite was used in that earlier example in order to hide the redirect from the client:

Redirect /foo.html /bar.html

Resource Moved to Another Server

Description:

If a resource has moved to another server, you may wish to have URLs continue to work for a time on the old server while people update their bookmarks.

Solution:

You can use mod_rewrite to redirect these URLs to the new server, but you might also consider using the Redirect or RedirectMatch directive.

With mod_rewrite

RewriteEngine on
RewriteRule ^/docs/(.+) http://new.example.com/docs/$1 [R,L]

With RedirectMatch

RedirectMatch ^/docs/(.*) http://new.example.com/docs/$1

With Redirect

Redirect /docs/ http://new.example.com/docs/

From Static to Dynamic

Description:

How can we transform a static page foo.html into a dynamic variant foo.cgi in a seamless way, i.e. without notice by the browser/user.

Solution:

We just rewrite the URL to the CGI-script and force the handler to be cgi-script so that it is executed as a CGI program. This way a request to /~quux/foo.html internally leads to the invocation of /~quux/foo.cgi.

RewriteEngine on
RewriteBase /~quux/
RewriteRule ^foo\.html$ foo.cgi [H=cgi-script]

Backward Compatibility for file extension change

Description:

How can we make URLs backward compatible (still existing virtually) after migrating document.YYYY to document.XXXX, e.g. after translating a bunch of .html files to .php?

Solution:

We rewrite the name to its basename and test for existence of the new extension. If it exists, we take that name, else we rewrite the URL to its original state.

# backward compatibility ruleset for
# rewriting document.html to document.php
# when and only when document.php exists
<Directory /var/www/htdocs>
RewriteEngine on
RewriteBase /var/www/htdocs

RewriteCond $1.php -f
RewriteCond $1.html !-f
RewriteRule ^(.*).html$ $1.php
 </Directory>

Discussion

This example uses an often-overlooked feature of mod_rewrite, by taking advantage of the order of execution of the ruleset. In particular, mod_rewrite evaluates the left-hand-side of the RewriteRule before it evaluates the RewriteCond directives. Consequently, $1 is already defined by the time the RewriteCond directives are evaluated. This allows us to test for the existence of the original (document.html) and target (document.php) files using the same base filename.

This ruleset is designed to use in a per-directory context (In a <Directory> block or in a .htaccess file), so that the -f checks are looking at the correct directory path. You may need to set a RewriteBase directive to specify the directory base that you're working in.

Canonical Hostnames

Description:
The goal of this rule is to force the use of a particular hostname, in preference to other hostnames which may be used to reach the same site. For example, if you wish to force the use of www.example.com instead of example.com, you might use a variant of the following recipe.
Solution:

The very best way to solve this doesn't involve mod_rewrite at all, but rather uses the Redirect directive placed in a virtual host for the non-canonical hostname(s).

<VirtualHost *:80>
ServerName undesired.example.com
ServerAlias example.com notthis.example.com

Redirect / http://www.example.com/
 </VirtualHost>

<VirtualHost *:80>
ServerName www.example.com
 </VirtualHost>

If, for whatever reason, you still want to use mod_rewrite - if, for example, you need this to work with a larger set of RewriteRules - you might use one of the recipes below.

For sites running on a port other than 80:

RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{SERVER_PORT} !^80$
RewriteRule ^/?(.*) http://www.example.com:%{SERVER_PORT}/$1 [L,R,NE]

And for a site running on port 80

RewriteCond %{HTTP_HOST} !^www\.example\.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/?(.*) http://www.example.com/$1 [L,R,NE]

If you wanted to do this generically for all domain names - that is, if you want to redirect example.com to www.example.com for all possible values of example.com, you could use the following recipe:

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/?(.*) http://www.%{HTTP_HOST}/$1 [L,R,NE]

These rulesets will work either in your main server configuration file, or in a .htaccess file placed in the DocumentRoot of the server.

Search for pages in more than one directory

Description:

A particular resource might exist in one of several places, and we want to look in those places for the resource when it is requested. Perhaps we've recently rearranged our directory structure, dividing content into several locations.

Solution:

The following ruleset searches in two directories to find the resource, and, if not finding it in either place, will attempt to just serve it out of the location requested.

RewriteEngine on

# first try to find it in dir1/...
# ...and if found stop and be happy:
RewriteCond %{DOCUMENT_ROOT}/dir1/%{REQUEST_URI} -f
RewriteRule ^(.+) %{DOCUMENT_ROOT}/dir1/$1 [L]

# second try to find it in dir2/...
# ...and if found stop and be happy:
RewriteCond %{DOCUMENT_ROOT}/dir2/%{REQUEST_URI} -f
RewriteRule ^(.+) %{DOCUMENT_ROOT}/dir2/$1 [L]

# else go on for other Alias or ScriptAlias directives,
# etc.
RewriteRule ^ - [PT]

Redirecting to Geographically Distributed Servers

Description:

We have numerous mirrors of our website, and want to redirect people to the one that is located in the country where they are located.

Solution:

Looking at the hostname of the requesting client, we determine which country they are coming from. If we can't do a lookup on their IP address, we fall back to a default server.

We'll use a RewriteMap directive to build a list of servers that we wish to use.

HostnameLookups on
RewriteEngine on
RewriteMap multiplex txt:/path/to/map.mirrors
RewriteCond %{REMOTE_HOST} ([a-z]+)$ [NC]
RewriteRule ^/(.*)$ ${multiplex:%1|http://www.example.com/}$1 [R,L]

## map.mirrors -- Multiplexing Map

de http://www.example.de/
uk http://www.example.uk/
com http://www.example.com/
##EOF##

Discussion
This ruleset relies on HostNameLookups being set on, which can be a significant performance hit.

The RewriteCond directive captures the last portion of the hostname of the requesting client - the country code - and the following RewriteRule uses that value to look up the appropriate mirror host in the map file.

Browser Dependent Content

Description:

We wish to provide different content based on the browser, or user-agent, which is requesting the content.

Solution:

We have to decide, based on the HTTP header "User-Agent", which content to serve. The following config does the following: If the HTTP header "User-Agent" contains "Mozilla/3", the page foo.html is rewritten to foo.NS.html and the rewriting stops. If the browser is "Lynx" or "Mozilla" of version 1 or 2, the URL becomes foo.20.html. All other browsers receive page foo.32.html. This is done with the following ruleset:

RewriteCond %{HTTP_USER_AGENT} ^Mozilla/3.*
RewriteRule ^foo\.html$ foo.NS.html [L]

RewriteCond %{HTTP_USER_AGENT} ^Lynx/ [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mozilla/[12]
RewriteRule ^foo\.html$ foo.20.html [L]

RewriteRule ^foo\.html$ foo.32.html [L]

Canonical URLs

Description:

On some webservers there is more than one URL for a resource. Usually there are canonical URLs (which are be actually used and distributed) and those which are just shortcuts, internal ones, and so on. Independent of which URL the user supplied with the request, they should finally see the canonical one in their browser address bar.

Solution:

We do an external HTTP redirect for all non-canonical URLs to fix them in the location view of the Browser and for all subsequent requests. In the example ruleset below we replace /puppies and /canines by the canonical /dogs.

RewriteRule ^/(puppies|canines)/(.*) /dogs/$2 [R]

Discussion:
This should really be accomplished with Redirect or RedirectMatch directives:

RedirectMatch ^/(puppies|canines)/(.*) /dogs/$2

Moved DocumentRoot

Description:

Usually the DocumentRoot of the webserver directly relates to the URL "/". But often this data is not really of top-level priority. For example, you may wish for visitors, on first entering a site, to go to a particular subdirectory /about/. This may be accomplished using the following ruleset:

Solution:

We redirect the URL / to /about/:

RewriteEngine on
RewriteRule ^/$ /about/ [R]

Note that this can also be handled using the RedirectMatch directive:

RedirectMatch ^/$ http://example.com/about/

Note also that the example rewrites only the root URL. That is, it rewrites a request for http://example.com/, but not a request for http://example.com/page.html. If you have in fact changed your document root - that is, if all of your content is in fact in that subdirectory, it is greatly preferable to simply change your DocumentRoot directive, or move all of the content up one directory, rather than rewriting URLs.

Fallback Resource

Description:
You want a single resource (say, a certain file, like index.php) to handle all requests that come to a particular directory, except those that should go to an existing resource such as an image, or a css file.
Solution:

As of version 2.2.16, you should use the FallbackResource directive for this:

<Directory /var/www/my_blog>
FallbackResource index.php
 </Directory>

However, in earlier versions of Apache, or if your needs are more complicated than this, you can use a variation of the following rewrite set to accomplish the same thing:

<Directory /var/www/my_blog>
RewriteBase /my_blog

RewriteCond /var/www/my_blog/%{REQUEST_FILENAME} !-f
RewriteCond /var/www/my_blog/%{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [PT]
 </Directory>

If, on the other hand, you wish to pass the requested URI as a query string argument to index.php, you can replace that RewriteRule with:

RewriteRule (.*) index.php?$1 [PT,QSA]

Note that these rulesets can be uses in a .htaccess file, as well as in a <Directory> block.


Using mod_rewrite to control access - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

Using mod_rewrite to control access

This document supplements the mod_rewrite reference documentation. It describes how you can use mod_rewrite to control access to various resources, and other related techniques. This includes many examples of common uses of mod_rewrite, including detailed descriptions of how each works.

Note that many of these examples won't work unchanged in your particular server configuration, so it's important that you understand them, rather than merely cutting and pasting the examples into your configuration.

See also

  • Module documentation
  • mod_rewrite introduction
  • Redirection and remapping
  • Virtual hosts
  • Proxying
  • Using RewriteMap
  • Advanced techniques and tricks
  • When not to use mod_rewrite

Forbidding Image "Hotlinking"

Description:

The following technique forbids the practice of other sites including your images inline in their pages. This practice is often referred to as "hotlinking", and results in your bandwidth being used to serve content for someone else's site.

Solution:

This technique relies on the value of the HTTP_REFERER variable, which is optional. As such, it's possible for some people to circumvent this limitation. However, most users will experience the failed request, which should, over time, result in the image being removed from that other site.

There are several ways that you can handle this situation.

In this first example, we simply deny the request, if it didn't initiate from a page on our site. For the purpose of this example, we assume that our site is www.example.com.

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !www.example.com [NC]
RewriteRule \.(gif|jpg|png)$ - [F,NC]

In this second example, instead of failing the request, we display an alternate image instead.

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !www.example.com [NC]
RewriteRule \.(gif|jpg|png)$ /images/go-away.png [R,NC]

In the third example, we redirect the request to an image on some other site.

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !www.example.com [NC]
RewriteRule \.(gif|jpg|png)$ http://other.example.com/image.gif [R,NC]

Of these techniques, the last two tend to be the most effective in getting people to stop hotlinking your images, because they will simply not see the image that they expected to see.

Discussion:

If all you wish to do is deny access to the resource, rather than redirecting that request elsewhere, this can be accomplished without the use of mod_rewrite:

SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
Order deny,allow
Deny from all
Allow from env=localreferer
</FilesMatch>

Blocking of Robots

Description:

In this recipe, we discuss how to block persistent requests from a particular robot, or user agent.

The standard for robot exclusion defines a file, /robots.txt that specifies those portions of your website where you which to exclude robots. However, some robots do not honor these files.

Note that there are methods of accomplishing this which do not use mod_rewrite. Note also that any technique that relies on the clients USER_AGENT string can be circumvented very easily, since that string can be changed.

Solution:

We use a ruleset that specifies the directory to be protected, and the client USER_AGENT that identifies the malicious or persistent robot.

In this example, we are blocking a robot called NameOfBadRobot from a location /secret/files. You may also specify an IP address range, if you are trying to block that user agent only from the particular source.

RewriteCond %{HTTP_USER_AGENT} ^NameOfBadRobot
RewriteCond %{REMOTE_ADDR} =123\.45\.67\.[8-9]
RewriteRule ^/secret/files/ - [F]

Discussion:

Rather than using mod_rewrite for this, you can accomplish the same end using alternate means, as illustrated here:

SetEnvIfNoCase User-Agent ^NameOfBadRobot goaway
<Location /secret/files>
Order allow,deny
Allow from all
Deny from env=goaway
</Location>

As noted above, this technique is trivial to circumvent, by simply modifying the USER_AGENT request header. If you are experiencing a sustained attack, you should consider blocking it at a higher level, such as at your firewall.

Denying Hosts in a Blacklist

Description:

We wish to maintain a blacklist of hosts, rather like hosts.deny, and have those hosts blocked from accessing our server.

Solution:

RewriteEngine on
RewriteMap hosts-deny txt:/path/to/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^ - [F]

##
## hosts.deny
##
## ATTENTION! This is a map, not a list, even when we treat it as such.
## mod_rewrite parses it for key/value pairs, so at least a
## dummy value "-" must be present for each entry.
##

193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -

Discussion:

The second RewriteCond assumes that you have HostNameLookups turned on, so that client IP addresses will be resolved. If that's not the case, you should drop the second RewriteCond, and drop the [OR] flag from the first RewriteCond.

Referer-based Deflector

Description:

Redirect requests based on the Referer from which the request came, with different targets per Referer.

Solution:

The following ruleset uses a map file to associate each Referer with a redirection target.

RewriteMap deflector txt:/path/to/deflector.map

RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}} =-
RewriteRule ^ %{HTTP_REFERER} [R,L]

RewriteCond %{HTTP_REFERER} !=""
RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^.* ${deflector:%{HTTP_REFERER}} [R,L]

The map file lists redirection targets for each referer, or, if we just wish to redirect back to where they came from, a "-" is placed in the map:

##
## deflector.map
##

http://badguys.example.com/bad/index.html -
http://badguys.example.com/bad/index2.html -
http://badguys.example.com/bad/index3.html http://somewhere.example.com/


Dynamic mass virtual hosts with mod_rewrite - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

Dynamic mass virtual hosts with mod_rewrite

This document supplements the mod_rewrite reference documentation. It describes how you can use mod_rewrite to create dynamically configured virtual hosts.

mod_rewrite is not the best way to configure virtual hosts. You should first consider the alternatives before resorting to mod_rewrite. See also the "how to avoid mod_rewrite document.

See also

  • Module documentation
  • mod_rewrite introduction
  • Redirection and remapping
  • Controlling access
  • Proxying
  • RewriteMap
  • Advanced techniques and tricks
  • When not to use mod_rewrite

Virtual Hosts For Arbitrary Hostnames

Description:

We want to automatically create a virtual host for every hostname which resolves in our domain, without having to create new VirtualHost sections.

In this recipe, we assume that we'll be using the hostname www.SITE.example.com for each user, and serve their content out of /home/SITE/www.

Solution:

RewriteEngine on

RewriteMap lowercase int:tolower

RewriteCond %{lowercase:%{HTTP_HOST}} ^www\.([^.]+)\.example\.com$
RewriteRule ^(.*) /home/%1/www$1

Discussion
You will need to take care of the DNS resolution - Apache does not handle name resolution. You'll need either to create CNAME records for each hostname, or a DNS wildcard record. Creating DNS records is beyond the scope of this document.

The internal tolower RewriteMap directive is used to ensure that the hostnames being used are all lowercase, so that there is no ambiguity in the directory structure which must be created.

Parentheses used in a RewriteCond are captured into the backreferences %1, %2, etc, while parentheses used in RewriteRule are captured into the backreferences $1, $2, etc.

As with many techniques discussed in this document, mod_rewrite really isn't the best way to accomplish this task. You should, instead, consider using mod_vhost_alias instead, as it will much more gracefully handle anything beyond serving static files, such as any dynamic content, and Alias resolution.

Dynamic Virtual Hosts Using mod_rewrite

This extract from httpd.conf does the same thing as the first example. The first half is very similar to the corresponding part above, except for some changes, required for backward compatibility and to make the mod_rewrite part work properly; the second half configures mod_rewrite to do the actual work.

Because mod_rewrite runs before other URI translation modules (e.g., mod_alias), mod_rewrite must be told to explicitly ignore any URLs that would have been handled by those modules. And, because these rules would otherwise bypass any ScriptAlias directives, we must have mod_rewrite explicitly enact those mappings.

# get the server name from the Host: header
UseCanonicalName Off

# splittable logs
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
CustomLog logs/access_log vcommon

<Directory /www/hosts>
# ExecCGI is needed here because we can't force
# CGI execution in the way that ScriptAlias does
Options FollowSymLinks ExecCGI
 </Directory>

RewriteEngine On

# a ServerName derived from a Host: header may be any case at all
RewriteMap lowercase int:tolower

## deal with normal documents first:
# allow Alias /icons/ to work - repeat for other aliases
RewriteCond %{REQUEST_URI} !^/icons/
# allow CGIs to work
RewriteCond %{REQUEST_URI} !^/cgi-bin/
# do the magic
RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1

## and now deal with CGIs - we have to force a handler
RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [H=cgi-script]

Using a Separate Virtual Host Configuration File

This arrangement uses more advanced mod_rewrite features to work out the translation from virtual host to document root, from a separate configuration file. This provides more flexibility, but requires more complicated configuration.

The vhost.map file should look something like this:

customer-1.example.com /www/customers/1
customer-2.example.com /www/customers/2
# ...
customer-N.example.com /www/customers/N

The httpd.conf should contain the following:

RewriteEngine on

RewriteMap lowercase int:tolower

# define the map file
RewriteMap vhost txt:/www/conf/vhost.map

# deal with aliases as above
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{REQUEST_URI} !^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
# this does the file-based remap
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/docs/$1

RewriteCond %{REQUEST_URI} ^/cgi-bin/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/cgi-bin/$1 [H=cgi-script]


Using mod_rewrite for Proxying - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

Using mod_rewrite for Proxying

This document supplements the mod_rewrite reference documentation. It describes how to use the RewriteRule's [P] flag to proxy content to another server. A number of recipes are provided that describe common scenarios.

See also

  • Module documentation
  • mod_rewrite introduction
  • Redirection and remapping
  • Controlling access
  • Virtual hosts
  • Using RewriteMap
  • Advanced techniques and tricks
  • When not to use mod_rewrite

Proxying Content with mod_rewrite

Description:

mod_rewrite provides the [P] flag, which allows URLs to be passed, via mod_proxy, to another server. Two examples are given here. In one example, a URL is passed directly to another server, and served as though it were a local URL. In the other example, we proxy missing content to a back-end server.

Solution:

To simply map a URL to another server, we use the [P] flag, as follows:

RewriteEngine on
RewriteBase /products/
RewriteRule ^widget/(.*)$ http://product.example.com/widget/$1 [P]
ProxyPassReverse /products/widget/ http://product.example.com/widget/

In the second example, we proxy the request only if we can't find the resource locally. This can be very useful when you're migrating from one server to another, and you're not sure if all the content has been migrated yet.

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^/(.*) http://old.example.com/$1 [P]
ProxyPassReverse / http://old.example.com/

Discussion:

In each case, we add a ProxyPassReverse directive to ensure that any redirects issued by the backend are correctly passed on to the client.

Consider using either ProxyPass or ProxyPassMatch whenever possible in preference to mod_rewrite.


Using RewriteMap - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

Using RewriteMap

This document supplements the mod_rewrite reference documentation. It describes the use of the RewriteMap directive, and provides examples of each of the various RewriteMap types.

Note that many of these examples won't work unchanged in your particular server configuration, so it's important that you understand them, rather than merely cutting and pasting the examples into your configuration.

See also

  • Module documentation
  • mod_rewrite introduction
  • Redirection and remapping
  • Controlling access
  • Virtual hosts
  • Proxying
  • Advanced techniques and tricks
  • When not to use mod_rewrite

Introduction

The RewriteMap directive defines an external function which can be called in the context of RewriteRule or RewriteCond directives to perform rewriting that is too complicated, or too specialized to be performed just by regular expressions. The source of this lookup can be any of the types listed in the sections below, and enumerated in the RewriteMap reference documentation.

The syntax of the RewriteMap directive is as follows:

RewriteMap MapName MapType:MapSource

The MapName is an arbitray name that you assign to the map, and which you will use in directives later on. Arguments are passed to the map via the following syntax:

${ MapName : LookupKey }
${ MapName : LookupKey | DefaultValue }

When such a construct occurs, the map MapName is consulted and the key LookupKey is looked-up. If the key is found, the map-function construct is substituted by SubstValue. If the key is not found then it is substituted by DefaultValue or by the empty string if no DefaultValue was specified.

For example, you might define a RewriteMap as:

RewriteMap examplemap txt:/path/to/file/map.txt

You would then be able to use this map in a RewriteRule as follows:

RewriteRule ^/ex/(.*) ${examplemap:$1}

A default value can be specified in the event that nothing is found in the map:

RewriteRule ^/ex/(.*) ${examplemap:$1|/not_found.html}

Per-directory and .htaccess context

The RewriteMap directive may not be used in <Directory> sections or .htaccess files. You must declare the map in server or virtualhost context. You may use the map, once created, in your RewriteRule and RewriteCond directives in those scopes. You just can't declare it in those scopes.

The sections that follow describe the various MapTypes that may be used, and give examples of each.

txt: Plain text maps

When a MapType of txt is used, the MapSource is a filesystem path to a plain-text mapping file, containing space-separated key/value pair per line. Optionally, a line may be contain a comment, starting with a '#' character.

For example, the following might be valid entries in a map file.

# Comment line
MatchingKey SubstValue
MatchingKey SubstValue # comment

When the RewriteMap is invoked the argument is looked for in the first argument of a line, and, if found, the substitution value is returned.

For example, we might use a mapfile to translate product names to product IDs for easier-to-remember URLs, using the following recipe:

Product to ID configuration

RewriteMap product2id txt:/etc/apache2/productmap.txt
RewriteRule ^/product/(.*) /prods.php?id=${product2id:$1|NOTFOUND} [PT]

We assume here that the prods.php script knows what to do when it received an argument of id=NOTFOUND when a product is not found in the lookup map.

The file /etc/apache2/productmap.txt then contains the following:

Product to ID map

##
## productmap.txt - Product to ID map file
##

television 993
stereo 198
fishingrod 043
basketball 418
telephone 328

Thus, when http://example.com/product/television is requested, the RewriteRule is applied, and the request is internally mapped to /prods.php?id=993.

Note: .htaccess files

The example given is crafted to be used in server or virtualhost scope. If you're planning to use this in a .htaccess file, you'll need to remove the leading slash from the rewrite pattern in order for it to match anything:

RewriteRule ^product/(.*) /prods.php?id=${product2id:$1|NOTFOUND} [PT]

Cached lookups

The looked-up keys are cached by httpd until the mtime (modified time) of the mapfile changes, or the httpd server is restarted. This ensures better performance on maps that are called by many requests.

rnd: Randomized Plain Text

When a MapType of rnd is used, the MapSource is a filesystem path to a plain-text mapping file, each line of which contains a key, and one or more values separated by |. One of these values will be chosen at random if the key is matched.

For example, you might use the following map file and directives to provide a random load balancing between several back-end server, via a reverse-proxy. Images are sent to one of the servers in the 'static' pool, while everything else is sent to one of the 'dynamic' pool.

Rewrite map file

##
## map.txt -- rewriting map
##

static www1|www2|www3|www4
dynamic www5|www6

Configuration directives

RewriteMap servers rnd:/path/to/file/map.txt

RewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1 [NC,P,L]
RewriteRule ^/(.*) http://${servers:dynamic}/$1 [P,L]

So, when an image is requested and the first of these rules is matched, RewriteMap looks up the string static in the map file, which returns one of the specified hostnames at random, which is then used in the RewriteRule target.

If you wanted to have one of the servers more likely to be chosen (for example, if one of the server has more memory than the others, and so can handle more requests) simply list it more times in the map file.

static www1|www1|www2|www3|www4

dbm: DBM Hash File

When a MapType of dbm is used, the MapSource is a filesystem path to a DBM database file containing key/value pairs to be used in the mapping. This works exactly the same way as the txt map, but is much faster, because a DBM is indexed, whereas a text file is not. This allows more rapid access to the desired key.

You may optionally specify a particular dbm type:

RewriteMap examplemap dbm=sdbm:/etc/apache/mapfile.dbm

The type can be sdbm, gdbm, ndbm or db. However, it is recommended that you just use the httxt2dbm utility that is provided with Apache HTTP Server, as it will use the correct DBM library, matching the one that was used when httpd itself was built.

To create a dbm file, first create a text map file as described in the txt section. Then run httxt2dbm:

$ httxt2dbm -i mapfile.txt -o mapfile.map

You can then reference the resulting file in your RewriteMap directive:

RewriteMap mapname dbm:/etc/apache/mapfile.map

Note that with some dbm types, more than one file is generated, with a common base name. For example, you may have two files named mapfile.map.dir and mapfiile.map.pag. This is normal, and you need only use the base name mapfile.map in your RewriteMap directive.

Cached lookups

The looked-up keys are cached by httpd until the mtime (modified time) of the mapfile changes, or the httpd server is restarted. This ensures better performance on maps that are called by many requests.

int: Internal Function

When a MapType of int is used, the MapSource is one of the available internal RewriteMap functions. Module authors can provide additional internal functions by registering them with the ap_register_rewrite_mapfunc API. The functions that are provided by default are:

  • toupper:
    Converts the key to all upper case.
  • tolower:
    Converts the key to all lower case.
  • escape:
    Translates special characters in the key to hex-encodings.
  • unescape:
    Translates hex-encodings in the key back to special characters.

To use one of these functions, create a RewriteMap referencing the int function, and then use that in your RewriteRule:

Redirect a URI to an all-lowercase version of itself

RewriteMap lc int:tolower
RewriteRule (.*[A-Z]+.*) ${lc:$1} [R]

Please note that the example offered here is for illustration purposes only, and is not a recommendation. If you want to make URLs case-insensitive, consider using mod_speling instead.

prg: External Rewriting Program

When a MapType of prg is used, the MapSource is a filesystem path to an executable program which will providing the mapping behavior. This can be a compiled binary file, or a program in an interpreted language such as Perl or Python.

This program is started once, when the Apache HTTP Server is started, and then communicates with the rewriting engine via STDIN and STDOUT. That is, for each map function lookup, it expects one argument via STDIN, and should return one new-line terminated response string on STDOUT. If there is no corresponding lookup value, the map program should return the four-character string "NULL" to indicate this.

External rewriting programs are not started if they're defined in a context that does not have RewriteEngine set to on.

A simple example is shown here which will replace all dashes with underscores in a request URI.

Rewrite configuration

RewriteMap d2u prg:/www/bin/dash2under.pl
RewriteRule - ${d2u:%{REQUEST_URI}}

dash2under.pl

#!/usr/bin/perl
$| = 1; # Turn off I/O buffering
while (<STDIN>) {
s/-/_/g; # Replace dashes with underscores
print $_;
 }

Use a RewriteLock!

When using a prg: RewriteMap, you should use a RewriteLock. Failure to do so will result in an error message in the log file, and may result in a race condition on concurrent requests.

Caution!

  • Keep your rewrite map program as simple as possible. If the program hangs, it will cause httpd to wait indefinitely for a response from the map, which will, in turn, cause httpd to stop responding to requests.
  • Be sure to turn off buffering in your program. In Perl this is done by the second line in the example script: $| = 1; This will of course vary in other languages. Buffered I/O will cause httpd to wait for the output, and so it will hang.
  • Remember that there is only one copy of the program, started at server startup. All requests will need to go through this one bottleneck. This can cause significant slowdowns if many requests must go through this process, or if the script itself is very slow.

Summary

The RewriteMap directive can occur more than once. For each mapping-function use one RewriteMap directive to declare its rewriting mapfile.

While you cannot declare a map in per-directory context (.htaccess files or <Directory> blocks) it is possible to use this map in per-directory context.


Advanced Techniques with mod_rewrite - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

Advanced Techniques with mod_rewrite

This document supplements the mod_rewrite reference documentation. It provides a few advanced techniques and tricks using mod_rewrite.

Note that many of these examples won't work unchanged in your particular server configuration, so it's important that you understand them, rather than merely cutting and pasting the examples into your configuration.

See also

  • Module documentation
  • mod_rewrite introduction
  • Redirection and remapping
  • Controlling access
  • Virtual hosts
  • Proxying
  • Using RewriteMap
  • When not to use mod_rewrite

URL-based sharding accross multiple backends

Description:

A common technique for distributing the burden of server load or storage space is called "sharding". When using this method, a front-end server will use the url to consistently "shard" users or objects to separate backend servers.

Solution:

A mapping is maintained, from users to target servers, in external map files. They look like:

user1 physical_host_of_user1
user2 physical_host_of_user2
: :

We put this into a map.users-to-hosts file. The aim is to map;

/u/user1/anypath

to

http://physical_host_of_user1/u/user/anypath

thus every URL path need not be valid on every backend physical host. The following ruleset does this for us with the help of the map files assuming that server0 is a default server which will be used if a user has no entry in the map:

RewriteEngine on

RewriteMap users-to-hosts txt:/path/to/map.users-to-hosts

RewriteRule ^/u/([^/]+)/?(.*) http://${users-to-hosts:$1|server0}/u/$1/$2

See the RewriteMap documentation for more discussion of the syntax of this directive.

On-the-fly Content-Regeneration

Description:

We wish to dynamically generate content, but store it statically once it is generated. This rule will check for the existence of the static file, and if it's not there, generate it. The static files can be removed periodically, if desired (say, via cron) and will be regenerated on demand.

Solution:
This is done via the following ruleset:
# This example is valid in per-directory context only
RewriteCond %{REQUEST_URI}   !-U
RewriteRule ^(.+)\.html$          /regenerate_page.cgi   [PT,L]

The -U operator determines whether the test string (in this case, REQUEST_URI) is a valid URL. It does this via a subrequest. In the event that this subrequest fails - that is, the requested resource doesn't exist - this rule invokes the CGI program /regenerate_page.cgi, which generates the requested resource and saves it into the document directory, so that the next time it is requested, a static copy can be served.

In this way, documents that are infrequently updated can be served in static form. if documents need to be refreshed, they can be deleted from the document directory, and they will then be regenerated the next time they are requested.

Load Balancing

Description:

We wish to randomly distribute load across several servers using mod_rewrite.

Solution:

We'll use RewriteMap and a list of servers to accomplish this.

RewriteEngine on
RewriteMap lb rnd:/path/to/serverlist.txt

RewriteRule ^/(.*) http://${lb:servers}/$1 [P,L]

serverlist.txt will contain a list of the servers:

## serverlist.txt

servers one.example.com|two.example.com|three.example.com

If you want one particular server to get more of the load than the others, add it more times to the list.

Discussion

Apache comes with a load-balancing module - mod_proxy_balancer - which is far more flexible and featureful than anything you can cobble together using mod_rewrite.

Document With Autorefresh

Description:

Wouldn't it be nice, while creating a complex web page, if the web browser would automatically refresh the page every time we save a new version from within our editor? Impossible?

Solution:

No! We just combine the MIME multipart feature, the web server NPH feature, and the URL manipulation power of mod_rewrite. First, we establish a new URL feature: Adding just :refresh to any URL causes the 'page' to be refreshed every time it is updated on the filesystem.

RewriteRule ^(/[uge]/[^/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1

Now when we reference the URL

/u/foo/bar/page.html:refresh

this leads to the internal invocation of the URL

/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html

The only missing part is the NPH-CGI script. Although one would usually say "left as an exercise to the reader" ;-) I will provide this, too.

#!/sw/bin/perl
##
##  nph-refresh -- NPH/CGI script for auto refreshing pages
##  Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
##
$| = 1;

#   split the QUERY_STRING variable
@pairs = split( /&/, $ENV{'QUERY_STRING'} );
foreach $pair (@pairs) {
    ( $name, $value ) = split( /=/, $pair );
    $name =~ tr/A-Z/a-z/;
    $name = 'QS_' . $name;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    eval "\$$name = \"$value\"";
}
$QS_s = 1    if ( $QS_s eq '' );
$QS_n = 3600 if ( $QS_n eq '' );
if ( $QS_f eq '' ) {
    print "HTTP/1.0 200 OK\n";
    print "Content-type: text/html\n\n";
print "&lt;b&gt;ERROR&lt;/b&gt;: No file given\n";
    exit(0);
}
if ( !-f $QS_f ) {
    print "HTTP/1.0 200 OK\n";
    print "Content-type: text/html\n\n";
print "&lt;b&gt;ERROR&lt;/b&gt;: File $QS_f not found\n";
    exit(0);
}

sub print_http_headers_multipart_begin {
    print "HTTP/1.0 200 OK\n";
    $bound = "ThisRandomString12345";
    print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
    &print_http_headers_multipart_next;
}

sub print_http_headers_multipart_next {
    print "\n--$bound\n";
}

sub print_http_headers_multipart_end {
    print "\n--$bound--\n";
}

sub displayhtml {
    local ($buffer) = @_;
    $len = length($buffer);
    print "Content-type: text/html\n";
    print "Content-length: $len\n\n";
    print $buffer;
}

sub readfile {
    local ($file) = @_;
    local ( *FP, $size, $buffer, $bytes );
    ( $x, $x, $x, $x, $x, $x, $x, $size ) = stat($file);
    $size = sprintf( "%d", $size );
open(FP, "&lt;$file");
    $bytes = sysread( FP, $buffer, $size );
    close(FP);
    return $buffer;
}

$buffer = &readfile($QS_f);
&print_http_headers_multipart_begin;
&displayhtml($buffer);

sub mystat {
    local ($file) = $_[0];
    local ($time);

    ( $x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime ) = stat($file);
    return $mtime;
}

$mtimeL = &mystat($QS_f);
$mtime  = $mtime;
for ( $n = 0 ; $n & lt ; $QS_n ; $n++ ) {
    while (1) {
        $mtime = &mystat($QS_f);
        if ( $mtime ne $mtimeL ) {
            $mtimeL = $mtime;
            sleep(2);
            $buffer = &readfile($QS_f);
            &print_http_headers_multipart_next;
            &displayhtml($buffer);
            sleep(5);
            $mtimeL = &mystat($QS_f);
            last;
        }
        sleep($QS_s);
    }
}

&print_http_headers_multipart_end;

exit(0);

##EOF##

Structured Userdirs

Description:

Some sites with thousands of users use a structured homedir layout, i.e. each homedir is in a subdirectory which begins (for instance) with the first character of the username. So, /~larry/anypath is /home/l/larry/public_html/anypath while /~waldo/anypath is /home/w/waldo/public_html/anypath.

Solution:

We use the following ruleset to expand the tilde URLs into the above layout.

RewriteEngine on
RewriteRule ^/~(([a-z])[a-z0-9]+)(.*) /home/$2/$1/public_html$3

Redirecting Anchors

Description:

By default, redirecting to an HTML anchor doesn't work, because mod_rewrite escapes the # character, turning it into %23. This, in turn, breaks the redirection.

Solution:

Use the [NE] flag on the RewriteRule. NE stands for No Escape.

Discussion:
This technique will of course also work with other special characters that mod_rewrite, by default, URL-encodes.

Time-Dependent Rewriting

Description:

We wish to use mod_rewrite to serve different content based on the time of day.

Solution:

There are a lot of variables named TIME_xxx for rewrite conditions. In conjunction with the special lexicographic comparison patterns <STRING, >STRING and =STRING we can do time-dependent redirects:

RewriteEngine on
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^foo\.html$ foo.day.html [L]
RewriteRule ^foo\.html$ foo.night.html

This provides the content of foo.day.html under the URL foo.html from 07:01-18:59 and at the remaining time the contents of foo.night.html.

mod_cache, intermediate proxies and browsers may each cache responses and cause the either page to be shown outside of the time-window configured. mod_expires may be used to control this effect. You are, of course, much better off simply serving the content dynamically, and customizing it based on the time of day.

Set Environment Variables Based On URL Parts

Description:

At time, we want to maintain some kind of status when we perform a rewrite. For example, you want to make a note that you've done that rewrite, so that you can check later to see if a request can via that rewrite. One way to do this is by setting an environment variable.

Solution:

Use the [E] flag to set an environment variable.

RewriteEngine on
RewriteRule ^/horse/(.*) /pony/$1 [E=rewritten:1]

Later in your ruleset you might check for this environment variable using a RewriteCond:

RewriteCond %{ENV:rewritten} =1

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


When not to use mod_rewrite - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

When not to use mod_rewrite

This document supplements the mod_rewrite reference documentation. It describes perhaps one of the most important concepts about mod_rewrite - namely, when to avoid using it.

mod_rewrite should be considered a last resort, when other alternatives are found wanting. Using it when there are simpler alternatives leads to configurations which are confusing, fragile, and hard to maintain. Understanding what other alternatives are available is a very important step towards mod_rewrite mastery.

Note that many of these examples won't work unchanged in your particular server configuration, so it's important that you understand them, rather than merely cutting and pasting the examples into your configuration.

The most common situation in which mod_rewrite is the right tool is when the very best solution requires access to the server configuration files, and you don't have that access. Some configuration directives are only available in the server configuration file. So if you are in a hosting situation where you only have .htaccess files to work with, you may need to resort to mod_rewrite.

See also

  • Module documentation
  • mod_rewrite introduction
  • Redirection and remapping
  • Controlling access
  • Virtual hosts
  • Proxying
  • Using RewriteMap
  • Advanced techniques and tricks

Simple Redirection

mod_alias provides the Redirect and RedirectMatch directives, which provide a means to redirect one URL to another. This kind of simple redirection of one URL, or a class of URLs, to somewhere else, should be accomplished using these directives rather than RewriteRule. RedirectMatch allows you to include a regular expression in your redirection criteria, providing many of the benefits of using RewriteRule.

A common use for RewriteRule is to redirect an entire class of URLs. For example, all URLs in the /one directory must be redirected to http://one.example.com/, or perhaps all http requests must be redirected to https.

These situations are better handled by the Redirect directive. Remember that Redirect preserves path information. That is to say, a redirect for a URL /one will also redirect all URLs under that, such as /one/two.html and /one/three/four.html.

To redirect URLs under /one to http://one.example.com, do the following:

Redirect /one/ http://one.example.com/

To redirect http URLs to https, do the following:

<VirtualHost *:80> ServerName www.example.com
Redirect / https://www.example.com/
</VirtualHost >
<VirtualHost *:443> ServerName www.example.com

# ... SSL configuration goes here
</VirtualHost >

The use of RewriteRule to perform this task may be appropriate if there are other RewriteRule directives in the same scope. This is because, when there are Redirect and RewriteRule directives in the same scope, the RewriteRule directives will run first, regardless of the order of appearance in the configuration file.

In the case of the http-to-https redirection, the use of RewriteRule would be appropriate if you don't have access to the main server configuration file, and are obliged to perform this task in a .htaccess file instead.

URL Aliasing

The Alias directive provides mapping from a URI to a directory - usually a directory outside of your DocumentRoot. Although it is possible to perform this mapping with mod_rewrite, Alias is the preferred method, for reasons of simplicity and performance.

Using Alias

Alias /cats /var/www/virtualhosts/felines/htdocs

The use of mod_rewrite to perform this mapping may be appropriate when you do not have access to the server configuration files. Alias may only be used in server or virtualhost context, and not in a .htaccess file.

Symbolic links would be another way to accomplish the same thing, if you have Options FollowSymLinks enabled on your server.

Virtual Hosting

Although it is possible to handle virtual hosts with mod_rewrite, it is seldom the right way. Creating individual <VirtualHost> blocks is almost always the right way to go. In the event that you have an enormous number of virtual hosts, consider using mod_vhost_alias to create these hosts automatically.

Third-party modules such as mod_macro are also useful for creating a large number of virtual hosts dynamically.

Using mod_rewrite for vitualhost creation may be appropriate if you are using a hosting service that does not provide you access to the server configuration files, and you are therefore restricted to configuration using .htaccess files.

See the virtual hosts with mod_rewrite document for more details on how you might accomplish this if it still seems like the right approach.

Simple Proxying

RewriteRule provides the [P] flag to pass rewritten URIs through mod_proxy.

RewriteRule ^/?images(.*) http://imageserver.local/images$1 [P]

However, in many cases, when there is no actual pattern matching needed, as in the example shown above, the ProxyPass directive is a better choice. The example here could be rendered as:

ProxyPass /images/ http://imageserver.local/images/

Note that whether you use RewriteRule or ProxyPass, you'll still need to use the ProxyPassReverse directive to catch redirects issued from the back-end server:

ProxyPassReverse /images/ http://imageserver.local/images/

You may need to use RewriteRule instead when there are other RewriteRules in effect in the same scope, as a RewriteRule will usually take effect before a ProxyPass, and so may preempt what you're trying to accomplish.


RewriteRule Flags - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

RewriteRule Flags

This document discusses the flags which are available to the RewriteRule directive, providing detailed explanations and examples.

See also

  • Module documentation
  • mod_rewrite introduction
  • Redirection and remapping
  • Controlling access
  • Virtual hosts
  • Proxying
  • Using RewriteMap
  • Advanced techniques
  • When not to use mod_rewrite

Introduction

A RewriteRule can have its behavior modified by one or more flags. Flags are included in square brackets at the end of the rule, and multiple flags are separated by commas.

RewriteRule pattern target [Flag1,Flag2,Flag3]

Each flag (with a few exceptions) has a short form, such as CO, as well as a longer form, such as cookie. While it is most common to use the short form, it is recommended that you familiarize yourself with the long form, so that you remember what each flag is supposed to do. Some flags take one or more arguments. Flags are not case sensitive.

Flags that alter metadata associated with the request (T=, H=, E=) have no affect in per-directory and htaccess context, when a substitution (other than '-') is performed during the same round of rewrite processing.

Presented here are each of the available flags, along with an example of how you might use them.

B (escape backreferences)

The [B] flag instructs RewriteRule to escape non-alphanumeric characters before applying the transformation.

mod_rewrite has to unescape URLs before mapping them, so backreferences will be unescaped at the time they are applied. Using the B flag, non-alphanumeric characters in backreferences will be escaped. For example, consider the rule:

RewriteRule ^search/(.*)$ /search.php?term=$1

Given a search term of 'x & y/z', a browser will encode it as 'x%20%26%20y%2Fz', making the request 'search/x%20%26%20y%2Fz'. Without the B flag, this rewrite rule will map to 'search.php?term=x & y/z', which isn't a valid URL, and so would be encoded as search.php?term=x%20&y%2Fz=, which is not what was intended.

With the B flag set on this same rule, the parameters are re-encoded before being passed on to the output URL, resulting in a correct mapping to /search.php?term=x%20%26%20y%2Fz.

Note that you may also need to set AllowEncodedSlashes to On to get this particular example to work, as httpd does not allow encoded slashes in URLs, and returns a 404 if it sees one.

This escaping is particularly necessary in a proxy situation, when the backend may break if presented with an unescaped URL.

C|chain

The [C] or [chain] flag indicates that the RewriteRule is chained to the next rule. That is, if the rule matches, then it is processed as usual and control moves on to the next rule. However, if it does not match, then the next rule, and any other rules that are chained together, will be skipped.

CO|cookie

The [CO], or [cookie] flag, allows you to set a cookie when a particular RewriteRule matches. The argument consists of three required fields and four optional fields.

The full syntax for the flag, including all attributes, is as follows:

[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly]

You must declare a name, a value, and a domain for the cookie to be set.

Domain
The domain for which you want the cookie to be valid. This may be a hostname, such as www.example.com, or it may be a domain, such as .example.com. It must be at least two parts separated by a dot. That is, it may not be merely .com or .net. Cookies of that kind are forbidden by the cookie security model.

You may optionally also set the following values:

Lifetime
The time for which the cookie will persist, in minutes.
A value of 0 indicates that the cookie will persist only for the current browser session. This is the default value if none is specified. Prior to 2.2.28, a value of 0 indicates immediate expiration and it was not possible to specify session lifetime if any later parameters (Path, Secure, httponly) were specified
Path
The path, on the current website, for which the cookie is valid, such as /customers/ or /files/download/.
By default, this is set to / - that is, the entire website.
Secure
If set to secure, true, or 1, the cookie will only be permitted to be translated via secure (https) connections.
httponly
If set to HttpOnly, true, or 1, the cookie will have the HttpOnly flag set, which means that the cookie will be inaccessible to JavaScript code on browsers that support this feature.

Several examples are offered here:

RewriteEngine On
RewriteRule ^/index\.html - [CO=frontdoor:yes:.example.com:1440:/]

In the example give, the rule doesn't rewrite the request. The "-" rewrite target tells mod_rewrite to pass the request through unchanged. Instead, it sets a cookie called 'frontdoor' to a value of 'yes'. The cookie is valid for any host in the .example.com domain. It will be set to expire in 1440 minutes (24 hours) and will be returned for all URIs.

DPI|discardpathinfo

The DPI flag causes the PATH_INFO portion of the rewritten URI to be discarded.

This flag is available in version 2.2.12 and later.

In per-directory context, the URI each RewriteRule compares against is the concatenation of the current values of the URI and PATH_INFO.

The current URI can be the initial URI as requested by the client, the result of a previous round of mod_rewrite processing, or the result of a prior rule in the current round of mod_rewrite processing.

In contrast, the PATH_INFO that is appended to the URI before each rule reflects only the value of PATH_INFO before this round of mod_rewrite processing. As a consequence, if large portions of the URI are matched and copied into a substitution in multiple RewriteRule directives, without regard for which parts of the URI came from the current PATH_INFO, the final URI may have multiple copies of PATH_INFO appended to it.

Use this flag on any substitution where the PATH_INFO that resulted from the previous mapping of this request to the filesystem is not of interest. This flag permanently forgets the PATH_INFO established before this round of mod_rewrite processing began. PATH_INFO will not be recalculated until the current round of mod_rewrite processing completes. Subsequent rules during this round of processing will see only the direct result of substitutions, without any PATH_INFO appended.

E|env

With the [E], or [env] flag, you can set the value of an environment variable. Note that some environment variables may be set after the rule is run, thus unsetting what you have set. See the Environment Variables document for more details on how Environment variables work.

The full syntax for this flag is:

[E=VAR:VAL] [E=!VAR]

VAL may contain backreferences ($N or %N) which will be expanded.

Using the short form

[E=VAR]

you can set the environment variable named VAR to an empty value.

The form

[E=!VAR]

allows to unset a previously set environment variable named VAR.

Environment variables can then be used in a variety of contexts, including CGI programs, other RewriteRule directives, or CustomLog directives.

The following example sets an environment variable called 'image' to a value of '1' if the requested URI is an image file. Then, that environment variable is used to exclude those requests from the access log.

RewriteRule \.(png|gif|jpg) - [E=image:1]
CustomLog logs/access_log combined env=!image

Note that this same effect can be obtained using SetEnvIf. This technique is offered as an example, not as a recommendation.

F|forbidden

Using the [F] flag causes the server to return a 403 Forbidden status code to the client. While the same behavior can be accomplished using the Deny directive, this allows more flexibility in assigning a Forbidden status.

The following rule will forbid .exe files from being downloaded from your server.

RewriteRule \.exe - [F]

This example uses the "-" syntax for the rewrite target, which means that the requested URI is not modified. There's no reason to rewrite to another URI, if you're going to forbid the request.

When using [F], an [L] is implied - that is, the response is returned immediately, and no further rules are evaluated.

G|gone

The [G] flag forces the server to return a 410 Gone status with the response. This indicates that a resource used to be available, but is no longer available.

As with the [F] flag, you will typically use the "-" syntax for the rewrite target when using the [G] flag:

RewriteRule oldproduct - [G,NC]

When using [G], an [L] is implied - that is, the response is returned immediately, and no further rules are evaluated.

H|handler

Forces the resulting request to be handled with the specified handler. For example, one might use this to force all files without a file extension to be parsed by the php handler:

RewriteRule !\. - [H=application/x-httpd-php]

The regular expression above - !\. - will match any request that does not contain the literal . character.

This can be also used to force the handler based on some conditions. For example, the following snippet used in per-server context allows .php files to be displayed by mod_php if they are requested with the .phps extension:

RewriteRule ^(/source/.+\.php)s$ $1 [H=application/x-httpd-php-source]

The regular expression above - ^(/source/.+\.php)s$ - will match any request that starts with /source/ followed by 1 or n characters followed by .phps literally. The backreference $1 referrers to the captured match within parenthesis of the regular expression.

L|last

The [L] flag causes mod_rewrite to stop processing the rule set. In most contexts, this means that if the rule matches, no further rules will be processed. This corresponds to the last command in Perl, or the break command in C. Use this flag to indicate that the current rule should be applied immediately without considering further rules.

If you are using RewriteRule in either .htaccess files or in <Directory> sections, it is important to have some understanding of how the rules are processed. The simplified form of this is that once the rules have been processed, the rewritten request is handed back to the URL parsing engine to do what it may with it. It is possible that as the rewritten request is handled, the .htaccess file or <Directory> section may be encountered again, and thus the ruleset may be run again from the start. Most commonly this will happen if one of the rules causes a redirect - either internal or external - causing the request process to start over.

It is therefore important, if you are using RewriteRule directives in one of these contexts, that you take explicit steps to avoid rules looping, and not count solely on the [L] flag to terminate execution of a series of rules, as shown below.

The example given here will rewrite any request to index.php, giving the original request as a query string argument to index.php, however, the RewriteCond ensures that if the request is already for index.php, the RewriteRule will be skipped.

RewriteBase /
RewriteCond %{REQUEST_URI} !=/index.php
RewriteRule ^(.*) /index.php?req=$1 [L,PT]

N|next

The [N] flag causes the ruleset to start over again from the top, using the result of the ruleset so far as a starting point. Use with extreme caution, as it may result in loop.

The [Next] flag could be used, for example, if you wished to replace a certain string or letter repeatedly in a request. The example shown here will replace A with B everywhere in a request, and will continue doing so until there are no more As to be replaced.

RewriteRule (.*)A(.*) $1B$2 [N]

You can think of this as a while loop: While this pattern still matches (i.e., while the URI still contains an A), perform this substitution (i.e., replace the A with a B).

NC|nocase

Use of the [NC] flag causes the RewriteRule to be matched in a case-insensitive manner. That is, it doesn't care whether letters appear as upper-case or lower-case in the matched URI.

In the example below, any request for an image file will be proxied to your dedicated image server. The match is case-insensitive, so that .jpg and .JPG files are both acceptable, for example.

RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [P,NC]

NE|noescape

By default, special characters, such as & and ?, for example, will be converted to their hexcode equivalent. Using the [NE] flag prevents that from happening.

RewriteRule ^/anchor/(.+) /bigpage.html#$1 [NE,R]

The above example will redirect /anchor/xyz to /bigpage.html#xyz. Omitting the [NE] will result in the # being converted to its hexcode equivalent, %23, which will then result in a 404 Not Found error condition.

NS|nosubreq

Use of the [NS] flag prevents the rule from being used on subrequests. For example, a page which is included using an SSI (Server Side Include) is a subrequest, and you may want to avoid rewrites happening on those subrequests. Also, when mod_dir tries to find out information about possible directory default files (such as index.html files), this is an internal subrequest, and you often want to avoid rewrites on such subrequests. On subrequests, it is not always useful, and can even cause errors, if the complete set of rules are applied. Use this flag to exclude problematic rules.

To decide whether or not to use this rule: if you prefix URLs with CGI-scripts, to force them to be processed by the CGI-script, it's likely that you will run into problems (or significant overhead) on sub-requests. In these cases, use this flag.

Images, javascript files, or css files, loaded as part of an HTML page, are not subrequests - the browser requests them as separate HTTP requests.

P|proxy

Use of the [P] flag causes the request to be handled by mod_proxy, and handled via a proxy request. For example, if you wanted all image requests to be handled by a back-end image server, you might do something like the following:

RewriteRule /(.*)\.(jpg|gif|png) http://images.example.com/$1.$2 [P]

Use of the [P] flag implies [L] - that is, the request is immediately pushed through the proxy, and any following rules will not be considered.

You must make sure that the substitution string is a valid URI (typically starting with http://hostname) which can be handled by the mod_proxy. If not, you will get an error from the proxy module. Use this flag to achieve a more powerful implementation of the ProxyPass directive, to map remote content into the namespace of the local server.

Security Warning

Take care when constructing the target URL of the rule, considering the security impact from allowing the client influence over the set of URLs to which your server will act as a proxy. Ensure that the scheme and hostname part of the URL is either fixed, or does not allow the client undue influence.

Note: mod_proxy must be enabled in order to use this flag.

PT|passthrough

The target (or substitution string) in a RewriteRule is assumed to be a file path, by default. The use of the [PT] flag causes it to be treated as a URI instead. That is to say, the use of the [PT] flag causes the result of the RewriteRule to be passed back through URL mapping, so that location-based mappings, such as Alias, Redirect, or ScriptAlias, for example, might have a chance to take effect.

If, for example, you have an Alias for /icons, and have a RewriteRule pointing there, you should use the [PT] flag to ensure that the Alias is evaluated.

Alias /icons /usr/local/apache/icons
RewriteRule /pics/(.+)\.jpg /icons/$1.gif [PT]

Omission of the [PT] flag in this case will cause the Alias to be ignored, resulting in a 'File not found' error being returned.

The PT flag implies the L flag: rewriting will be stopped in order to pass the request to the next phase of processing.

Note that the PT flag is implied in per-directory contexts such as <Directory> sections or in .htaccess files. The only way to circumvent that is to rewrite to -.

QSA|qsappend

When the replacement URI contains a query string, the default behavior of RewriteRule is to discard the existing query string, and replace it with the newly generated one. Using the [QSA] flag causes the query strings to be combined.

Consider the following rule:

RewriteRule /pages/(.+) /page.php?page=$1 [QSA]

With the [QSA] flag, a request for /pages/123?one=two will be mapped to /page.php?page=123&one=two. Without the [QSA] flag, that same request will be mapped to /page.php?page=123 - that is, the existing query string will be discarded.

R|redirect

Use of the [R] flag causes a HTTP redirect to be issued to the browser. If a fully-qualified URL is specified (that is, including http://servername/) then a redirect will be issued to that location. Otherwise, the current protocol, servername, and port number will be used to generate the URL sent with the redirect.

Any valid HTTP response status code may be specified, using the syntax [R=305], with a 302 status code being used by default if none is specified. The status code specified need not necessarily be a redirect (3xx) status code. However, if a status code is outside the redirect range (300-399) then the substitution string is dropped entirely, and rewriting is stopped as if the L were used.

In addition to response status codes, you may also specify redirect status using their symbolic names: temp (default), permanent, or seeother.

You will almost always want to use [R] in conjunction with [L] (that is, use [R,L]) because on its own, the [R] flag prepends http://thishost[:thisport] to the URI, but then passes this on to the next rule in the ruleset, which can often result in 'Invalid URI in request' warnings.

S|skip

The [S] flag is used to skip rules that you don't want to run. The syntax of the skip flag is [S=N], where N signifies the number of rules to skip (provided the RewriteRule matches). This can be thought of as a goto statement in your rewrite ruleset. In the following example, we only want to run the RewriteRule if the requested URI doesn't correspond with an actual file.

# Is the request for a non-existent file?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# If so, skip these two RewriteRules
RewriteRule .? - [S=2]
RewriteRule (.*\.gif) images.php?$1
RewriteRule (.*\.html) docs.php?$1

This technique is useful because a RewriteCond only applies to the RewriteRule immediately following it. Thus, if you want to make a RewriteCond apply to several RewriteRules, one possible technique is to negate those conditions and add a RewriteRule with a [Skip] flag. You can use this to make pseudo if-then-else constructs: The last rule of the then-clause becomes skip=N, where N is the number of rules in the else-clause:

# Does the file exist?
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Create an if-then-else construct by skipping 3 lines if we meant to go to the "else" stanza.
RewriteRule .? - [S=3]

# IF the file exists, then: RewriteRule (.*\.gif) images.php?$1
RewriteRule (.*\.html) docs.php?$1
# Skip past the "else" stanza.
RewriteRule .? - [S=1]
 # ELSE... RewriteRule (.*) 404.php?file=$1
 # END

T|type

Sets the MIME type with which the resulting response will be sent. This has the same effect as the AddType directive.

For example, you might use the following technique to serve Perl source code as plain text, if requested in a particular way:

# Serve .pl files as plain text
RewriteRule \.pl$ - [T=text/plain]

Or, perhaps, if you have a camera that produces jpeg images without file extensions, you could force those images to be served with the correct MIME type by virtue of their file names:

# Files with 'IMG' in the name are jpg images.
RewriteRule IMG - [T=image/jpg]

Please note that this is a trivial example, and could be better done using <FilesMatch> instead. Always consider the alternate solutions to a problem before resorting to rewrite, which will invariably be a less efficient solution than the alternatives.

If used in per-directory context, use only - (dash) as the substitution for the entire round of mod_rewrite processing, otherwise the MIME-type set with this flag is lost due to an internal re-processing (including subsequent rounds of mod_rewrite processing). The L flag can be useful in this context to end the current round of mod_rewrite processing.


Apache mod_rewrite Technical Details - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Rewrite

Apache mod_rewrite Technical Details

This document discusses some of the technical details of mod_rewrite and URL matching.

See also

  • Module documentation
  • mod_rewrite introduction
  • Redirection and remapping
  • Controlling access
  • Virtual hosts
  • Proxying
  • Using RewriteMap
  • Advanced techniques and tricks
  • When not to use mod_rewrite

Internal Processing

The internal processing of this module is very complex but needs to be explained once even to the average user to avoid common mistakes and to let you exploit its full functionality.

API Phases

First you have to understand that when Apache processes a HTTP request it does this in phases. A hook for each of these phases is provided by the Apache API. Mod_rewrite uses two of these hooks: the URL-to-filename translation hook which is used after the HTTP request has been read but before any authorization starts and the Fixup hook which is triggered after the authorization phases and after the per-directory config files (.htaccess) have been read, but before the content handler is activated.

So, after a request comes in and Apache has determined the corresponding server (or virtual server) the rewriting engine starts processing of all mod_rewrite directives from the per-server configuration in the URL-to-filename phase. A few steps later when the final data directories are found, the per-directory configuration directives of mod_rewrite are triggered in the Fixup phase. In both situations mod_rewrite rewrites URLs either to new URLs or to filenames, although there is no obvious distinction between them. This is a usage of the API which was not intended to be this way when the API was designed, but as of Apache 1.x this is the only way mod_rewrite can operate. To make this point more clear remember the following two points:

  1. Although mod_rewrite rewrites URLs to URLs, URLs to filenames and even filenames to filenames, the API currently provides only a URL-to-filename hook. In Apache 2.0 the two missing hooks will be added to make the processing more clear. But this point has no drawbacks for the user, it is just a fact which should be remembered: Apache does more in the URL-to-filename hook than the API intends for it.
  2. Unbelievably mod_rewrite provides URL manipulations in per-directory context, i.e., within .htaccess files, although these are reached a very long time after the URLs have been translated to filenames. It has to be this way because .htaccess files live in the filesystem, so processing has already reached this stage. In other words: According to the API phases at this time it is too late for any URL manipulations. To overcome this chicken and egg problem mod_rewrite uses a trick: When you manipulate a URL/filename in per-directory context mod_rewrite first rewrites the filename back to its corresponding URL (which is usually impossible, but see the RewriteBase directive below for the trick to achieve this) and then initiates a new internal sub-request with the new URL. This restarts processing of the API phases.

    Again mod_rewrite tries hard to make this complicated step totally transparent to the user, but you should remember here: While URL manipulations in per-server context are really fast and efficient, per-directory rewrites are slow and inefficient due to this chicken and egg problem. But on the other hand this is the only way mod_rewrite can provide (locally restricted) URL manipulations to the average user.

Don't forget these two points!

Ruleset Processing

Now when mod_rewrite is triggered in these two API phases, it reads the configured rulesets from its configuration structure (which itself was either created on startup for per-server context or during the directory walk of the Apache kernel for per-directory context). Then the URL rewriting engine is started with the contained ruleset (one or more rules together with their conditions). The operation of the URL rewriting engine itself is exactly the same for both configuration contexts. Only the final result processing is different.

The order of rules in the ruleset is important because the rewriting engine processes them in a special (and not very obvious) order. The rule is this: The rewriting engine loops through the ruleset rule by rule (RewriteRule directives) and when a particular rule matches it optionally loops through existing corresponding conditions (RewriteCond directives). For historical reasons the conditions are given first, and so the control flow is a little bit long-winded. See Figure 1 for more details.

Flow of RewriteRule and RewriteCond matching
Figure 1:The control flow through the rewriting ruleset

As you can see, first the URL is matched against the Pattern of each rule. When it fails mod_rewrite immediately stops processing this rule and continues with the next rule. If the Pattern matches, mod_rewrite looks for corresponding rule conditions. If none are present, it just substitutes the URL with a new value which is constructed from the string Substitution and goes on with its rule-looping. But if conditions exist, it starts an inner loop for processing them in the order that they are listed. For conditions the logic is different: we don't match a pattern against the current URL. Instead we first create a string TestString by expanding variables, back-references, map lookups, etc. and then we try to match CondPattern against it. If the pattern doesn't match, the complete set of conditions and the corresponding rule fails. If the pattern matches, then the next condition is processed until no more conditions are available. If all conditions match, processing is continued with the substitution of the URL with Substitution.


Apache SSL/TLS Şifrelemesi - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Apache SSL/TLS Şifrelemesi

Apache HTTP Sunucusunun mod_ssl modülü, Güvenli Soketler Katmanı (SSL) ve Aktarım Katmanı Güvenliği (TLS) protokollerinin kullanıldığı Sağlam Şifreleme desteğini sağlayan OpenSSL kütüphanesine bir arayüz içerir. Bu modül ve belgeler Ralf S. Engelschall’ın mod_ssl projesine dayanmaktadır.

Belgeler

  • Giriş
  • Uyumluluk
  • NASIL
  • Sıkça Sorulan Sorular
  • Terimler

mod_ssl Modülü

Bu modülce sağlanan yönergeler ve ortam değişkenleri mod_ssl başvuru kılavuzunda ayrıntılı olarak açıklanmıştır.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


SSL/TLS Strong Encryption: An Introduction - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > SSL/TLS

SSL/TLS Strong Encryption: An Introduction

The nice thing about standards is that there are so many to choose from. And if you really don't like all the standards you just have to wait another year until the one arises you are looking for.

-- A. Tanenbaum, "Introduction to Computer Networks"

As an introduction this chapter is aimed at readers who are familiar with the Web, HTTP, and Apache, but are not security experts. It is not intended to be a definitive guide to the SSL protocol, nor does it discuss specific techniques for managing certificates in an organization, or the important legal issues of patents and import and export restrictions. Rather, it is intended to provide a common background to mod_ssl users by pulling together various concepts, definitions, and examples as a starting point for further exploration.

The presented content is mainly derived, with the author's permission, from the article Introducing SSL and Certificates using SSLeay by Frederick J. Hirsch, of The Open Group Research Institute, which was published in Web Security: A Matter of Trust, World Wide Web Journal, Volume 2, Issue 3, Summer 1997. Please send any positive feedback to Frederick Hirsch (the original article author) and all negative feedback to Ralf S. Engelschall (the mod_ssl author).

Cryptographic Techniques

Understanding SSL requires an understanding of cryptographic algorithms, message digest functions (aka. one-way or hash functions), and digital signatures. These techniques are the subject of entire books (see for instance [AC96]) and provide the basis for privacy, integrity, and authentication.

Cryptographic Algorithms

Suppose Alice wants to send a message to her bank to transfer some money. Alice would like the message to be private, since it will include information such as her account number and transfer amount. One solution is to use a cryptographic algorithm, a technique that would transform her message into an encrypted form, unreadable until it is decrypted. Once in this form, the message can only be decrypted by using a secret key. Without the key the message is useless: good cryptographic algorithms make it so difficult for intruders to decode the original text that it isn't worth their effort.

There are two categories of cryptographic algorithms: conventional and public key.

Conventional cryptography
also known as symmetric cryptography, requires the sender and receiver to share a key: a secret piece of information that may be used to encrypt or decrypt a message. As long as this key is kept secret, nobody other than the sender or recipient can read the message. If Alice and the bank know a secret key, then they can send each other private messages. The task of sharing a key between sender and recipient before communicating, while also keeping it secret from others, can be problematic.
Public key cryptography
also known as asymmetric cryptography, solves the key exchange problem by defining an algorithm which uses two keys, each of which may be used to encrypt a message. If one key is used to encrypt a message then the other must be used to decrypt it. This makes it possible to receive secure messages by simply publishing one key (the public key) and keeping the other secret (the private key).

Anyone can encrypt a message using the public key, but only the owner of the private key will be able to read it. In this way, Alice can send private messages to the owner of a key-pair (the bank), by encrypting them using their public key. Only the bank will be able to decrypt them.

Message Digests

Although Alice may encrypt her message to make it private, there is still a concern that someone might modify her original message or substitute it with a different one, in order to transfer the money to themselves, for instance. One way of guaranteeing the integrity of Alice's message is for her to create a concise summary of her message and send this to the bank as well. Upon receipt of the message, the bank creates its own summary and compares it with the one Alice sent. If the summaries are the same then the message has been received intact.

A summary such as this is called a message digest, one-way function or hash function. Message digests are used to create a short, fixed-length representation of a longer, variable-length message. Digest algorithms are designed to produce a unique digest for each message. Message digests are designed to make it impractically difficult to determine the message from the digest and (in theory) impossible to find two different messages which create the same digest -- thus eliminating the possibility of substituting one message for another while maintaining the same digest.

Another challenge that Alice faces is finding a way to send the digest to the bank securely; if the digest is not sent securely, its integrity may be compromised and with it the possibility for the bank to determine the integrity of the original message. Only if the digest is sent securely can the integrity of the associated message be determined.

One way to send the digest securely is to include it in a digital signature.

Digital Signatures

When Alice sends a message to the bank, the bank needs to ensure that the message is really from her, so an intruder cannot request a transaction involving her account. A digital signature, created by Alice and included with the message, serves this purpose.

Digital signatures are created by encrypting a digest of the message and other information (such as a sequence number) with the sender's private key. Though anyone can decrypt the signature using the public key, only the sender knows the private key. This means that only the sender can have signed the message. Including the digest in the signature means the signature is only good for that message; it also ensures the integrity of the message since no one can change the digest and still sign it.

To guard against interception and reuse of the signature by an intruder at a later date, the signature contains a unique sequence number. This protects the bank from a fraudulent claim from Alice that she did not send the message -- only she could have signed it (non-repudiation).

Certificates

Although Alice could have sent a private message to the bank, signed it and ensured the integrity of the message, she still needs to be sure that she is really communicating with the bank. This means that she needs to be sure that the public key she is using is part of the bank's key-pair, and not an intruder's. Similarly, the bank needs to verify that the message signature really was signed by the private key that belongs to Alice.

If each party has a certificate which validates the other's identity, confirms the public key and is signed by a trusted agency, then both can be assured that they are communicating with whom they think they are. Such a trusted agency is called a Certificate Authority and certificates are used for authentication.

Certificate Contents

A certificate associates a public key with the real identity of an individual, server, or other entity, known as the subject. As shown in Table 1, information about the subject includes identifying information (the distinguished name) and the public key. It also includes the identification and signature of the Certificate Authority that issued the certificate and the period of time during which the certificate is valid. It may have additional information (or extensions) as well as administrative information for the Certificate Authority's use, such as a serial number.

Table 1: Certificate Information

Subject | Distinguished Name, Public Key
Issuer | Distinguished Name, Signature
Period of Validity | Not Before Date, Not After Date
Administrative Information | Version, Serial Number
Extended Information | Basic Constraints, Netscape Flags, etc.

A distinguished name is used to provide an identity in a specific context -- for instance, an individual might have a personal certificate as well as one for their identity as an employee. Distinguished names are defined by the X.509 standard [X509], which defines the fields, field names and abbreviations used to refer to the fields (see Table 2).

Table 2: Distinguished Name Information

DN Field | Abbrev. | Description | Example
Common Name | CN | Name being certified | CN=Joe Average
Organization or Company | O | Name is associated with this organization | O=Snake Oil, Ltd.
Organizational Unit | OU | Name is associated with this organization unit, such as a department | OU=Research Institute
City/Locality | L | Name is located in this City | L=Snake City
State/Province | ST | Name is located in this State/Province | ST=Desert
Country | C | Name is located in this Country (ISO code) | C=XZ

A Certificate Authority may define a policy specifying which distinguished field names are optional and which are required. It may also place requirements upon the field contents, as may users of certificates. For example, a Netscape browser requires that the Common Name for a certificate representing a server matches a wildcard pattern for the domain name of that server, such as *.snakeoil.com.

The binary format of a certificate is defined using the ASN.1 notation [X208] [PKCS]. This notation defines how to specify the contents and encoding rules define how this information is translated into binary form. The binary encoding of the certificate is defined using Distinguished Encoding Rules (DER), which are based on the more general Basic Encoding Rules (BER). For those transmissions which cannot handle binary, the binary form may be translated into an ASCII form by using Base64 encoding [MIME]. When placed between begin and end delimiter lines (as below), this encoded version is called a PEM ("Privacy Enhanced Mail") encoded certificate.

Example of a PEM-encoded certificate (snakeoil.crt)

-----BEGIN CERTIFICATE-----
MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCWFkx
FTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjEXMBUG
A1UEChMOU25ha2UgT2lsLCBMdGQxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhv
cml0eTEVMBMGA1UEAxMMU25ha2UgT2lsIENBMR4wHAYJKoZIhvcNAQkBFg9jYUBz
bmFrZW9pbC5kb20wHhcNOTgxMDIxMDg1ODM2WhcNOTkxMDIxMDg1ODM2WjCBpzEL
MAkGA1UEBhMCWFkxFTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25h
a2UgVG93bjEXMBUGA1UEChMOU25ha2UgT2lsLCBMdGQxFzAVBgNVBAsTDldlYnNl
cnZlciBUZWFtMRkwFwYDVQQDExB3d3cuc25ha2VvaWwuZG9tMR8wHQYJKoZIhvcN
AQkBFhB3d3dAc25ha2VvaWwuZG9tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
gQDH9Ge/s2zcH+da+rPTx/DPRp3xGjHZ4GG6pCmvADIEtBtKBFAcZ64n+Dy7Np8b
vKR+yy5DGQiijsH1D/j8HlGE+q4TZ8OFk7BNBFazHxFbYI4OKMiCxdKzdif1yfaa
lWoANFlAzlSdbxeGVHoT0K+gT5w3UxwZKv2DLbCTzLZyPwIDAQABoyYwJDAPBgNV
HRMECDAGAQH/AgEAMBEGCWCGSAGG+EIBAQQEAwIAQDANBgkqhkiG9w0BAQQFAAOB
gQAZUIHAL4D09oE6Lv2k56Gp38OBDuILvwLg1v1KL8mQR+KFjghCrtpqaztZqcDt
2q2QoyulCgSzHbEGmi0EsdkPfg6mp0penssIFePYNI+/8u9HT4LuKMJX15hxBam7
dUHzICxBVC1lnHyYGjDuAMhe396lYAn8bCld1/L4NMGBCQ==
-----END CERTIFICATE-----

Certificate Authorities

By verifying the information in a certificate request before granting the certificate, the Certificate Authority assures itself of the identity of the private key owner of a key-pair. For instance, if Alice requests a personal certificate, the Certificate Authority must first make sure that Alice really is the person the certificate request claims she is.

Certificate Chains

A Certificate Authority may also issue a certificate for another Certificate Authority. When examining a certificate, Alice may need to examine the certificate of the issuer, for each parent Certificate Authority, until reaching one which she has confidence in. She may decide to trust only certificates with a limited chain of issuers, to reduce her risk of a "bad" certificate in the chain.

Creating a Root-Level CA

As noted earlier, each certificate requires an issuer to assert the validity of the identity of the certificate subject, up to the top-level Certificate Authority (CA). This presents a problem: who can vouch for the certificate of the top-level authority, which has no issuer? In this unique case, the certificate is "self-signed", so the issuer of the certificate is the same as the subject. Browsers are preconfigured to trust well-known certificate authorities, but it is important to exercise extra care in trusting a self-signed certificate. The wide publication of a public key by the root authority reduces the risk in trusting this key -- it would be obvious if someone else publicized a key claiming to be the authority.

A number of companies, such as Thawte and VeriSign have established themselves as Certificate Authorities. These companies provide the following services:

  • Verifying certificate requests
  • Processing certificate requests
  • Issuing and managing certificates

It is also possible to create your own Certificate Authority. Although risky in the Internet environment, it may be useful within an Intranet where the organization can easily verify the identities of individuals and servers.

Certificate Management

Establishing a Certificate Authority is a responsibility which requires a solid administrative, technical and management framework. Certificate Authorities not only issue certificates, they also manage them -- that is, they determine for how long certificates remain valid, they renew them and keep lists of certificates that were issued in the past but are no longer valid (Certificate Revocation Lists, or CRLs).

For example, if Alice is entitled to a certificate as an employee of a company but has now left that company, her certificate may need to be revoked. Because certificates are only issued after the subject's identity has been verified and can then be passed around to all those with whom the subject may communicate, it is impossible to tell from the certificate alone that it has been revoked. Therefore when examining certificates for validity it is necessary to contact the issuing Certificate Authority to check CRLs -- this is usually not an automated part of the process.

Note

If you use a Certificate Authority that browsers are not configured to trust by default, it is necessary to load the Certificate Authority certificate into the browser, enabling the browser to validate server certificates signed by that Certificate Authority. Doing so may be dangerous, since once loaded, the browser will accept all certificates signed by that Certificate Authority.

Secure Sockets Layer (SSL)

The Secure Sockets Layer protocol is a protocol layer which may be placed between a reliable connection-oriented network layer protocol (e.g. TCP/IP) and the application protocol layer (e.g. HTTP). SSL provides for secure communication between client and server by allowing mutual authentication, the use of digital signatures for integrity and encryption for privacy.

The protocol is designed to support a range of choices for specific algorithms used for cryptography, digests and signatures. This allows algorithm selection for specific servers to be made based on legal, export or other concerns and also enables the protocol to take advantage of new algorithms. Choices are negotiated between client and server when establishing a protocol session.

Table 4: Versions of the SSL protocol

Version | Source | Description | Browser Support
SSL v2.0 | Vendor Standard (from Netscape Corp.) [SSL2] | First SSL protocol for which implementations exist | - NS Navigator 1.x/2.x - MS IE 3.x - Lynx/2.8+OpenSSL
SSL v3.0 | Expired Internet Draft (from Netscape Corp.) [SSL3] | Revisions to prevent specific security attacks, add non-RSA ciphers and support for certificate chains | - NS Navigator 2.x/3.x/4.x - MS IE 3.x/4.x - Lynx/2.8+OpenSSL
TLS v1.0 | Proposed Internet Standard (from IETF) [TLS1] | Revision of SSL 3.0 to update the MAC layer to HMAC, add block padding for block ciphers, message order standardization and more alert messages. | - Lynx/2.8+OpenSSL

There are a number of versions of the SSL protocol, as shown in Table 4. As noted there, one of the benefits in SSL 3.0 is that it adds support of certificate chain loading. This feature allows a server to pass a server certificate along with issuer certificates to the browser. Chain loading also permits the browser to validate the server certificate, even if Certificate Authority certificates are not installed for the intermediate issuers, since they are included in the certificate chain. SSL 3.0 is the basis for the Transport Layer Security [TLS] protocol standard, currently in development by the Internet Engineering Task Force (IETF).

Establishing a Session

The SSL session is established by following a handshake sequence between client and server, as shown in Figure 1. This sequence may vary, depending on whether the server is configured to provide a server certificate or request a client certificate. Although cases exist where additional handshake steps are required for management of cipher information, this article summarizes one common scenario. See the SSL specification for the full range of possibilities.

Note

Once an SSL session has been established, it may be reused. This avoids the performance penalty of repeating the many steps needed to start a session. To do this, the server assigns each SSL session a unique session identifier which is cached in the server and which the client can use in future connections to reduce the handshake time (until the session identifer expires from the cache of the server).

Figure 1: Simplified SSL Handshake Sequence

The elements of the handshake sequence, as used by the client and server, are listed below:

  1. Negotiate the Cipher Suite to be used during data transfer
  2. Establish and share a session key between client and server
  3. Optionally authenticate the server to the client
  4. Optionally authenticate the client to the server

The first step, Cipher Suite Negotiation, allows the client and server to choose a Cipher Suite supported by both of them. The SSL3.0 protocol specification defines 31 Cipher Suites. A Cipher Suite is defined by the following components:

  • Key Exchange Method
  • Cipher for Data Transfer
  • Message Digest for creating the Message Authentication Code (MAC)

These three elements are described in the sections that follow.

Key Exchange Method

The key exchange method defines how the shared secret symmetric cryptography key used for application data transfer will be agreed upon by client and server. SSL 2.0 uses RSA key exchange only, while SSL 3.0 supports a choice of key exchange algorithms including RSA key exchange (when certificates are used), and Diffie-Hellman key exchange (for exchanging keys without certificates, or without prior communication between client and server).

One variable in the choice of key exchange methods is digital signatures -- whether or not to use them, and if so, what kind of signatures to use. Signing with a private key provides protection against a man-in-the-middle-attack during the information exchange used to generating the shared key [AC96, p516].

Cipher for Data Transfer

SSL uses conventional symmetric cryptography, as described earlier, for encrypting messages in a session. There are nine choices of how to encrypt, including the option not to encrypt:

  • No encryption
  • Stream Ciphers
    • RC4 with 40-bit keys
    • RC4 with 128-bit keys
  • CBC Block Ciphers
    • RC2 with 40 bit key
    • DES with 40 bit key
    • DES with 56 bit key
    • Triple-DES with 168 bit key
    • Idea (128 bit key)
    • Fortezza (96 bit key)

"CBC" refers to Cipher Block Chaining, which means that a portion of the previously encrypted cipher text is used in the encryption of the current block. "DES" refers to the Data Encryption Standard [AC96, ch12], which has a number of variants (including DES40 and 3DES_EDE). "Idea" is currently one of the best and cryptographically strongest algorithms available, and "RC2" is a proprietary algorithm from RSA DSI [AC96, ch13].

Digest Function

The choice of digest function determines how a digest is created from a record unit. SSL supports the following:

  • No digest (Null choice)
  • MD5, a 128-bit hash
  • Secure Hash Algorithm (SHA-1), a 160-bit hash

The message digest is used to create a Message Authentication Code (MAC) which is encrypted with the message to verify integrity and to protect against replay attacks.

Handshake Sequence Protocol

The handshake sequence uses three protocols:

  • The SSL Handshake Protocol for performing the client and server SSL session establishment.
  • The SSL Change Cipher Spec Protocol for actually establishing agreement on the Cipher Suite for the session.
  • The SSL Alert Protocol for conveying SSL error messages between client and server.

These protocols, as well as application protocol data, are encapsulated in the SSL Record Protocol, as shown in Figure 2. An encapsulated protocol is transferred as data by the lower layer protocol, which does not examine the data. The encapsulated protocol has no knowledge of the underlying protocol.

Figure 2: SSL Protocol Stack

The encapsulation of SSL control protocols by the record protocol means that if an active session is renegotiated the control protocols will be transmitted securely. If there was no previous session, the Null cipher suite is used, which means there will be no encryption and messages will have no integrity digests, until the session has been established.

Data Transfer

The SSL Record Protocol, shown in Figure 3, is used to transfer application and SSL Control data between the client and server, where necessary fragmenting this data into smaller units, or combining multiple higher level protocol data messages into single units. It may compress, attach digest signatures, and encrypt these units before transmitting them using the underlying reliable transport protocol (Note: currently, no major SSL implementations include support for compression).

Figure 3: SSL Record Protocol

Securing HTTP Communication

One common use of SSL is to secure Web HTTP communication between a browser and a webserver. This does not preclude the use of non-secured HTTP - the secure version (called HTTPS) is the same as plain HTTP over SSL, but uses the URL scheme https rather than http, and a different server port (by default, port 443). This functionality is a large part of what mod_ssl provides for the Apache webserver.

References

[AC96]
Bruce Schneier, Applied Cryptography, 2nd Edition, Wiley, 1996. See http://www.counterpane.com/ for various other materials by Bruce Schneier.
[X208]
ITU-T Recommendation X.208, Specification of Abstract Syntax Notation One (ASN.1), 1988. See for instance http://www.itu.int/rec/recommendation.asp?type=items&lang=e&parent=T-REC-X.208-198811-I.
[X509]
ITU-T Recommendation X.509, The Directory - Authentication Framework. See for instance http://www.itu.int/rec/recommendation.asp?type=folders&lang=e&parent=T-REC-X.509.
[PKCS]
Public Key Cryptography Standards (PKCS), RSA Laboratories Technical Notes, See http://www.rsasecurity.com/rsalabs/pkcs/.
[MIME]
N. Freed, N. Borenstein, Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies, RFC2045. See for instance http://ietf.org/rfc/rfc2045.txt.
[SSL2]
Kipp E.B. Hickman, The SSL Protocol, 1995. See http://www.netscape.com/eng/security/SSL_2.html.
[SSL3]
Alan O. Freier, Philip Karlton, Paul C. Kocher, The SSL Protocol Version 3.0, 1996. See http://www.netscape.com/eng/ssl3/draft302.txt.
[TLS1]
Tim Dierks, Christopher Allen, The TLS Protocol Version 1.0, 1999. See http://ietf.org/rfc/rfc2246.txt.


SSL/TLS Strong Encryption: Compatibility - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > SSL/TLS

SSL/TLS Strong Encryption: Compatibility

This page covers backwards compatibility between mod_ssl and other SSL solutions. mod_ssl is not the only SSL solution for Apache; four additional products are (or were) also available: Ben Laurie's freely available Apache-SSL (from where mod_ssl were originally derived in 1998), Red Hat's commercial Secure Web Server (which was based on mod_ssl), Covalent's commercial Raven SSL Module (also based on mod_ssl) and finally C2Net's (now Red Hat's) commercial product Stronghold (based on a different evolution branch named Sioux up to Stronghold 2.x and based on mod_ssl since Stronghold 3.x).

mod_ssl mostly provides a superset of the functionality of all the other solutions, so it's simple to migrate from one of the older modules to mod_ssl. The configuration directives and environment variable names used by the older SSL solutions vary from those used in mod_ssl; mapping tables are included here to give the equivalents used by mod_ssl.

Configuration Directives

The mapping between configuration directives used by Apache-SSL 1.x and mod_ssl 2.0.x is given in Table 1. The mapping from Sioux 1.x and Stronghold 2.x is only partial because of special functionality in these interfaces which mod_ssl doesn't provide.

Table 1: Configuration Directive Mapping

Old Directive | mod_ssl Directive | Comment
Apache-SSL 1.x & mod_ssl 2.0.x compatibility:
SSLEnable | SSLEngine on | compactified
SSLDisable | SSLEngine off | compactified
SSLLogFile file | - | Use per-module LogLevel setting instead.
SSLRequiredCiphers spec | SSLCipherSuite spec | renamed
SSLRequireCipher c1 ... | SSLRequire %{SSL_CIPHER} in {"c1", ...} | generalized
SSLBanCipher c1 ... | SSLRequire not (%{SSL_CIPHER} in {"c1", ...}) | generalized
SSLFakeBasicAuth | SSLOptions +FakeBasicAuth | merged
SSLCacheServerPath dir | - | functionality removed
SSLCacheServerPort integer | - | functionality removed
Apache-SSL 1.x compatibility:
SSLExportClientCertificates | SSLOptions +ExportCertData | merged
SSLCacheServerRunDir dir | - | functionality not supported
Sioux 1.x compatibility:
SSL_CertFile file | SSLCertificateFile file | renamed
SSL_KeyFile file | SSLCertificateKeyFile file | renamed
SSL_CipherSuite arg | SSLCipherSuite arg | renamed
SSL_X509VerifyDir arg | SSLCACertificatePath arg | renamed
SSL_Log file | - | Use per-module LogLevel setting instead.
SSL_Connect flag | SSLEngine flag | renamed
SSL_ClientAuth arg | SSLVerifyClient arg | renamed
SSL_X509VerifyDepth arg | SSLVerifyDepth arg | renamed
SSL_FetchKeyPhraseFrom arg | - | not directly mappable; use SSLPassPhraseDialog
SSL_SessionDir dir | - | not directly mappable; use SSLSessionCache
SSL_Require expr | - | not directly mappable; use SSLRequire
SSL_CertFileType arg | - | functionality not supported
SSL_KeyFileType arg | - | functionality not supported
SSL_X509VerifyPolicy arg | - | functionality not supported
SSL_LogX509Attributes arg | - | functionality not supported
Stronghold 2.x compatibility:
StrongholdAccelerator engine | SSLCryptoDevice engine | renamed
StrongholdKey dir | - | functionality not needed
StrongholdLicenseFile dir | - | functionality not needed
SSLFlag flag | SSLEngine flag | renamed
SSLSessionLockFile file | SSLMutex file | renamed
SSLCipherList spec | SSLCipherSuite spec | renamed
RequireSSL | SSLRequireSSL | renamed
SSLErrorFile file | - | functionality not supported
SSLRoot dir | - | functionality not supported
SSL_CertificateLogDir dir | - | functionality not supported
AuthCertDir dir | - | functionality not supported
SSL_Group name | - | functionality not supported
SSLProxyMachineCertPath dir | SSLProxyMachineCertificatePath dir | renamed
SSLProxyMachineCertFile file | SSLProxyMachineCertificateFile file | renamed
SSLProxyCipherList spec | SSLProxyCipherSpec spec | renamed

Environment Variables

The mapping between environment variable names used by the older SSL solutions and the names used by mod_ssl is given in Table 2.

Table 2: Environment Variable Derivation

Old Variable | mod_ssl Variable | Comment
SSL_PROTOCOL_VERSION | SSL_PROTOCOL | renamed
SSLEAY_VERSION | SSL_VERSION_LIBRARY | renamed
HTTPS_SECRETKEYSIZE | SSL_CIPHER_USEKEYSIZE | renamed
HTTPS_KEYSIZE | SSL_CIPHER_ALGKEYSIZE | renamed
HTTPS_CIPHER | SSL_CIPHER | renamed
HTTPS_EXPORT | SSL_CIPHER_EXPORT | renamed
SSL_SERVER_KEY_SIZE | SSL_CIPHER_ALGKEYSIZE | renamed
SSL_SERVER_CERTIFICATE | SSL_SERVER_CERT | renamed
SSL_SERVER_CERT_START | SSL_SERVER_V_START | renamed
SSL_SERVER_CERT_END | SSL_SERVER_V_END | renamed
SSL_SERVER_CERT_SERIAL | SSL_SERVER_M_SERIAL | renamed
SSL_SERVER_SIGNATURE_ALGORITHM | SSL_SERVER_A_SIG | renamed
SSL_SERVER_DN | SSL_SERVER_S_DN | renamed
SSL_SERVER_CN | SSL_SERVER_S_DN_CN | renamed
SSL_SERVER_EMAIL | SSL_SERVER_S_DN_Email | renamed
SSL_SERVER_O | SSL_SERVER_S_DN_O | renamed
SSL_SERVER_OU | SSL_SERVER_S_DN_OU | renamed
SSL_SERVER_C | SSL_SERVER_S_DN_C | renamed
SSL_SERVER_SP | SSL_SERVER_S_DN_SP | renamed
SSL_SERVER_L | SSL_SERVER_S_DN_L | renamed
SSL_SERVER_IDN | SSL_SERVER_I_DN | renamed
SSL_SERVER_ICN | SSL_SERVER_I_DN_CN | renamed
SSL_SERVER_IEMAIL | SSL_SERVER_I_DN_Email | renamed
SSL_SERVER_IO | SSL_SERVER_I_DN_O | renamed
SSL_SERVER_IOU | SSL_SERVER_I_DN_OU | renamed
SSL_SERVER_IC | SSL_SERVER_I_DN_C | renamed
SSL_SERVER_ISP | SSL_SERVER_I_DN_SP | renamed
SSL_SERVER_IL | SSL_SERVER_I_DN_L | renamed
SSL_CLIENT_CERTIFICATE | SSL_CLIENT_CERT | renamed
SSL_CLIENT_CERT_START | SSL_CLIENT_V_START | renamed
SSL_CLIENT_CERT_END | SSL_CLIENT_V_END | renamed
SSL_CLIENT_CERT_SERIAL | SSL_CLIENT_M_SERIAL | renamed
SSL_CLIENT_SIGNATURE_ALGORITHM | SSL_CLIENT_A_SIG | renamed
SSL_CLIENT_DN | SSL_CLIENT_S_DN | renamed
SSL_CLIENT_CN | SSL_CLIENT_S_DN_CN | renamed
SSL_CLIENT_EMAIL | SSL_CLIENT_S_DN_Email | renamed
SSL_CLIENT_O | SSL_CLIENT_S_DN_O | renamed
SSL_CLIENT_OU | SSL_CLIENT_S_DN_OU | renamed
SSL_CLIENT_C | SSL_CLIENT_S_DN_C | renamed
SSL_CLIENT_SP | SSL_CLIENT_S_DN_SP | renamed
SSL_CLIENT_L | SSL_CLIENT_S_DN_L | renamed
SSL_CLIENT_IDN | SSL_CLIENT_I_DN | renamed
SSL_CLIENT_ICN | SSL_CLIENT_I_DN_CN | renamed
SSL_CLIENT_IEMAIL | SSL_CLIENT_I_DN_Email | renamed
SSL_CLIENT_IO | SSL_CLIENT_I_DN_O | renamed
SSL_CLIENT_IOU | SSL_CLIENT_I_DN_OU | renamed
SSL_CLIENT_IC | SSL_CLIENT_I_DN_C | renamed
SSL_CLIENT_ISP | SSL_CLIENT_I_DN_SP | renamed
SSL_CLIENT_IL | SSL_CLIENT_I_DN_L | renamed
SSL_EXPORT | SSL_CIPHER_EXPORT | renamed
SSL_KEYSIZE | SSL_CIPHER_ALGKEYSIZE | renamed
SSL_SECKEYSIZE | SSL_CIPHER_USEKEYSIZE | renamed
SSL_SSLEAY_VERSION | SSL_VERSION_LIBRARY | renamed
SSL_STRONG_CRYPTO | - | Not supported by mod_ssl
SSL_SERVER_KEY_EXP | - | Not supported by mod_ssl
SSL_SERVER_KEY_ALGORITHM | - | Not supported by mod_ssl
SSL_SERVER_KEY_SIZE | - | Not supported by mod_ssl
SSL_SERVER_SESSIONDIR | - | Not supported by mod_ssl
SSL_SERVER_CERTIFICATELOGDIR | - | Not supported by mod_ssl
SSL_SERVER_CERTFILE | - | Not supported by mod_ssl
SSL_SERVER_KEYFILE | - | Not supported by mod_ssl
SSL_SERVER_KEYFILETYPE | - | Not supported by mod_ssl
SSL_CLIENT_KEY_EXP | - | Not supported by mod_ssl
SSL_CLIENT_KEY_ALGORITHM | - | Not supported by mod_ssl
SSL_CLIENT_KEY_SIZE | - | Not supported by mod_ssl

Custom Log Functions

When mod_ssl is enabled, additional functions exist for the Custom Log Format of mod_log_config as documented in the Reference Chapter. Beside the ``%{varname}x'' eXtension format function which can be used to expand any variables provided by any module, an additional Cryptography ``%{name}c'' cryptography format function exists for backward compatibility. The currently implemented function calls are listed in Table 3.

Table 3: Custom Log Cryptography Function

Function Call | Description
%...{version}c | SSL protocol version
%...{cipher}c | SSL cipher
%...{subjectdn}c | Client Certificate Subject Distinguished Name
%...{issuerdn}c | Client Certificate Issuer Distinguished Name
%...{errcode}c | Certificate Verification Error (numerical)
%...{errstr}c | Certificate Verification Error (string)


SSL/TLS Strong Encryption: How-To - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > SSL/TLS

SSL/TLS Strong Encryption: How-To

The solution to this problem is trivial and is left as an exercise for the reader.

-- Standard textbook cookie

How to solve particular security problems for an SSL-aware webserver is not always obvious because of the interactions between SSL, HTTP and Apache's way of processing requests. This chapter gives instructions on how to solve some typical situations. Treat it as a first step to find out the final solution, but always try to understand the stuff before you use it. Nothing is worse than using a security solution without knowing its restrictions and how it interacts with other systems.

Cipher Suites and Enforcing Strong Security

  • How can I create a real SSLv2-only server?
  • How can I create an SSL server which accepts strong encryption only?
  • How can I create an SSL server which accepts strong encryption only, but allows export browsers to upgrade to stronger encryption?
  • How can I create an SSL server which accepts all types of ciphers in general, but requires a strong cipher for access to a particular URL?

How can I create a real SSLv2-only server?

The following creates an SSL server which speaks only the SSLv2 protocol and its ciphers.

httpd.conf

SSLProtocol -all +SSLv2
SSLCipherSuite SSLv2:+HIGH:+MEDIUM:+LOW:+EXP

How can I create an SSL server which accepts strong encryption only?

The following enables only the seven strongest ciphers:

httpd.conf

SSLProtocol all
SSLCipherSuite HIGH:MEDIUM

How can I create an SSL server which accepts strong encryption only, but allows export browsers to upgrade to stronger encryption?

This facility is called Server Gated Cryptography (SGC) and requires a Global ID server certificate, signed by a special CA certificate from Verisign. This enables strong encryption in 'export' versions of browsers, which traditionally could not support it (because of US export restrictions).

When a browser connects with an export cipher, the server sends its Global ID certificate. The browser verifies this, and can then upgrade its cipher suite before any HTTP communication takes place. The problem lies in allowing browsers to upgrade in this fashion, but still requiring strong encryption. In other words, we want browsers to either start a connection with strong encryption, or to start with export ciphers but upgrade to strong encryption before beginning HTTP communication.

This can be done as follows:

httpd.conf

# allow all ciphers for the initial handshake,
# so export browsers can upgrade via SGC facility
SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

<Directory /usr/local/apache2/htdocs>
# but finally deny all browsers which haven't upgraded
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
</Directory>

How can I create an SSL server which accepts all types of ciphers in general, but requires a strong ciphers for access to a particular URL?

Obviously, a server-wide SSLCipherSuite which restricts ciphers to the strong variants, isn't the answer here. However, mod_ssl can be reconfigured within Location blocks, to give a per-directory solution, and can automatically force a renegotiation of the SSL parameters to meet the new configuration. This can be done as follows:

# be liberal in general
SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL

<Location /strong/area>
# but https://hostname/strong/area/ and below
# requires strong ciphers
SSLCipherSuite HIGH:MEDIUM
</Location>

Client Authentication and Access Control

  • How can I force clients to authenticate using certificates?
  • How can I force clients to authenticate using certificates for a particular URL, but still allow arbitrary clients to access the rest of the server?
  • How can I allow only clients who have certificates to access a particular URL, but allow all clients to access the rest of the server?
  • How can I require HTTPS with strong ciphers, and either basic authentication or client certificates, for access to part of the Intranet website, for clients coming from the Internet?

How can I force clients to authenticate using certificates?

When you know all of your users (eg, as is often the case on a corporate Intranet), you can require plain certificate authentication. All you need to do is to create client certificates signed by your own CA certificate (ca.crt) and then verify the clients against this certificate.

httpd.conf

# require a client certificate which has to be directly
# signed by our CA certificate in ca.crt
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile conf/ssl.crt/ca.crt

How can I force clients to authenticate using certificates for a particular URL, but still allow arbitrary clients to access the rest of the server?

To force clients to authenticate using certificates for a particular URL, you can use the per-directory reconfiguration features of mod_ssl:

httpd.conf

SSLVerifyClient none
SSLCACertificateFile conf/ssl.crt/ca.crt

<Location /secure/area>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>

How can I allow only clients who have certificates to access a particular URL, but allow all clients to access the rest of the server?

The key to doing this is checking that part of the client certificate matches what you expect. Usually this means checking all or part of the Distinguished Name (DN), to see if it contains some known string. There are two ways to do this, using either mod_auth_basic or SSLRequire.

The mod_auth_basic method is generally required when the certificates are completely arbitrary, or when their DNs have no common fields (usually the organisation, etc.). In this case, you should establish a password database containing all clients allowed, as follows:

httpd.conf

SSLCACertificateFile conf/ssl.crt/ca.crt
SSLCACertificatePath conf/ssl.crt
SSLVerifyClient      none

<Directory /usr/local/apache2/htdocs/secure/area>
SSLVerifyClient      require
SSLVerifyDepth       5
SSLOptions           +FakeBasicAuth
SSLRequireSSL
AuthName             "Snake Oil Authentication"
AuthType             Basic
AuthBasicProvider    file
AuthUserFile         /usr/local/apache2/conf/httpd.passwd
Require              valid-user
</Directory>

The password used in this example is the DES encrypted string "password". See the SSLOptions docs for more information.

httpd.passwd

/C=DE/L=Munich/O=Snake Oil, Ltd./OU=Staff/CN=Foo:xxj31ZMTZzkVA
/C=US/L=S.F./O=Snake Oil, Ltd./OU=CA/CN=Bar:xxj31ZMTZzkVA
/C=US/L=L.A./O=Snake Oil, Ltd./OU=Dev/CN=Quux:xxj31ZMTZzkVA

When your clients are all part of a common hierarchy, which is encoded into the DN, you can match them more easily using SSLRequire, as follows:

httpd.conf

SSLVerifyClient      none
SSLCACertificateFile conf/ssl.crt/ca.crt
SSLCACertificatePath conf/ssl.crt

<Directory /usr/local/apache2/htdocs/secure/area>
  SSLVerifyClient      require
  SSLVerifyDepth       5
  SSLOptions           +FakeBasicAuth
  SSLRequireSSL
  SSLRequire       %{SSL_CLIENT_S_DN_O}  eq "Snake Oil, Ltd." \
               and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}
</Directory>

How can I require HTTPS with strong ciphers, and either basic authentication or client certificates, for access to part of the Intranet website, for clients coming from the Internet? I still want to allow plain HTTP access for clients on the Intranet.

These examples presume that clients on the Intranet have IPs in the range 192.168.1.0/24, and that the part of the Intranet website you want to allow internet access to is /usr/local/apache2/htdocs/subarea. This configuration should remain outside of your HTTPS virtual host, so that it applies to both HTTPS and HTTP.

httpd.conf

SSLCACertificateFile conf/ssl.crt/company-ca.crt

<Directory /usr/local/apache2/htdocs>
#   Outside the subarea only Intranet access is granted
Order                deny,allow
Deny                 from all
Allow                from 192.168.1.0/24
</Directory>

<Directory /usr/local/apache2/htdocs/subarea>
#   Inside the subarea any Intranet access is allowed
#   but from the Internet only HTTPS + Strong-Cipher + Password
#   or the alternative HTTPS + Strong-Cipher + Client-Certificate

#   If HTTPS is used, make sure a strong cipher is used.
#   Additionally allow client certs as alternative to basic auth.
SSLVerifyClient      optional
SSLVerifyDepth       1
SSLOptions           +FakeBasicAuth +StrictRequire
SSLRequire           %{SSL_CIPHER_USEKEYSIZE} >= 128

#   Force clients from the Internet to use HTTPS
RewriteEngine        on
RewriteCond          %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$
RewriteCond          %{HTTPS} !=on
RewriteRule          .* - [F]

#   Allow Network Access and/or Basic Auth
Satisfy              any

#   Network Access Control
Order                deny,allow
Deny                 from all
Allow                192.168.1.0/24

#   HTTP Basic Authentication
AuthType             basic
AuthName             "Protected Intranet Area"
AuthBasicProvider    file
AuthUserFile         conf/protected.passwd
Require              valid-user
</Directory>

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


SSL/TLS Strong Encryption: FAQ - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > SSL/TLS

SSL/TLS Strong Encryption: FAQ

The wise man doesn't give the right answers, he poses the right questions.

-- Claude Levi-Strauss

This chapter is a collection of frequently asked questions (FAQ) and corresponding answers following the popular USENET tradition. Most of these questions occurred on the Newsgroup comp.infosystems.www.servers.unix or the mod_ssl Support Mailing List modssl-users@modssl.org. They are collected at this place to avoid answering the same questions over and over.

Please read this chapter at least once when installing mod_ssl or at least search for your problem here before submitting a problem report to the author.

About The Module

  • What is the history of mod_ssl?
  • mod_ssl and Wassenaar Arrangement?

What is the history of mod_ssl?

The mod_ssl v1 package was initially created in April 1998 by Ralf S. Engelschall via porting Ben Laurie's Apache-SSL 1.17 source patches for Apache 1.2.6 to Apache 1.3b6. Because of conflicts with Ben Laurie's development cycle it then was re-assembled from scratch for Apache 1.3.0 by merging the old mod_ssl 1.x with the newer Apache-SSL 1.18. From this point on mod_ssl lived its own life as mod_ssl v2. The first publicly released version was mod_ssl 2.0.0 from August 10th, 1998.

After US export restrictions on cryptographic software were loosened, mod_ssl became part of the Apache HTTP Server with the release of Apache httpd 2.

Is mod_ssl affected by the Wassenaar Arrangement?

First, let us explain what Wassenaar and its Arrangement on Export Controls for Conventional Arms and Dual-Use Goods and Technologies is: This is a international regime, established in 1995, to control trade in conventional arms and dual-use goods and technology. It replaced the previous CoCom regime. Further details on both the Arrangement and its signatories are available at http://www.wassenaar.org/.

In short, the aim of the Wassenaar Arrangement is to prevent the build up of military capabilities that threaten regional and international security and stability. The Wassenaar Arrangement controls the export of cryptography as a dual-use good, that is, something that has both military and civilian applications. However, the Wassenaar Arrangement also provides an exemption from export controls for mass-market software and free software.

In the current Wassenaar List of Dual Use Goods and Technologies And Munitions, under GENERAL SOFTWARE NOTE (GSN) it says The Lists do not control "software" which is either: 1. [...] 2. "in the public domain". And under DEFINITIONS OF TERMS USED IN THESE LISTS we find In the public domain defined as "technology" or "software" which has been made available without restrictions upon its further dissemination. Note: Copyright restrictions do not remove "technology" or "software" from being "in the public domain".

So, both mod_ssl and OpenSSL are in the public domain for the purposes of the Wassenaar Arrangement and its List of Dual Use Goods and Technologies And Munitions List, and thus not affected by its provisions.

Installation

  • Why do I get permission errors related to SSLMutex when I start Apache?
  • Why does mod_ssl stop with the error "Failed to generate temporary 512 bit RSA private key" when I start Apache?

Why do I get permission errors related to SSLMutex when I start Apache?

Errors such as ``mod_ssl: Child could not open SSLMutex lockfile /opt/apache/logs/ssl_mutex.18332 (System error follows) [...] System: Permission denied (errno: 13)'' are usually caused by overly restrictive permissions on the parent directories. Make sure that all parent directories (here /opt, /opt/apache and /opt/apache/logs) have the x-bit set for, at minimum, the UID under which Apache's children are running (see the User directive).

Why does mod_ssl stop with the error "Failed to generate temporary 512 bit RSA private key" when I start Apache?

Cryptographic software needs a source of unpredictable data to work correctly. Many open source operating systems provide a "randomness device" that serves this purpose (usually named /dev/random). On other systems, applications have to seed the OpenSSL Pseudo Random Number Generator (PRNG) manually with appropriate data before generating keys or performing public key encryption. As of version 0.9.5, the OpenSSL functions that need randomness report an error if the PRNG has not been seeded with at least 128 bits of randomness.

To prevent this error, mod_ssl has to provide enough entropy to the PRNG to allow it to work correctly. This can be done via the SSLRandomSeed directive.

Configuration

  • Is it possible to provide HTTP and HTTPS from the same server?
  • Which port does HTTPS use?
  • How do I speak HTTPS manually for testing purposes?
  • Why does the connection hang when I connect to my SSL-aware Apache server?
  • Why do I get ``Connection Refused'' errors, when trying to access my newly installed Apache+mod_ssl server via HTTPS?
  • Why are the SSL_XXX variables not available to my CGI & SSI scripts?
  • How can I switch between HTTP and HTTPS in relative hyperlinks?

Is it possible to provide HTTP and HTTPS from the same server?

Yes. HTTP and HTTPS use different server ports (HTTP binds to port 80, HTTPS to port 443), so there is no direct conflict between them. You can either run two separate server instances bound to these ports, or use Apache's elegant virtual hosting facility to create two virtual servers, both served by the same instance of Apache - one responding over HTTP to requests on port 80, and the other responding over HTTPS to requests on port 443.

Which port does HTTPS use?

You can run HTTPS on any port, but the standards specify port 443, which is where any HTTPS compliant browser will look by default. You can force your browser to look on a different port by specifying it in the URL. For example, if your server is set up to serve pages over HTTPS on port 8080, you can access them at https://example.com:8080/

How do I speak HTTPS manually for testing purposes?

While you usually just use

$ telnet localhost 80
GET / HTTP/1.0

for simple testing of Apache via HTTP, it's not so easy for HTTPS because of the SSL protocol between TCP and HTTP. With the help of OpenSSL's s_client command, however, you can do a similar check via HTTPS:

$ openssl s_client -connect localhost:443 -state -debug
GET / HTTP/1.0

Before the actual HTTP response you will receive detailed information about the SSL handshake. For a more general command line client which directly understands both HTTP and HTTPS, can perform GET and POST operations, can use a proxy, supports byte ranges, etc. you should have a look at the nifty cURL tool. Using this, you can check that Apache is responding correctly to requests via HTTP and HTTPS as follows:

$ curl http://localhost/
$ curl https://localhost/

Why does the connection hang when I connect to my SSL-aware Apache server?

This can happen when you try to connect to a HTTPS server (or virtual server) via HTTP (eg, using http://example.com/ instead of https://example.com). It can also happen when trying to connect via HTTPS to a HTTP server (eg, using https://example.com/ on a server which doesn't support HTTPS, or which supports it on a non-standard port). Make sure that you're connecting to a (virtual) server that supports SSL.

Why do I get ``Connection Refused'' messages, when trying to access my newly installed Apache+mod_ssl server via HTTPS?

This error can be caused by an incorrect configuration. Please make sure that your Listen directives match your <VirtualHost> directives. If all else fails, please start afresh, using the default configuration provided by mod_ssl.

Why are the SSL_XXX variables not available to my CGI & SSI scripts?

Please make sure you have ``SSLOptions +StdEnvVars'' enabled for the context of your CGI/SSI requests.

How can I switch between HTTP and HTTPS in relative hyperlinks?

Usually, to switch between HTTP and HTTPS, you have to use fully-qualified hyperlinks (because you have to change the URL scheme). Using mod_rewrite however, you can manipulate relative hyperlinks, to achieve the same effect.

RewriteEngine on
RewriteRule ^/(.*)_SSL$ https://%{SERVER_NAME}/$1 [R,L]
RewriteRule ^/(.*)_NOSSL$ http://%{SERVER_NAME}/$1 [R,L]

This rewrite ruleset lets you use hyperlinks of the form <a href="document.html_SSL">, to switch to HTTPS in a relative link. (Replace SSL with NOSSL to switch to HTTP.)

Certificates

  • What are RSA Private Keys, CSRs and Certificates?
  • Is there a difference on startup between a non-SSL-aware Apache and an SSL-aware Apache?
  • How do I create a self-signed SSL Certificate for testing purposes?
  • How do I create a real SSL Certificate?
  • How do I create and use my own Certificate Authority (CA)?
  • How can I change the pass-phrase on my private key file?
  • How can I get rid of the pass-phrase dialog at Apache startup time?
  • How do I verify that a private key matches its Certificate?
  • Why do connections fail with an "alert bad certificate" error?
  • Why does my 2048-bit private key not work?
  • Why is client authentication broken after upgrading from SSLeay version 0.8 to 0.9?
  • How can I convert a certificate from PEM to DER format?
  • Why can't I find the getca or getverisign programs mentioned by Verisign, for installing my Verisign certificate?
  • Can I use the Server Gated Cryptography (SGC) facility (aka Verisign Global ID) with mod_ssl?
  • Why do browsers complain that they cannot verify my server certificate?

What are RSA Private Keys, CSRs and Certificates?

An RSA private key file is a digital file that you can use to decrypt messages sent to you. It has a public component which you distribute (via your Certificate file) which allows people to encrypt those messages to you.

A Certificate Signing Request (CSR) is a digital file which contains your public key and your name. You send the CSR to a Certifying Authority (CA), who will convert it into a real Certificate, by signing it.

A Certificate contains your RSA public key, your name, the name of the CA, and is digitally signed by the CA. Browsers that know the CA can verify the signature on that Certificate, thereby obtaining your RSA public key. That enables them to send messages which only you can decrypt.

See the Introduction chapter for a general description of the SSL protocol.

Is there a difference on startup between a non-SSL-aware Apache and an SSL-aware Apache?

Yes. In general, starting Apache with mod_ssl built-in is just like starting Apache without it. However, if you have a passphrase on your SSL private key file, a startup dialog will pop up which asks you to enter the pass phrase.

Having to manually enter the passphrase when starting the server can be problematic - for example, when starting the server from the system boot scripts. In this case, you can follow the steps below to remove the passphrase from your private key. Bear in mind that doing so brings additional security risks - proceed with caution!

How do I create a self-signed SSL Certificate for testing purposes?

  1. Make sure OpenSSL is installed and in your PATH.

  2. Run the following command, to create server.key and server.crt files:
    $ openssl req -new -x509 -nodes -out server.crt -keyout server.key
    These can be used as follows in your httpd.conf file:
                 SSLCertificateFile    /path/to/this/server.crt
             SSLCertificateKeyFile /path/to/this/server.key
  3. It is important that you are aware that this server.key does not have any passphrase. To add a passphrase to the key, you should run the following command, and enter & verify the passphrase as requested.

    $ openssl rsa -des3 -in server.key -out server.key.new
    $ mv server.key.new server.key

    Please backup the server.key file, and the passphrase you entered, in a secure location.

How do I create a real SSL Certificate?

Here is a step-by-step description:

  1. Make sure OpenSSL is installed and in your PATH.

  2. Create a RSA private key for your Apache server (will be Triple-DES encrypted and PEM formatted):

    $ openssl genrsa -des3 -out server.key 1024

    Please backup this server.key file and the pass-phrase you entered in a secure location. You can see the details of this RSA private key by using the command:

    $ openssl rsa -noout -text -in server.key

    If necessary, you can also create a decrypted PEM version (not recommended) of this RSA private key with:

    $ openssl rsa -in server.key -out server.key.unsecure

  3. Create a Certificate Signing Request (CSR) with the server RSA private key (output will be PEM formatted):

    $ openssl req -new -key server.key -out server.csr

    Make sure you enter the FQDN ("Fully Qualified Domain Name") of the server when OpenSSL prompts you for the "CommonName", i.e. when you generate a CSR for a website which will be later accessed via https://www.foo.dom/, enter "www.foo.dom" here. You can see the details of this CSR by using

    $ openssl req -noout -text -in server.csr

  4. You now have to send this Certificate Signing Request (CSR) to a Certifying Authority (CA) to be signed. Once the CSR has been signed, you will have a real Certificate, which can be used by Apache. You can have a CSR signed by a commercial CA, or you can create your own CA to sign it.
    Commercial CAs usually ask you to post the CSR into a web form, pay for the signing, and then send a signed Certificate, which you can store in a server.crt file. For more information about commercial CAs see the following locations:

    1. Verisign
      http://digitalid.verisign.com/server/apacheNotice.htm
    2. Thawte
      http://www.thawte.com/
    3. CertiSign Certificadora Digital Ltda.
      http://www.certisign.com.br
    4. IKS GmbH
      http://www.iks-jena.de/leistungen/ca/
    5. Uptime Commerce Ltd.
      http://www.uptimecommerce.com
    6. BelSign NV/SA
      http://www.belsign.be
    For details on how to create your own CA, and use this to sign a CSR, see below.
    Once your CSR has been signed, you can see the details of the Certificate as follows:

    $ openssl x509 -noout -text -in server.crt
  5. You should now have two files: server.key and server.crt. These can be used as follows in your httpd.conf file:
           SSLCertificateFile    /path/to/this/server.crt
       SSLCertificateKeyFile /path/to/this/server.key
    The server.csr file is no longer needed.

How do I create and use my own Certificate Authority (CA)?

The short answer is to use the CA.sh or CA.pl script provided by OpenSSL. Unless you have a good reason not to, you should use these for preference. If you cannot, you can create a self-signed Certificate as follows:

  1. Create a RSA private key for your server (will be Triple-DES encrypted and PEM formatted):

    $ openssl genrsa -des3 -out server.key 1024

    Please backup this server.key file and the pass-phrase you entered in a secure location. You can see the details of this RSA private key by using the command:

    $ openssl rsa -noout -text -in server.key

    If necessary, you can also create a decrypted PEM version (not recommended) of this RSA private key with:

    $ openssl rsa -in server.key -out server.key.unsecure

  2. Create a self-signed Certificate (X509 structure) with the RSA key you just created (output will be PEM formatted):

    $ openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt

    This signs the server CSR and results in a server.crt file.
    You can see the details of this Certificate using:

    $ openssl x509 -noout -text -in server.crt

How can I change the pass-phrase on my private key file?

You simply have to read it with the old pass-phrase and write it again, specifying the new pass-phrase. You can accomplish this with the following commands:

$ openssl rsa -des3 -in server.key -out server.key.new
$ mv server.key.new server.key

The first time you're asked for a PEM pass-phrase, you should enter the old pass-phrase. After that, you'll be asked again to enter a pass-phrase - this time, use the new pass-phrase. If you are asked to verify the pass-phrase, you'll need to enter the new pass-phrase a second time.

How can I get rid of the pass-phrase dialog at Apache startup time?

The reason this dialog pops up at startup and every re-start is that the RSA private key inside your server.key file is stored in encrypted format for security reasons. The pass-phrase is needed to decrypt this file, so it can be read and parsed. Removing the pass-phrase removes a layer of security from your server - proceed with caution!

  1. Remove the encryption from the RSA private key (while keeping a backup copy of the original file):

    $ cp server.key server.key.org
    $ openssl rsa -in server.key.org -out server.key

  2. Make sure the server.key file is only readable by root:

    $ chmod 400 server.key

Now server.key contains an unencrypted copy of the key. If you point your server at this file, it will not prompt you for a pass-phrase. HOWEVER, if anyone gets this key they will be able to impersonate you on the net. PLEASE make sure that the permissions on this file are such that only root or the web server user can read it (preferably get your web server to start as root but run as another user, and have the key readable only by root).

As an alternative approach you can use the ``SSLPassPhraseDialog exec:/path/to/program'' facility. Bear in mind that this is neither more nor less secure, of course.

How do I verify that a private key matches its Certificate?

A private key contains a series of numbers. Two of these numbers form the "public key", the others are part of the "private key". The "public key" bits are included when you generate a CSR, and subsequently form part of the associated Certificate.

To check that the public key in your Certificate matches the public portion of your private key, you simply need to compare these numbers. To view the Certificate and the key run the commands:

$ openssl x509 -noout -text -in server.crt
$ openssl rsa -noout -text -in server.key

The `modulus' and the `public exponent' portions in the key and the Certificate must match. As the public exponent is usually 65537 and it's difficult to visually check that the long modulus numbers are the same, you can use the following approach:

$ openssl x509 -noout -modulus -in server.crt | openssl md5
$ openssl rsa -noout -modulus -in server.key | openssl md5

This leaves you with two rather shorter numbers to compare. It is, in theory, possible that these numbers may be the same, without the modulus numbers being the same, but the chances of this are overwhelmingly remote.

Should you wish to check to which key or certificate a particular CSR belongs you can perform the same calculation on the CSR as follows:

$ openssl req -noout -modulus -in server.csr | openssl md5

Why do connections fail with an "alert bad certificate" error?

Errors such as OpenSSL: error:14094412: SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate in the SSL logfile, are usually caused by a browser which is unable to handle the server certificate/private-key. For example, Netscape Navigator 3.x is unable to handle RSA key lengths not equal to 1024 bits.

Why does my 2048-bit private key not work?

The private key sizes for SSL must be either 512 or 1024 bits, for compatibility with certain web browsers. A keysize of 1024 bits is recommended because keys larger than 1024 bits are incompatible with some versions of Netscape Navigator and Microsoft Internet Explorer, and with other browsers that use RSA's BSAFE cryptography toolkit.

Why is client authentication broken after upgrading from SSLeay version 0.8 to 0.9?

The CA certificates under the path you configured with SSLCACertificatePath are found by SSLeay through hash symlinks. These hash values are generated by the `openssl x509 -noout -hash' command. However, the algorithm used to calculate the hash for a certificate changed between SSLeay 0.8 and 0.9. You will need to remove all old hash symlinks and create new ones after upgrading. Use the Makefile provided by mod_ssl.

How can I convert a certificate from PEM to DER format?

The default certificate format for SSLeay/OpenSSL is PEM, which is simply Base64 encoded DER, with header and footer lines. For some applications (e.g. Microsoft Internet Explorer) you need the certificate in plain DER format. You can convert a PEM file cert.pem into the corresponding DER file cert.der using the following command: $ openssl x509 -in cert.pem -out cert.der -outform DER

Why can't I find the getca or getverisign programs mentioned by Verisign, for installing my Verisign certificate?

Verisign has never provided specific instructions for Apache+mod_ssl. The instructions provided are for C2Net's Stronghold (a commercial Apache based server with SSL support).

To install your certificate, all you need to do is to save the certificate to a file, and give the name of that file to the SSLCertificateFile directive. You will also need to give it the key file. For more information, see the SSLCertificateKeyFile directive.

Can I use the Server Gated Cryptography (SGC) facility (aka Verisign Global ID) with mod_ssl?

Yes. mod_ssl has included support for the SGC facility since version 2.1. No special configuration is required - just use the Global ID as your server certificate. The step up of the clients is then automatically handled by mod_ssl at run-time.

Why do browsers complain that they cannot verify my server certificate?

One reason this might happen is because your server certificate is signed by an intermediate CA. Various CAs, such as Verisign or Thawte, have started signing certificates not with their root certificate but with intermediate certificates.

Intermediate CA certificates lie between the root CA certificate (which is installed in the browsers) and the server certificate (which you installed on the server). In order for the browser to be able to traverse and verify the trust chain from the server certificate to the root certificate it needs need to be given the intermediate certificates. The CAs should be able to provide you such intermediate certificate packages that can be installed on the server.

You need to include those intermediate certificates with the SSLCertificateChainFile directive.

The SSL Protocol

  • Why do I get lots of random SSL protocol errors under heavy server load?
  • Why does my webserver have a higher load, now that it serves SSL encrypted traffic?
  • Why do HTTPS connections to my server sometimes take up to 30 seconds to establish a connection?
  • What SSL Ciphers are supported by mod_ssl?
  • Why do I get ``no shared cipher'' errors, when trying to use Anonymous Diffie-Hellman (ADH) ciphers?
  • Why do I get a 'no shared ciphers' error when connecting to my newly installed server?
  • Why can't I use SSL with name-based/non-IP-based virtual hosts?
  • Is it possible to use Name-Based Virtual Hosting to identify different SSL virtual hosts?
  • How do I get SSL compression working?
  • When I use Basic Authentication over HTTPS the lock icon in Netscape browsers stays unlocked when the dialog pops up. Does this mean the username/password is being sent unencrypted?
  • Why do I get I/O errors when connecting via HTTPS to an Apache+mod_ssl server with Microsoft Internet Explorer (MSIE)?
  • Why do I get I/O errors, or the message "Netscape has encountered bad data from the server", when connecting via HTTPS to an Apache+mod_ssl server with Netscape Navigator?

Why do I get lots of random SSL protocol errors under heavy server load?

There can be a number of reasons for this, but the main one is problems with the SSL session Cache specified by the SSLSessionCache directive. The DBM session cache is the most likely source of the problem, so using the SHM session cache (or no cache at all) may help.

Why does my webserver have a higher load, now that it serves SSL encrypted traffic?

SSL uses strong cryptographic encryption, which necessitates a lot of number crunching. When you request a webpage via HTTPS, everything (even the images) is encrypted before it is transferred. So increased HTTPS traffic leads to load increases.

Why do HTTPS connections to my server sometimes take up to 30 seconds to establish a connection?

This is usually caused by a /dev/random device for SSLRandomSeed which blocks the read(2) call until enough entropy is available to service the request. More information is available in the reference manual for the SSLRandomSeed directive.

What SSL Ciphers are supported by mod_ssl?

Usually, any SSL ciphers supported by the version of OpenSSL in use, are also supported by mod_ssl. Which ciphers are available can depend on the way you built OpenSSL. Typically, at least the following ciphers are supported:

  1. RC4 with MD5
  2. RC4 with MD5 (export version restricted to 40-bit key)
  3. RC2 with MD5
  4. RC2 with MD5 (export version restricted to 40-bit key)
  5. IDEA with MD5
  6. DES with MD5
  7. Triple-DES with MD5

To determine the actual list of ciphers available, you should run the following:

$ openssl ciphers -v

Why do I get ``no shared cipher'' errors, when trying to use Anonymous Diffie-Hellman (ADH) ciphers?

By default, OpenSSL does not allow ADH ciphers, for security reasons. Please be sure you are aware of the potential side-effects if you choose to enable these ciphers.

In order to use Anonymous Diffie-Hellman (ADH) ciphers, you must build OpenSSL with ``-DSSL_ALLOW_ADH'', and then add ``ADH'' into your SSLCipherSuite.

Why do I get a 'no shared ciphers' error when connecting to my newly installed server?

Either you have made a mistake with your SSLCipherSuite directive (compare it with the pre-configured example in httpd.conf-dist) or you chose to use DSA/DH algorithms instead of RSA when you generated your private key and ignored or overlooked the warnings. If you have chosen DSA/DH, then your server cannot communicate using RSA-based SSL ciphers (at least until you configure an additional RSA-based certificate/key pair). Modern browsers like NS or IE can only communicate over SSL using RSA ciphers. The result is the "no shared ciphers" error. To fix this, regenerate your server certificate/key pair, using the RSA algorithm.

Why can't I use SSL with name-based/non-IP-based virtual hosts?

The reason is very technical, and a somewhat "chicken and egg" problem. The SSL protocol layer stays below the HTTP protocol layer and encapsulates HTTP. When an SSL connection (HTTPS) is established Apache/mod_ssl has to negotiate the SSL protocol parameters with the client. For this, mod_ssl has to consult the configuration of the virtual server (for instance it has to look for the cipher suite, the server certificate, etc.). But in order to go to the correct virtual server Apache has to know the Host HTTP header field. To do this, the HTTP request header has to be read. This cannot be done before the SSL handshake is finished, but the information is needed in order to complete the SSL handshake phase. See the next question for how to circumvent this issue.

Note that if you have a wildcard SSL certificate, or a certificate that has multiple hostnames on it using subjectAltName fields, you can use SSL on name-based virtual hosts without further workarounds.

Why is it not possible to use Name-Based Virtual Hosting to identify different SSL virtual hosts?

Name-Based Virtual Hosting is a very popular method of identifying different virtual hosts. It allows you to use the same IP address and the same port number for many different sites. When people move on to SSL, it seems natural to assume that the same method can be used to have lots of different SSL virtual hosts on the same server.

It is possible, but only if using a 2.2.12 or later web server, built with 0.9.8j or later OpenSSL. This is because it requires a feature that only the most recent revisions of the SSL specification added, called Server Name Indication (SNI).

Note that if you have a wildcard SSL certificate, or a certificate that has multiple hostnames on it using subjectAltName fields, you can use SSL on name-based virtual hosts without further workarounds.

The reason is that the SSL protocol is a separate layer which encapsulates the HTTP protocol. So the SSL session is a separate transaction, that takes place before the HTTP session has begun. The server receives an SSL request on IP address X and port Y (usually 443). Since the SSL request did not contain any Host: field, the server had no way to decide which SSL virtual host to use. Usually, it just used the first one it found which matched the port and IP address specified.

If you are using a version of the web server and OpenSSL that support SNI, though, and the client's browser also supports SNI, then the hostname is included in the original SSL request, and the web server can select the correct SSL virtual host.

You can, of course, use Name-Based Virtual Hosting to identify many non-SSL virtual hosts (all on port 80, for example) and then have a single SSL virtual host (on port 443). But if you do this, you must make sure to put the non-SSL port number on the NameVirtualHost directive, e.g.

NameVirtualHost 192.168.1.1:80

Other workaround solutions include:

Using separate IP addresses for different SSL hosts. Using different port numbers for different SSL hosts.

How do I get SSL compression working?

Although SSL compression negotiation was defined in the specification of SSLv2 and TLS, it took until May 2004 for RFC 3749 to define DEFLATE as a negotiable standard compression method.

OpenSSL 0.9.8 started to support this by default when compiled with the zlib option. If both the client and the server support compression, it will be used. However, most clients still try to initially connect with an SSLv2 Hello. As SSLv2 did not include an array of prefered compression algorithms in its handshake, compression cannot be negotiated with these clients. If the client disables support for SSLv2, either an SSLv3 or TLS Hello may be sent, depending on which SSL library is used, and compression may be set up. You can verify whether clients make use of SSL compression by logging the %{SSL_COMPRESS_METHOD}x variable.

When I use Basic Authentication over HTTPS the lock icon in Netscape browsers stays unlocked when the dialog pops up. Does this mean the username/password is being sent unencrypted?

No, the username/password is transmitted encrypted. The icon in Netscape browsers is not actually synchronized with the SSL/TLS layer. It only toggles to the locked state when the first part of the actual webpage data is transferred, which may confuse people. The Basic Authentication facility is part of the HTTP layer, which is above the SSL/TLS layer in HTTPS. Before any HTTP data communication takes place in HTTPS, the SSL/TLS layer has already completed its handshake phase, and switched to encrypted communication. So don't be confused by this icon.

Why do I get I/O errors when connecting via HTTPS to an Apache+mod_ssl server with Microsoft Internet Explorer (MSIE)?

The first reason is that the SSL implementation in some MSIE versions has some subtle bugs related to the HTTP keep-alive facility and the SSL close notify alerts on socket connection close. Additionally the interaction between SSL and HTTP/1.1 features are problematic in some MSIE versions. You can work around these problems by forcing Apache not to use HTTP/1.1, keep-alive connections or send the SSL close notify messages to MSIE clients. This can be done by using the following directive in your SSL-aware virtual host section:

SetEnvIf User-Agent ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0

Further, some MSIE versions have problems with particular ciphers. Unfortunately, it is not possible to implement a MSIE-specific workaround for this, because the ciphers are needed as early as the SSL handshake phase. So a MSIE-specific SetEnvIf won't solve these problems. Instead, you will have to make more drastic adjustments to the global parameters. Before you decide to do this, make sure your clients really have problems. If not, do not make these changes - they will affect all your clients, MSIE or otherwise.

The next problem is that 56bit export versions of MSIE 5.x browsers have a broken SSLv3 implementation, which interacts badly with OpenSSL versions greater than 0.9.4. You can accept this and require your clients to upgrade their browsers, you can downgrade to OpenSSL 0.9.4 (not advised), or you can work around this, accepting that your workaround will affect other browsers too:

SSLProtocol all -SSLv3

will completely disables the SSLv3 protocol and allow those browsers to work. A better workaround is to disable only those ciphers which cause trouble.

SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP

This also allows the broken MSIE versions to work, but only removes the newer 56bit TLS ciphers.

Another problem with MSIE 5.x clients is that they refuse to connect to URLs of the form https://12.34.56.78/ (where IP-addresses are used instead of the hostname), if the server is using the Server Gated Cryptography (SGC) facility. This can only be avoided by using the fully qualified domain name (FQDN) of the website in hyperlinks instead, because MSIE 5.x has an error in the way it handles the SGC negotiation.

And finally there are versions of MSIE which seem to require that an SSL session can be reused (a totally non standard-conforming behaviour, of course). Connecting with those MSIE versions only work if a SSL session cache is used. So, as a work-around, make sure you are using a session cache (see the SSLSessionCache directive).

Why do I get I/O errors, or the message "Netscape has encountered bad data from the server", when connecting via HTTPS to an Apache+mod_ssl server with Netscape Navigator?

This usually occurs when you have created a new server certificate for a given domain, but had previously told your browser to always accept the old server certificate. Once you clear the entry for the old certificate from your browser, everything should be fine. Netscape's SSL implementation is correct, so when you encounter I/O errors with Netscape Navigator it is usually caused by the configured certificates.

mod_ssl Support

  • What information resources are available in case of mod_ssl problems?
  • What support contacts are available in case of mod_ssl problems?
  • What information should I provide when writing a bug report?
  • I had a core dump, can you help me?
  • How do I get a backtrace, to help find the reason for my core dump?

What information resources are available in case of mod_ssl problems?

The following information resources are available. In case of problems you should search here first.

Answers in the User Manual's F.A.Q. List (this)
http://httpd.apache.org/docs/2.2/ssl/ssl_faq.html
First check the F.A.Q. (this text). If your problem is a common one, it may have been answered several times before, and been included in this doc.
Postings from the modssl-users Support Mailing List http://www.modssl.org/support/
Search for your problem in the archives of the modssl-users mailing list. You're probably not the first person to have had this problem!

What support contacts are available in case of mod_ssl problems?

The following lists all support possibilities for mod_ssl, in order of preference. Please go through these possibilities in this order - don't just pick the one you like the look of.

  1. Send a Problem Report to the modssl-users Support Mailing List
    modssl-users@modssl.org
    This is the preferred way of submitting your problem report, because this way, others can see the problem, and learn from any answers. You must subscribe to the list first, but you can then easily discuss your problem with both the author and the whole mod_ssl user community.
  2. Send a Problem Report to the Apache httpd Users Support Mailing List
    users@httpd.apache.org
    This is the second way of submitting your problem report. Again, you must subscribe to the list first, but you can then easily discuss your problem with the whole Apache httpd user community.
  3. Write a Problem Report in the Bug Database
    http://httpd.apache.org/bug_report.html
    This is the last way of submitting your problem report. You should only do this if you've already posted to the mailing lists, and had no success. Please follow the instructions on the above page carefully.

What information should I provide when writing a bug report?

You should always provide at least the following information:

Apache and OpenSSL version information
The Apache version can be determined by running httpd -v. The OpenSSL version can be determined by running openssl version. Alternatively, if you have Lynx installed, you can run the command lynx -mime_header http://localhost/ | grep Server to gather this information in a single step.
The details on how you built and installed Apache+mod_ssl+OpenSSL
For this you can provide a logfile of your terminal session which shows the configuration and install steps. If this is not possible, you should at least provide the configure command line you used.
In case of core dumps please include a Backtrace
If your Apache+mod_ssl+OpenSSL dumps its core, please attach a stack-frame ``backtrace'' (see below for information on how to get this). This information is required in order to find a reason for your core dump.
A detailed description of your problem
Don't laugh, we really mean it! Many problem reports don't include a description of what the actual problem is. Without this, it's very difficult for anyone to help you. So, it's in your own interest (you want the problem be solved, don't you?) to include as much detail as possible, please. Of course, you should still include all the essentials above too.

I had a core dump, can you help me?

In general no, at least not unless you provide more details about the code location where Apache dumped core. What is usually always required in order to help you is a backtrace (see next question). Without this information it is mostly impossible to find the problem and help you in fixing it.

How do I get a backtrace, to help find the reason for my core dump?

Following are the steps you will need to complete, to get a backtrace:

  1. Make sure you have debugging symbols available, at least in Apache. On platforms where you use GCC/GDB, you will have to build Apache+mod_ssl with ``OPTIM="-g -ggdb3"'' to get this. On other platforms at least ``OPTIM="-g"'' is needed.
  2. Start the server and try to reproduce the core-dump. For this you may want to use a directive like ``CoreDumpDirectory /tmp'' to make sure that the core-dump file can be written. This should result in a /tmp/core or /tmp/httpd.core file. If you don't get one of these, try running your server under a non-root UID. Many modern kernels do not allow a process to dump core after it has done a setuid() (unless it does an exec()) for security reasons (there can be privileged information left over in memory). If necessary, you can run /path/to/httpd -X manually to force Apache to not fork.
  3. Analyze the core-dump. For this, run gdb /path/to/httpd /tmp/httpd.core or a similar command. In GDB, all you have to do then is to enter bt, and voila, you get the backtrace. For other debuggers consult your local debugger manual.


How-To / Tutorials - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2

How-To / Tutorials

How-To / Tutorials

Authentication and Authorization

Authentication is any process by which you verify that someone is who they claim they are. Authorization is any process by which someone is allowed to be where they want to go, or to have information that they want to have.

See: Authentication, Authorization

Access Control

Access control refers to the process of restricting, or granting access to a resource based on arbitrary criteria. There are a variety of different ways that this can be accomplished.

See: Access Control

Dynamic Content with CGI

The CGI (Common Gateway Interface) defines a way for a web server to interact with external content-generating programs, which are often referred to as CGI programs or CGI scripts. It is the simplest, and most common, way to put dynamic content on your web site. This document will be an introduction to setting up CGI on your Apache web server, and getting started writing CGI programs.

See: CGI: Dynamic Content

.htaccess files

.htaccess files provide a way to make configuration changes on a per-directory basis. A file, containing one or more configuration directives, is placed in a particular document directory, and the directives apply to that directory, and all subdirectories thereof.

See: .htaccess files

Introduction to Server Side Includes

SSI (Server Side Includes) are directives that are placed in HTML pages, and evaluated on the server while the pages are being served. They let you add dynamically generated content to an existing HTML page, without having to serve the entire page via a CGI program, or other dynamic technology.

See: Server Side Includes (SSI)

Per-user web directories

On systems with multiple users, each user can be permitted to have a web site in their home directory using the UserDir directive. Visitors to a URL http://example.com/~username/ will get content out of the home directory of the user "username", out of the subdirectory specified by the UserDir directive.

See: User web directories (public_html)


Kimlik Doğrulama ve Yetkilendirme - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Nasıllar ve Öğreticiler

Kimlik Doğrulama ve Yetkilendirme

Kimlik Doğrulama istediğiniz kişileri teyid etme işlemidir. Yetkilendirme ise kişilerin nereye gireceklerine ve hangi bilgiye ulaşacaklarına müsaade edilmesi işlemidir.

Genel erişim denetimi için, Erişim Denetimi belgesine bakınız.

İlgili modüller ve Yönergeler

Kimlik Doğrulama ve yetkilendirme işlemi ile ilgili üç tür modül vardır. Genellikle her bir gruptan en az bir modül seçeceksiniz.

  • Kimlik Doğrulama türü (bkz. AuthType yönergesi)
    • mod_auth_basic
    • mod_auth_digest
  • Kimlik Doğrulayıcı (bkz. AuthBasicProvider ve AuthDigestProvider yönergeleri)
    • mod_authn_anon
    • mod_authn_dbd
    • mod_authn_dbm
    • mod_authn_file
    • mod_authnz_ldap
  • Yetkilendirme (bkz. Require yönergesi)
    • mod_authnz_ldap
    • mod_authz_dbm
    • mod_authz_groupfile
    • mod_authz_host
    • mod_authz_owner
    • mod_authz_user

mod_authnz_ldap modülü kimlik doğrulama ve yetkilendirme işlemlerinin ikisini birden gerçekleştirir. mod_authn_alias modülü bir kimlik doğrulama tedarikçisi olmadığı halde diğer kimlik doğrulama tedarikçilerinin yapılandırılabilmesini mümkün kılmak gibi bir esnekliğe sahiptir.

mod_authz_host modülü bu işlemleri sunucu adına, IP adresine ve isteğin karekteristiğine bağlı olarak gerçekleştirir. Ancak kimlik doğrulama sisteminin bir parçası değildir.

Muhtemelen göz atmak isteyeceğiniz Erişim Denetimi nasıl belgesi, sunucuya erişimlerin çeşitli yollarından bahsetmektedir.

Giriş

Sitenizde sadece küçük bir grup insana hitap eden ya da hassas bilgileriniz varsa, bu makaledeki teknikleri kullanarak dilediğiniz kişilerin sadece dilediğiniz sayfaları görüntülemesini sağlayabilirsiniz.

Bu makale sitenizin bazı parçalarını korumak için kullanacağınız "standart" yolları içermektedir.

Bilginize:

Eğer bilgileriniz gerçekten gizliliğe ihtiyaç duyuyorsa kimlik doğrulamasına ilaveten mod_ssl modülünü de kullanabilirsiniz.

Ön gereksinimler

Bu makalede bahsi geçen yönergeler ya ana sunucu yapılandırma dosyasında (genellikle <Directory> bölümünde) ya da dizin içi yapılandırma dosyalarında (.htaccess dosyaları) bulunmak zorundadır.

Eğer .htaccess dosyalarını kullanmayı tasarlıyorsanız, kimlik doğrulama yönergelerine bu dosyaların içine koymaya izin veren sunucu yapılandırmasına ihtiyacınız olacaktır. Bunun için, dizin içi yapılandırma dosyalarının içine hangi yönergelerin konacağını belirleyen AllowOverride yönergesi kullanılır.

Kimlik doğrulamadan sözettiğimize göre, aşağıda gösterilen şekilde bir AllowOverride yönergesine ihtiyacınız olacaktır:

AllowOverride AuthConfig

Yönergeleri doğrudan ana sunucunun yapılandırma dosyasına koyacaksanız bu dosyaya yazma izniniz olmalıdır.

Bazı dosyaların nerede saklandığını bilmek için sunucunun dizin yapısı hakkında biraz bilgi sahibi olmanız gerekmektedir. Bu çok da zor olmamakla birlikte bu noktaya gelindiğinde konuyu netleştireceğiz.

Çalışmaya Başlama

Burada, sunucu üzerindeki bir dizini parolayla korumak için gereken temel bilgiler verilecektir.

İlk olarak bir parola dosyası oluşturmalısınız. Bunu nasıl yapacağınız, özellikle, seçtiğiniz kimlik doğrulayıcıya göre değişiklik gösterir. Bunun üzerinde ileride daha fazla duracağız. Başlangıç için parolaları bir metin dosyasında tutacağız.

Bu dosya belge kök dizini altında olmamalıdır. Böylece başkaları parola dosyasını indiremezler. Örneğin belgeleriniz /usr/local/apache/htdocs üzerinden sunuluyorsa parola dosyanızı /usr/local/apache/passwd dizininde tutabilirsiniz.

Dosyayı oluşturmak için Apache ile gelen htpasswd uygulamasını kullanacağız. Bu uygulama Apache'nin kurulumunda belirtilen bin dizininde bulunur. Eğer Apache'yi üçüncü parti paketlerden kurduysanız, çalıştırılabilir dosyaların bulunduğu yollar üzerinde olmalıdır.

Bir dosya oluşturmak için şunları yazın:

htpasswd -c /usr/local/apache/passwd/passwords umut

htpasswd size parola soracaktır arkasından da teyit etmek için parolayı tekrar girmenizi isteyecektir:

# htpasswd -c /usr/local/apache/passwd/passwords umut
New password: parolam
Re-type new password: parolam
Adding password for user umut

Eğer htpasswd normal yollar üzerinde değilse çalıştırmak için dosyanın bulunduğu tam yeri belirtmeniz gerekecektir. Dosyanın öntanımlı kurulum yeri: /usr/local/apache2/bin/htpasswd

Bundan sonra, sunucuyu, parola sorması için ve kimlerin erişim izni olacağını belirlemek için yapılandıracaksınız. Bu işlemi httpd.confdosyasını düzenleyerek ya da bir .htaccess dosyası kullanarak yapabilirsiniz. Örneğin, /usr/local/apache/htdocs/secret dizinini korumayı amaçlıyorsanız, şu yönergeleri kullanabilirsiniz. Bu yönergeleri /usr/local/apache/htdocs/secret/.htaccess dosyası içine veya httpd.conf içindeki <Directory /usr/local/apache/htdocs/secret> bölümüne koyabilirsiniz.

AuthType Basic
AuthName "Gizli Dosyalar"
# (Aşağıdaki satırın kullanımı isteğe bağlıdır)
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
Require user umut

Bu yönergeleri tek tek inceleyelim. AuthType yönergesi kullanıcının kimliğini doğrulamakta kullanılacak yöntemi seçer. En çok kullanılan yöntem Basic'tir ve bu yöntem mod_auth_basic modülüyle gerçeklenmiştir. Temel (Basic) kimlik doğrulamasıyla gönderilen parolanın şifrelenmeyeceğini unutmayın. Bu yöntem, bu sebepten dolayı mod_ssl eşliğinde kullanılmadığı sürece yüksek hassasiyete sahip bilgiler için kullanılmamalıdır. Apache bir başka kimlik doğrulama yöntemini daha destekler: AuthType Digest. Bu yöntem mod_auth_digest tarafından gerçeklenmiştir ve çok daha güvenli olacağı düşünülmüştü. Bu artık geçerliliğini yitirmiştir ve bağlantı artık mod_ssl tarafından şifrelenmektedir.

AuthName yönergesi ile kimlik doğrulamada kullanılacak Saha da belirtilebilir. Saha kullanımının, başlıca iki işlevi vardır. Birincisi, istemci sıklıkla bu bilgiyi kullanıcıya parola diyalog kutusunun bir parçası olarak sunar. İkincisi, belirtilen kimlik doğrulamalı alan için gönderilecek parolayı belirlerken istemci tarafından kullanılır.

Örneğin, bir istemcinin "Gizli Dosyalar" alanında kimliği doğrulanmış olsun. Aynı sunucu üzerinde "Gizli Dosyalar" Sahası olarak belirlenmiş alanlarda aynı parola özdevinimli olarak yinelenecektir. Böylece parola bir kere girilerek aynı Sahayı paylaşan çok sayıda kısıtlanmış alana ulaşırken oluşacak gecikmeden kullanıcı korunmuş olur. Güvenlik gerekçelerinden dolayı, her sunucu adı değiştirilişinde istemcinin parolayı yeniden sorması gerekir.

AuthBasicProvider yönergesinin öntanımlı değeri file olduğundan, bu durumda, bu yönergenin kullanımı isteğe bağlıdır. Ancak, eğer kimlik doğrulaması için mod_authn_dbm ya da mod_authn_dbd gibi farklı bir kaynak seçecekseniz bu yönergeyi kullanmanız gerekecektir.

AuthUserFile yönergesi htpasswd ile oluşturduğumuz parola dosyasının yerini belirtmek için kullanılır. Eğer çok sayıda kullanıcınız varsa her bir kullanıcıyı her kimlik doğrulama isteği için kimlik bilgilerini bir metin dosyasında aramak gayet yavaş olacaktır. Apache, kullanıcı bilgilerini hızlı bir veritabanı dosyasında depolama özelliğine de sahiptir. Bu amaçla, mod_authn_dbm modülünün AuthDBMUserFile yönergesi kullanılabilir. Bu dosyalar dbmmanage programı ile oluşturulabilir ve değiştirilebilir. Apache modülleri Veritabanı içindeki üçüncü parti modüllerinde çok sayıda başka kimlik doğrulama türü de vardır.

Son olarak Require yönergesi, sunucunun bu bölgesine erişimine izin verilen kullanıcıları ayarlama işleminin kimlik doğrulamasıyla ilgili kısmını sağlar. Bir sonraki bölümde Require yönergesini kullanmanın çeşitli yoları üzerinde duracağız.

Satisfy

Satisfy yönergesi belli bir kullanıcıya giriş hakkı tanınırken çeşitli kriterlerin belirtilebilmesine olanak tanır. Yönerge değiştirge olarak all ve any seçeneklerinden birini kabul eder. Öntanımlı olarak değerin all olduğu varsayılır. Yani, çeşitli kriterler belirtilmişse kullanıcının tüm bunları karşılaması gerekir. any belirtilmesi halinde ise, kullanıcının bu kriterlerden herhangi birini karşılaması yeterlidir.

Ağ dışından erişimler parola korumalı iken içerden gelen isteklere kimlik denetiminin yapılmadığı durum için erişim denetiminin kullanımı iyi bir örnektir. Bu, Satisfy yönergesi kullanılarak şöyle yapılabilir:

<Directory /usr/local/apache/htdocs/sekrit>
AuthType Basic
AuthName intranet
AuthUserFile /www/passwd/users
AuthGroupFile /www/passwd/groups
Require group customers
Order allow,deny
Allow from internal.com
Satisfy any
 </Directory>

Birden çok kişiye izin vermek

Yukarıdaki yönergelerle bir dizinde sadece bir kişiye (umut adlı kullanıcıya) izin verir. Çoğunlukla birden çok kişiye izin verilmesi istenir. Bu durumda AuthGroupFile yönergesi devreye girer.

Eğer birden çok kişiye izin vermek istiyorsanız içinde kullanıcı isimlerinin olduğu bir grup dosyası oluşturmalısınız. Bu dosyanın biçemi gayet basittir ve bunu herhangi bir metin düzenleyici ile oluşturabilirsiniz. Bu dosyanın içeriği aşağıdaki gibi görünecektir:

GroupName: umut samet engin kubilay

Dosya, sadece, boşluklarla birbirinden ayrılmış gurup üyelerinin isimlerinden oluşan uzun bir liste içerir.

Varolan parola dosyasına bir kullanıcı eklemek için şunu yazın:

htpasswd /usr/local/apache/passwd/passwords birey

Evvelce almış olduğunuz yanıtı yine alacaksınız ama bu sefer yeni bir dosya oluşturulmak yerine var olan bir dosyaya eklenecektir. (Yeni bir parola dosyası oluşturmak için -c seçeneği kullanılır).

Şimdi, .htaccess dosyanızı veya <Directory> bölümünüzü aşağıda görüldüğü şekilde değiştirebilirsiniz:

AuthType Basic
AuthName "Davete Binaen"
# Satır isteğe bağlıdır:
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords
AuthGroupFile /usr/local/apache/passwd/groups
Require group Grupismi

Artık, Grupismi gurubunda listelenmiş ve password dosyasında kaydı olan kişiye, parolayı doğru yazdığı takdirde izin verilecektir.

Çoklu kullanıcıya izin veren biraz daha az kullanılan başka bir yol daha mevcuttur. Bir gurup dosyası oluşturmaktansa, şu yönergeyi kullanabilirsiniz:

Require valid-user

Require user umut satırı ile parola dosyasında listelenmiş ve parolayı doğru olarak giren herhangi bir kişiye izin vermektense bunu kullanabilirsiniz.

Olası Sorunlar

Temel kimlik doğrulama yolu belirtildiği için, sunucuya yaptığınız her belge istediğinde kullanıcı adınızın ve parolanızın doğrulanması gerekir. Hatta aynı sayfayı yeniden yüklerken ya da sayfadaki her bir resim için bu yapılmalıdır (şayet korunmakta olan bir dizinden geliyorsa). Bu işlem hızı azaltacaktır. Yavaşlama miktarı parola dosyanızın büyüklüğü ile orantılı olacaktır, çünkü bu işlem sırasında dosya açılacak ve kullanıcıların arasında isminiz bulunana kadar liste aşağı doğru taranacaktır. Bu işlem sayfa her yüklenişinde tekrar edilecektir.

Buradan çıkacak sonuç, bir parola dosyasına konulan kullanıcı sayısında bir üst sınır olması gerekliliğidir. Bu sınır sunucunuzun başarımına bağlı olarak değişiklik gösterir. Bir kaç yüz kayıtın üstünde giriş yaptığınızda hız düşüşünü gözlemlebilirsiniz İşte bu anda kimlik doğrulama için başka bir yöntem aramaya başlarsınız.

Diğer parola depolama yöntemleri

Parolaları basit bir metin dosyasında depolamak yukarıda bahsedilen sorunlara yol açtığından parolaları başka bir yerde depolamayı düşünebilirsiniz; örneğin bir veritabanında.

mod_authn_dbm ve mod_authn_dbd modülleri bunu mümkün kılan iki modüldür. Depolama yönemi olarak AuthBasicProvider file yerine, dbm veya dbd kullanabilirsiniz.

Bir metin dosyası yerine bir dbd dosyası kullanım örneği:

<Directory /www/docs/private>
AuthName "Private"
AuthType Basic
AuthBasicProvider dbm
AuthDBMUserFile /www/passwords/passwd.dbm
Require valid-user
 </Directory>

Başka seçenekler de mümkündür. Ayrınılar için mod_authn_dbm belgesine başvurun.

Daha fazla bilgi

Daha fazla bilgi için mod_auth_basic ve mod_authz_host modüllerinin belgelerine bakınız. mod_authn_alias modülü ile bazı yapılandırmalarınızı basitleştirebilirsiniz.

Apache tarafından desteklenen şifrelerle ilgili bilgi için Parola Biçemleri belgesine bakınız.

Erişim Denetimi nasıl belgesinden de bazı bilgiler edinebilirsiniz.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Access Control - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > How-To / Tutorials

Access Control

Access control refers to any means of controlling access to any resource. This is separate from authentication and authorization.

Related Modules and Directives

Access control can be done by several different modules. The most important of these is mod_authz_host. Other modules discussed in this document include mod_setenvif and mod_rewrite.

Access control by host

If you wish to restrict access to portions of your site based on the host address of your visitors, this is most easily done using mod_authz_host.

The Allow and Deny directives let you allow and deny access based on the host name, or host address, of the machine requesting a document. The Order directive goes hand-in-hand with these two, and tells Apache in which order to apply the filters.

The usage of these directives is:

Allow from address

where address is an IP address (or a partial IP address) or a fully qualified domain name (or a partial domain name); you may provide multiple addresses or domain names, if desired.

For example, if you have someone spamming your message board, and you want to keep them out, you could do the following:

Deny from 10.252.46.165

Visitors coming from that address will not be able to see the content covered by this directive. If, instead, you have a machine name, rather than an IP address, you can use that.

Deny from host.example.com

And, if you'd like to block access from an entire domain, you can specify just part of an address or domain name:

Deny from 192.168.205
Deny from phishers.example.com moreidiots.example
Deny from ke

Using Order will let you be sure that you are actually restricting things to the group that you want to let in, by combining a Deny and an Allow directive:

Order deny,allow
Deny from all
Allow from dev.example.com

Listing just the Allow directive would not do what you want, because it will let folks from that host in, in addition to letting everyone in. What you want is to let only those folks in.

Access control by environment variable

mod_authz_host, in conjunction with mod_setenvif, can be used to restrict access to your website based on the value of arbitrary environment variables. This is done with the Allow from env= and Deny from env= syntax.

SetEnvIf User-Agent BadBot GoAway=1
Order allow,deny
Allow from all
Deny from env=GoAway

Warning:

Access control by User-Agent is an unreliable technique, since the User-Agent header can be set to anything at all, at the whim of the end user.

In the above example, the environment variable GoAway is set to 1 if the User-Agent matches the string BadBot. Then we deny access for any request when this variable is set. This blocks that particular user agent from the site.

An environment variable test can be negated using the =! syntax:

Allow from env=!GoAway

Access control with mod_rewrite

The [F] RewriteRule flag causes a 403 Forbidden response to be sent. Using this, you can deny access to a resource based on arbitrary criteria.

For example, if you wish to block access to a resource between 8pm and 6am, you can do this using mod_rewrite.

RewriteEngine On
RewriteCond %{TIME_HOUR} >20 [OR]
RewriteCond %{TIME_HOUR} <07
RewriteRule ^/fridge - [F]

This will return a 403 Forbidden response for any request after 8pm or before 7am. This technique can be used for any criteria that you wish to check. You can also redirect, or otherwise rewrite these requests, if that approach is preferred.

More information

You should also read the documentation for mod_auth_basic and mod_authz_host which contain some more information about how this all works. mod_authn_alias can also help in simplifying certain authentication configurations.

See the Authentication and Authorization howto.


Apache Tutorial: Dynamic Content with CGI - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > How-To / Tutorials

Apache Tutorial: Dynamic Content with CGI

Introduction

Related Modules Related Directives
  • mod_alias
  • mod_cgi
  • AddHandler
  • Options
  • ScriptAlias

The CGI (Common Gateway Interface) defines a way for a web server to interact with external content-generating programs, which are often referred to as CGI programs or CGI scripts. It is the simplest, and most common, way to put dynamic content on your web site. This document will be an introduction to setting up CGI on your Apache web server, and getting started writing CGI programs.

Configuring Apache to permit CGI

In order to get your CGI programs to work properly, you'll need to have Apache configured to permit CGI execution. There are several ways to do this.

Note: If Apache has been built with shared module support you need to ensure that the module is loaded; in your httpd.conf you need to make sure the LoadModule directive has not been commented out. A correctly configured directive may look like this:
LoadModule cgi_module modules/mod_cgi.so

ScriptAlias

The ScriptAlias directive tells Apache that a particular directory is set aside for CGI programs. Apache will assume that every file in this directory is a CGI program, and will attempt to execute it, when that particular resource is requested by a client.

The ScriptAlias directive looks like:

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/

The example shown is from your default httpd.conf configuration file, if you installed Apache in the default location. The ScriptAlias directive is much like the Alias directive, which defines a URL prefix that is to mapped to a particular directory. Alias and ScriptAlias are usually used for directories that are outside of the DocumentRoot directory. The difference between Alias and ScriptAlias is that ScriptAlias has the added meaning that everything under that URL prefix will be considered a CGI program. So, the example above tells Apache that any request for a resource beginning with /cgi-bin/ should be served from the directory /usr/local/apache2/cgi-bin/, and should be treated as a CGI program.

For example, if the URL http://www.example.com/cgi-bin/test.pl is requested, Apache will attempt to execute the file /usr/local/apache2/cgi-bin/test.pl and return the output. Of course, the file will have to exist, and be executable, and return output in a particular way, or Apache will return an error message.

CGI outside of ScriptAlias directories

CGI programs are often restricted to ScriptAlias'ed directories for security reasons. In this way, administrators can tightly control who is allowed to use CGI programs. However, if the proper security precautions are taken, there is no reason why CGI programs cannot be run from arbitrary directories. For example, you may wish to let users have web content in their home directories with the UserDir directive. If they want to have their own CGI programs, but don't have access to the main cgi-bin directory, they will need to be able to run CGI programs elsewhere.

There are two steps to allowing CGI execution in an arbitrary directory. First, the cgi-script handler must be activated using the AddHandler or SetHandler directive. Second, ExecCGI must be specified in the Options directive.

Explicitly using Options to permit CGI execution

You could explicitly use the Options directive, inside your main server configuration file, to specify that CGI execution was permitted in a particular directory:

<Directory /usr/local/apache2/htdocs/somedir>
Options +ExecCGI
 </Directory>

The above directive tells Apache to permit the execution of CGI files. You will also need to tell the server what files are CGI files. The following AddHandler directive tells the server to treat all files with the cgi or pl extension as CGI programs:

AddHandler cgi-script .cgi .pl

.htaccess files

The .htaccess tutorial shows how to activate CGI programs if you do not have access to httpd.conf.

User Directories

To allow CGI program execution for any file ending in .cgi in users' directories, you can use the following configuration.

<Directory /home/*/public_html>
Options +ExecCGI
AddHandler cgi-script .cgi
 </Directory>

If you wish designate a cgi-bin subdirectory of a user's directory where everything will be treated as a CGI program, you can use the following.

<Directory /home/*/public_html/cgi-bin>
Options ExecCGI
SetHandler cgi-script
 </Directory>

Writing a CGI program

There are two main differences between ``regular'' programming, and CGI programming.

First, all output from your CGI program must be preceded by a MIME-type header. This is HTTP header that tells the client what sort of content it is receiving. Most of the time, this will look like:

Content-type: text/html

Secondly, your output needs to be in HTML, or some other format that a browser will be able to display. Most of the time, this will be HTML, but occasionally you might write a CGI program that outputs a gif image, or other non-HTML content.

Apart from those two things, writing a CGI program will look a lot like any other program that you might write.

Your first CGI program

The following is an example CGI program that prints one line to your browser. Type in the following, save it to a file called first.pl, and put it in your cgi-bin directory.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";

Even if you are not familiar with Perl, you should be able to see what is happening here. The first line tells Apache (or whatever shell you happen to be running under) that this program can be executed by feeding the file to the interpreter found at the location /usr/bin/perl. The second line prints the content-type declaration we talked about, followed by two carriage-return newline pairs. This puts a blank line after the header, to indicate the end of the HTTP headers, and the beginning of the body. The third line prints the string "Hello, World.". And that's the end of it.

If you open your favorite browser and tell it to get the address

http://www.example.com/cgi-bin/first.pl

or wherever you put your file, you will see the one line Hello, World. appear in your browser window. It's not very exciting, but once you get that working, you'll have a good chance of getting just about anything working.

But it's still not working!

There are four basic things that you may see in your browser when you try to access your CGI program from the web:

The output of your CGI program
Great! That means everything worked fine. If the output is correct, but the browser is not processing it correctly, make sure you have the correct Content-Type set in your CGI program.
The source code of your CGI program or a "POST Method Not Allowed" message
That means that you have not properly configured Apache to process your CGI program. Reread the section on configuring Apache and try to find what you missed.
A message starting with "Forbidden"
That means that there is a permissions problem. Check the Apache error log and the section below on file permissions.
A message saying "Internal Server Error"
If you check the Apache error log, you will probably find that it says "Premature end of script headers", possibly along with an error message generated by your CGI program. In this case, you will want to check each of the below sections to see what might be preventing your CGI program from emitting the proper HTTP headers.

File permissions

Remember that the server does not run as you. That is, when the server starts up, it is running with the permissions of an unprivileged user - usually nobody, or www - and so it will need extra permissions to execute files that are owned by you. Usually, the way to give a file sufficient permissions to be executed by nobody is to give everyone execute permission on the file:

chmod a+x first.pl

Also, if your program reads from, or writes to, any other files, those files will need to have the correct permissions to permit this.

Path information and environment

When you run a program from your command line, you have certain information that is passed to the shell without you thinking about it. For example, you have a PATH, which tells the shell where it can look for files that you reference.

When a program runs through the web server as a CGI program, it may not have the same PATH. Any programs that you invoke in your CGI program (like sendmail, for example) will need to be specified by a full path, so that the shell can find them when it attempts to execute your CGI program.

A common manifestation of this is the path to the script interpreter (often perl) indicated in the first line of your CGI program, which will look something like:

#!/usr/bin/perl

Make sure that this is in fact the path to the interpreter.

When editing CGI scripts on Windows, end-of-line characters may be appended to the interpreter path. Ensure that files are then transferred to the server in ASCII mode. Failure to do so may result in "Command not found" warnings from the OS, due to the unrecognized end-of-line character being interpreted as a part of the interpreter filename.

Missing environment variables

If your CGI program depends on non-standard environment variables, you will need to assure that those variables are passed by Apache.

When you miss HTTP headers from the environment, make sure they are formatted according to RFC 2616, section 4.2: Header names must start with a letter, followed only by letters, numbers or hyphen. Any header violating this rule will be dropped silently.

Program errors

Most of the time when a CGI program fails, it's because of a problem with the program itself. This is particularly true once you get the hang of this CGI stuff, and no longer make the above two mistakes. The first thing to do is to make sure that your program runs from the command line before testing it via the web server. For example, try:

cd /usr/local/apache2/cgi-bin
./first.pl

(Do not call the perl interpreter. The shell and Apache should find the interpreter using the path information on the first line of the script.)

The first thing you see written by your program should be a set of HTTP headers, including the Content-Type, followed by a blank line. If you see anything else, Apache will return the Premature end of script headers error if you try to run it through the server. See Writing a CGI program above for more details.

Error logs

The error logs are your friend. Anything that goes wrong generates message in the error log. You should always look there first. If the place where you are hosting your web site does not permit you access to the error log, you should probably host your site somewhere else. Learn to read the error logs, and you'll find that almost all of your problems are quickly identified, and quickly solved.

Suexec

The suexec support program allows CGI programs to be run under different user permissions, depending on which virtual host or user home directory they are located in. Suexec has very strict permission checking, and any failure in that checking will result in your CGI programs failing with Premature end of script headers.

To check if you are using suexec, run apachectl -V and check for the location of SUEXEC_BIN. If Apache finds an suexec binary there on startup, suexec will be activated.

Unless you fully understand suexec, you should not be using it. To disable suexec, simply remove (or rename) the suexec binary pointed to by SUEXEC_BIN and then restart the server. If, after reading about suexec, you still wish to use it, then run suexec -V to find the location of the suexec log file, and use that log file to find what policy you are violating.

What's going on behind the scenes?

As you become more advanced in CGI programming, it will become useful to understand more about what's happening behind the scenes. Specifically, how the browser and server communicate with one another. Because although it's all very well to write a program that prints "Hello, World.", it's not particularly useful.

Environment variables

Environment variables are values that float around you as you use your computer. They are useful things like your path (where the computer searches for the actual file implementing a command when you type it), your username, your terminal type, and so on. For a full list of your normal, every day environment variables, type env at a command prompt.

During the CGI transaction, the server and the browser also set environment variables, so that they can communicate with one another. These are things like the browser type (Netscape, IE, Lynx), the server type (Apache, IIS, WebSite), the name of the CGI program that is being run, and so on.

These variables are available to the CGI programmer, and are half of the story of the client-server communication. The complete list of required variables is at Common Gateway Interface RFC.

This simple Perl CGI program will display all of the environment variables that are being passed around. Two similar programs are included in the cgi-bin directory of the Apache distribution. Note that some variables are required, while others are optional, so you may see some variables listed that were not in the official list. In addition, Apache provides many different ways for you to add your own environment variables to the basic ones provided by default.

#!/usr/bin/perl
print "Content-type: text/html\n\n";
foreach $key (keys %ENV) {
print "$key --> $ENV{$key}<br>";
 }

STDIN and STDOUT

Other communication between the server and the client happens over standard input (STDIN) and standard output (STDOUT). In normal everyday context, STDIN means the keyboard, or a file that a program is given to act on, and STDOUT usually means the console or screen.

When you POST a web form to a CGI program, the data in that form is bundled up into a special format and gets delivered to your CGI program over STDIN. The program then can process that data as though it was coming in from the keyboard, or from a file

The "special format" is very simple. A field name and its value are joined together with an equals (=) sign, and pairs of values are joined together with an ampersand (&). Inconvenient characters like spaces, ampersands, and equals signs, are converted into their hex equivalent so that they don't gum up the works. The whole data string might look something like:

name=Rich%20Bowen&city=Lexington&state=KY&sidekick=Squirrel%20Monkey

You'll sometimes also see this type of string appended to a URL. When that is done, the server puts that string into the environment variable called QUERY_STRING. That's called a GET request. Your HTML form specifies whether a GET or a POST is used to deliver the data, by setting the METHOD attribute in the FORM tag.

Your program is then responsible for splitting that string up into useful information. Fortunately, there are libraries and modules available to help you process this data, as well as handle other of the aspects of your CGI program.

CGI modules/libraries

When you write CGI programs, you should consider using a code library, or module, to do most of the grunt work for you. This leads to fewer errors, and faster development.

If you're writing CGI programs in Perl, modules are available on CPAN. The most popular module for this purpose is CGI.pm. You might also consider CGI::Lite, which implements a minimal set of functionality, which is all you need in most programs.

If you're writing CGI programs in C, there are a variety of options. One of these is the CGIC library, from http://www.boutell.com/cgic/.

For more information

There are a large number of CGI resources on the web. The list from the HTML Writers Guild is a great source of answers to your questions. You can find out more at http://www.hwg.org/lists/hwg-servers/.

The current CGI specification is available in the Common Gateway Interface RFC.

When you post a question about a CGI problem that you're having, whether to a mailing list, or to a newsgroup, make sure you provide enough information about what happened, what you expected to happen, and how what actually happened was different, what server you're running, what language your CGI program was in, and, if possible, the offending code. This will make finding your problem much simpler.

Note that questions about CGI problems should never be posted to the Apache bug database unless you are sure you have found a problem in the Apache source code.


Apache Tutorial: Introduction to Server Side Includes - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > How-To / Tutorials

Apache Tutorial: Introduction to Server Side Includes

Server-side includes provide a means to add dynamic content to existing HTML documents.

Introduction

Related Modules Related Directives
  • mod_include
  • mod_cgi
  • mod_expires
  • Options
  • XBitHack
  • AddType
  • SetOutputFilter
  • BrowserMatchNoCase

This article deals with Server Side Includes, usually called simply SSI. In this article, I'll talk about configuring your server to permit SSI, and introduce some basic SSI techniques for adding dynamic content to your existing HTML pages.

In the latter part of the article, we'll talk about some of the somewhat more advanced things that can be done with SSI, such as conditional statements in your SSI directives.

What are SSI?

SSI (Server Side Includes) are directives that are placed in HTML pages, and evaluated on the server while the pages are being served. They let you add dynamically generated content to an existing HTML page, without having to serve the entire page via a CGI program, or other dynamic technology.

The decision of when to use SSI, and when to have your page entirely generated by some program, is usually a matter of how much of the page is static, and how much needs to be recalculated every time the page is served. SSI is a great way to add small pieces of information, such as the current time. But if a majority of your page is being generated at the time that it is served, you need to look for some other solution.

Configuring your server to permit SSI

To permit SSI on your server, you must have the following directive either in your httpd.conf file, or in a .htaccess file:

Options +Includes

This tells Apache that you want to permit files to be parsed for SSI directives. Note that most configurations contain multiple Options directives that can override each other. You will probably need to apply the Options to the specific directory where you want SSI enabled in order to assure that it gets evaluated last.

Not just any file is parsed for SSI directives. You have to tell Apache which files should be parsed. There are two ways to do this. You can tell Apache to parse any file with a particular file extension, such as .shtml, with the following directives:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

One disadvantage to this approach is that if you wanted to add SSI directives to an existing page, you would have to change the name of that page, and all links to that page, in order to give it a .shtml extension, so that those directives would be executed.

The other method is to use the XBitHack directive:

XBitHack on

XBitHack tells Apache to parse files for SSI directives if they have the execute bit set. So, to add SSI directives to an existing page, rather than having to change the file name, you would just need to make the file executable using chmod.

chmod +x pagename.html

A brief comment about what not to do. You'll occasionally see people recommending that you just tell Apache to parse all .html files for SSI, so that you don't have to mess with .shtml file names. These folks have perhaps not heard about XBitHack. The thing to keep in mind is that, by doing this, you're requiring that Apache read through every single file that it sends out to clients, even if they don't contain any SSI directives. This can slow things down quite a bit, and is not a good idea.

Of course, on Windows, there is no such thing as an execute bit to set, so that limits your options a little.

In its default configuration, Apache does not send the last modified date or content length HTTP headers on SSI pages, because these values are difficult to calculate for dynamic content. This can prevent your document from being cached, and result in slower perceived client performance. There are two ways to solve this:

  1. Use the XBitHack Full configuration. This tells Apache to determine the last modified date by looking only at the date of the originally requested file, ignoring the modification date of any included files.
  2. Use the directives provided by mod_expires to set an explicit expiration time on your files, thereby letting browsers and proxies know that it is acceptable to cache them.

Basic SSI directives

SSI directives have the following syntax:

<!--#element attribute=value attribute=value ... -->

It is formatted like an HTML comment, so if you don't have SSI correctly enabled, the browser will ignore it, but it will still be visible in the HTML source. If you have SSI correctly configured, the directive will be replaced with its results.

The element can be one of a number of things, and we'll talk some more about most of these in the next installment of this series. For now, here are some examples of what you can do with SSI

Today's date

<!--#echo var="DATE_LOCAL" -->

The echo element just spits out the value of a variable. There are a number of standard variables, which include the whole set of environment variables that are available to CGI programs. Also, you can define your own variables with the set element.

If you don't like the format in which the date gets printed, you can use the config element, with a timefmt attribute, to modify that formatting.

<!--#config timefmt="%A %B %d, %Y" -->
Today is <!--#echo var="DATE_LOCAL" -->

Modification date of the file

This document last modified <!--#flastmod file="index.html" -->

This element is also subject to timefmt format configurations.

Including the results of a CGI program

This is one of the more common uses of SSI - to output the results of a CGI program, such as everybody's favorite, a ``hit counter.''

<!--#include virtual="/cgi-bin/counter.pl" -->

Additional examples

Following are some specific examples of things you can do in your HTML documents with SSI.

When was this document modified?

Earlier, we mentioned that you could use SSI to inform the user when the document was most recently modified. However, the actual method for doing that was left somewhat in question. The following code, placed in your HTML document, will put such a time stamp on your page. Of course, you will have to have SSI correctly enabled, as discussed above.

<!--#config timefmt="%A %B %d, %Y" -->
This file last modified <!--#flastmod file="ssi.shtml" -->

Of course, you will need to replace the ssi.shtml with the actual name of the file that you're referring to. This can be inconvenient if you're just looking for a generic piece of code that you can paste into any file, so you probably want to use the LAST_MODIFIED variable instead:

<!--#config timefmt="%D" -->
This file last modified <!--#echo var="LAST_MODIFIED" -->

For more details on the timefmt format, go to your favorite search site and look for strftime. The syntax is the same.

Including a standard footer

If you are managing any site that is more than a few pages, you may find that making changes to all those pages can be a real pain, particularly if you are trying to maintain some kind of standard look across all those pages.

Using an include file for a header and/or a footer can reduce the burden of these updates. You just have to make one footer file, and then include it into each page with the include SSI command. The include element can determine what file to include with either the file attribute, or the virtual attribute. The file attribute is a file path, relative to the current directory. That means that it cannot be an absolute file path (starting with /), nor can it contain ../ as part of that path. The virtual attribute is probably more useful, and should specify a URL relative to the document being served. It can start with a /, but must be on the same server as the file being served.

<!--#include virtual="/footer.html" -->

I'll frequently combine the last two things, putting a LAST_MODIFIED directive inside a footer file to be included. SSI directives can be contained in the included file, and includes can be nested - that is, the included file can include another file, and so on.

What else can I config?

In addition to being able to config the time format, you can also config two other things.

Usually, when something goes wrong with your SSI directive, you get the message

[an error occurred while processing this directive]

If you want to change that message to something else, you can do so with the errmsg attribute to the config element:

<!--#config errmsg="[It appears that you don't know how to use SSI]" -->

Hopefully, end users will never see this message, because you will have resolved all the problems with your SSI directives before your site goes live. (Right?)

And you can config the format in which file sizes are returned with the sizefmt attribute. You can specify bytes for a full count in bytes, or abbrev for an abbreviated number in Kb or Mb, as appropriate.

Executing commands

I expect that I'll have an article some time in the coming months about using SSI with small CGI programs. For now, here's something else that you can do with the exec element. You can actually have SSI execute a command using the shell (/bin/sh, to be precise - or the DOS shell, if you're on Win32). The following, for example, will give you a directory listing.

<pre>
<!--#exec cmd="ls" -->
</pre>

or, on Windows

<pre>
<!--#exec cmd="dir" -->
</pre>

You might notice some strange formatting with this directive on Windows, because the output from dir contains the string ``<dir>'' in it, which confuses browsers.

Note that this feature is exceedingly dangerous, as it will execute whatever code happens to be embedded in the exec tag. If you have any situation where users can edit content on your web pages, such as with a ``guestbook'', for example, make sure that you have this feature disabled. You can allow SSI, but not the exec feature, with the IncludesNOEXEC argument to the Options directive.

Advanced SSI techniques

In addition to spitting out content, Apache SSI gives you the option of setting variables, and using those variables in comparisons and conditionals.

Setting variables

Using the set directive, you can set variables for later use. We'll need this later in the discussion, so we'll talk about it here. The syntax of this is as follows:

<!--#set var="name" value="Rich" -->

In addition to merely setting values literally like that, you can use any other variable, including environment variables or the variables discussed above (like LAST_MODIFIED, for example) to give values to your variables. You will specify that something is a variable, rather than a literal string, by using the dollar sign ($) before the name of the variable.

<!--#set var="modified" value="$LAST_MODIFIED" -->

To put a literal dollar sign into the value of your variable, you need to escape the dollar sign with a backslash.

<!--#set var="cost" value="\$100" -->

Finally, if you want to put a variable in the midst of a longer string, and there's a chance that the name of the variable will run up against some other characters, and thus be confused with those characters, you can place the name of the variable in braces, to remove this confusion. (It's hard to come up with a really good example of this, but hopefully you'll get the point.)

<!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" -->

Conditional expressions

Now that we have variables, and are able to set and compare their values, we can use them to express conditionals. This lets SSI be a tiny programming language of sorts. mod_include provides an if, elif, else, endif structure for building conditional statements. This allows you to effectively generate multiple logical pages out of one actual page.

The structure of this conditional construct is:

<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->

A test_condition can be any sort of logical comparison - either comparing values to one another, or testing the ``truth'' of a particular value. (A given string is true if it is nonempty.) For a full list of the comparison operators available to you, see the mod_include documentation.

For example, if you wish to customize the text on your web page based on the time of day, you could use the following recipe, placed in the HTML page:

Good <!--#if expr="%{TIME_HOUR} >=12" -->
morning!
<!--#else -->
afternoon!
<!--#endif -->

Any other variable (either ones that you define, or normal environment variables) can be used in conditional statements. See Expressions in Apache HTTP Server for more information on the expression evaluation engine.

With Apache's ability to set environment variables with the SetEnvIf directives, and other related directives, this functionality can let you do a wide variety of dynamic content on the server side without resorting a full web application.

Conclusion

SSI is certainly not a replacement for CGI, or other technologies used for generating dynamic web pages. But it is a great way to add small amounts of dynamic content to pages, without doing a lot of extra work.


Apache HTTP Server Tutorial: .htaccess files - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > How-To / Tutorials

Apache HTTP Server Tutorial: .htaccess files

.htaccess files provide a way to make configuration changes on a per-directory basis.

.htaccess files

Related Modules Related Directives
  • core
  • mod_authn_file
  • mod_authz_groupfile
  • mod_cgi
  • mod_include
  • mod_mime
  • AccessFileName
  • AllowOverride
  • Options
  • AddHandler
  • SetHandler
  • AuthType
  • AuthName
  • AuthUserFile
  • AuthGroupFile
  • Require
You should avoid using .htaccess files completely if you have access to httpd main server config file. Using .htaccess files slows down your Apache http server. Any directive that you can include in a .htaccess file is better set in a Directory block, as it will have the same effect with better performance.

What they are/How to use them

.htaccess files (or "distributed configuration files") provide a way to make configuration changes on a per-directory basis. A file, containing one or more configuration directives, is placed in a particular document directory, and the directives apply to that directory, and all subdirectories thereof.

Note:

If you want to call your .htaccess file something else, you can change the name of the file using the AccessFileName directive. For example, if you would rather call the file .config then you can put the following in your server configuration file:

AccessFileName .config

In general, .htaccess files use the same syntax as the main configuration files. What you can put in these files is determined by the AllowOverride directive. This directive specifies, in categories, what directives will be honored if they are found in a .htaccess file. If a directive is permitted in a .htaccess file, the documentation for that directive will contain an Override section, specifying what value must be in AllowOverride in order for that directive to be permitted.

For example, if you look at the documentation for the AddDefaultCharset directive, you will find that it is permitted in .htaccess files. (See the Context line in the directive summary.) The Override line reads FileInfo. Thus, you must have at least AllowOverride FileInfo in order for this directive to be honored in .htaccess files.

Example:

Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo

If you are unsure whether a particular directive is permitted in a .htaccess file, look at the documentation for that directive, and check the Context line for ".htaccess".

When (not) to use .htaccess files

In general, you should only use .htaccess files when you don't have access to the main server configuration file. There is, for example, a common misconception that user authentication should always be done in .htaccess files, and, in more recent years, another misconception that mod_rewrite directives must go in .htaccess files. This is simply not the case. You can put user authentication configurations in the main server configuration, and this is, in fact, the preferred way to do things. Likewise, mod_rewrite directives work better, in many respects, in the main server configuration.

.htaccess files should be used in a case where the content providers need to make configuration changes to the server on a per-directory basis, but do not have root access on the server system. In the event that the server administrator is not willing to make frequent configuration changes, it might be desirable to permit individual users to make these changes in .htaccess files for themselves. This is particularly true, for example, in cases where ISPs are hosting multiple user sites on a single machine, and want their users to be able to alter their configuration.

However, in general, use of .htaccess files should be avoided when possible. Any configuration that you would consider putting in a .htaccess file, can just as effectively be made in a <Directory> section in your main server configuration file.

There are two main reasons to avoid the use of .htaccess files.

The first of these is performance. When AllowOverride is set to allow the use of .htaccess files, httpd will look in every directory for .htaccess files. Thus, permitting .htaccess files causes a performance hit, whether or not you actually even use them! Also, the .htaccess file is loaded every time a document is requested.

Further note that httpd must look for .htaccess files in all higher-level directories, in order to have a full complement of directives that it must apply. (See section on how directives are applied.) Thus, if a file is requested out of a directory /www/htdocs/example, httpd must look for the following files:

/.htaccess
/www/.htaccess
/www/htdocs/.htaccess
/www/htdocs/example/.htaccess

And so, for each file access out of that directory, there are 4 additional file-system accesses, even if none of those files are present. (Note that this would only be the case if .htaccess files were enabled for /, which is not usually the case.)

In the case of RewriteRule directives, in .htaccess context these regular expressions must be re-compiled with every request to the directory, whereas in main server configuration context they are compiled once and cached. Additionally, the rules themselves are more complicated, as one must work around the restrictions that come with per-directory context and mod_rewrite. Consult the Rewrite Guide for more detail on this subject.

The second consideration is one of security. You are permitting users to modify server configuration, which may result in changes over which you have no control. Carefully consider whether you want to give your users this privilege. Note also that giving users less privileges than they need will lead to additional technical support requests. Make sure you clearly tell your users what level of privileges you have given them. Specifying exactly what you have set AllowOverride to, and pointing them to the relevant documentation, will save yourself a lot of confusion later.

Note that it is completely equivalent to put a .htaccess file in a directory /www/htdocs/example containing a directive, and to put that same directive in a Directory section <Directory /www/htdocs/example> in your main server configuration:

.htaccess file in /www/htdocs/example:

Contents of .htaccess file in /www/htdocs/example

AddType text/example .exm

Section from your httpd.conf file

<Directory /www/htdocs/example>
AddType text/example .exm
 </Directory>

However, putting this configuration in your server configuration file will result in less of a performance hit, as the configuration is loaded once when httpd starts, rather than every time a file is requested.

The use of .htaccess files can be disabled completely by setting the AllowOverride directive to none:

AllowOverride None

How directives are applied

The configuration directives found in a .htaccess file are applied to the directory in which the .htaccess file is found, and to all subdirectories thereof. However, it is important to also remember that there may have been .htaccess files in directories higher up. Directives are applied in the order that they are found. Therefore, a .htaccess file in a particular directory may override directives found in .htaccess files found higher up in the directory tree. And those, in turn, may have overridden directives found yet higher up, or in the main server configuration file itself.

Example:

In the directory /www/htdocs/example1 we have a .htaccess file containing the following:

Options +ExecCGI

(Note: you must have "AllowOverride Options" in effect to permit the use of the "Options" directive in .htaccess files.)

In the directory /www/htdocs/example1/example2 we have a .htaccess file containing:

Options Includes

Because of this second .htaccess file, in the directory /www/htdocs/example1/example2, CGI execution is not permitted, as only Options Includes is in effect, which completely overrides any earlier setting that may have been in place.

Merging of .htaccess with the main configuration files

As discussed in the documentation on Configuration Sections, .htaccess files can override the <Directory> sections for the corresponding directory, but will be overridden by other types of configuration sections from the main configuration files. This fact can be used to enforce certain configurations, even in the presence of a liberal AllowOverride setting. For example, to prevent script execution while allowing anything else to be set in .htaccess you can use:

<Directory />
Allowoverride All
 </Directory>

<Location />
Options +IncludesNoExec -ExecCGI
 </Location>

Authentication example

If you jumped directly to this part of the document to find out how to do authentication, it is important to note one thing. There is a common misconception that you are required to use .htaccess files in order to implement password authentication. This is not the case. Putting authentication directives in a <Directory> section, in your main server configuration file, is the preferred way to implement this, and .htaccess files should be used only if you don't have access to the main server configuration file. See above for a discussion of when you should and should not use .htaccess files.

Having said that, if you still think you need to use a .htaccess file, you may find that a configuration such as what follows may work for you.

.htaccess file contents:

AuthType Basic
AuthName "Password Required"
AuthUserFile /www/passwords/password.file
AuthGroupFile /www/passwords/group.file
Require Group admins

Note that AllowOverride AuthConfig must be in effect for these directives to have any effect.

Please see the authentication tutorial for a more complete discussion of authentication and authorization.

Server Side Includes example

Another common use of .htaccess files is to enable Server Side Includes for a particular directory. This may be done with the following configuration directives, placed in a .htaccess file in the desired directory:

Options +Includes
AddType text/html shtml
AddHandler server-parsed shtml

Note that AllowOverride Options and AllowOverride FileInfo must both be in effect for these directives to have any effect.

Please see the SSI tutorial for a more complete discussion of server-side includes.

CGI example

Finally, you may wish to use a .htaccess file to permit the execution of CGI programs in a particular directory. This may be implemented with the following configuration:

Options +ExecCGI
AddHandler cgi-script cgi pl

Alternately, if you wish to have all files in the given directory be considered to be CGI programs, this may be done with the following configuration:

Options +ExecCGI
SetHandler cgi-script

Note that AllowOverride Options and AllowOverride FileInfo must both be in effect for these directives to have any effect.

Please see the CGI tutorial for a more complete discussion of CGI programming and configuration.

Troubleshooting

When you put configuration directives in a .htaccess file, and you don't get the desired effect, there are a number of things that may be going wrong.

Most commonly, the problem is that AllowOverride is not set such that your configuration directives are being honored. Make sure that you don't have a AllowOverride None in effect for the file scope in question. A good test for this is to put garbage in your .htaccess file and reload the page. If a server error is not generated, then you almost certainly have AllowOverride None in effect.

If, on the other hand, you are getting server errors when trying to access documents, check your httpd error log. It will likely tell you that the directive used in your .htaccess file is not permitted.

[Fri Sep 17 18:43:16 2010] [alert] [client 192.168.200.51] /var/www/html/.htaccess: DirectoryIndex not allowed here

This will indicate either that you've used a directive that is never permitted in .htaccess files, or that you simply don't have AllowOverride set to a level sufficient for the directive you've used. Consult the documentation for that particular directive to determine which is the case.

Alternately, it may tell you that you had a syntax error in your usage of the directive itself.

[Sat Aug 09 16:22:34 2008] [alert] [client 192.168.200.51] /var/www/html/.htaccess: RewriteCond: bad flag delimiters

In this case, the error message should be specific to the particular syntax error that you have committed.


Kullanıcı Dizinleri (public_html) - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Nasıllar ve Öğreticiler

Kullanıcı Dizinleri (public_html)

Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.

Çok kullanıcılı sistemlerde, UserDir yönergesi ile her kullanıcının kendi ev dizininde bir sitesi olması sağlanabilir. http://example.com/~kullanıcı/ adresinin ziyaretçileri "kullanıcı" isimli kullanıcının ev dizininin içeriğini değil, UserDir yönergesinde belirtilen alt dizinin içeriğini görürler.

Şuna dikkat edin: Öntanımlı olarak bu yönergelere erişim etkin değildir.Öntanımlı yapılandırma dosyasında

#Include conf/extra/httpd-userdir.conf

satırını açıklama olmaktan çıkarıp etkin hale getirmekle UserDir modülünü kullanıma sokarak ve httpd-userdir.conf dosyasında gerekli değişiklikleri yaparak veya ana yapılandırma dosyasındaki ilgili Directory bölümünün içine uygun yönergeleri yerleştirerek bu yönergelere erişimi etkin kılabilirsiniz.

Ayrıca bakınız:

  • URL’lerin Dosya Sistemi ile Eşleştirilmesi

Kullanıcı sayfaları dizinleri

İlgili Modüller İlgili Yönergeler
  • mod_userdir
  • UserDir
  • DirectoryMatch
  • AllowOverride

UserDir ile dosya yolunun belirtilmesi

UserDir yönergesinde kullanıcı sayfalarının yükleneceği dizin belirtilir. Bu yönergeye değeri çeşitli biçimlerde atanabilir.

Başında bölü çizgisi bulunmayan bir dosya yolu belirtilmişse, kullanıcının ev dizinine göreli bir dizin belirtildiği varsayılır. Yapılandırmada şöyle bir satır varsa:

UserDir public_html

http://example.com/~orhan/dosya.html adresine karşılık gelen dosya yolu /home/orhan/public_html/dosya.html olarak çözümlenir.

Eğer başında bölü çizgisi bulunan bir dosya yolu belirtilirse, kullanıcı sayfalarının bu dizinin altında kullanıcı ismini taşıyan dizinlerde bulunacağı varsayılır. Yapılandırmada şöyle bir satır varsa:

UserDir /var/html

http://example.com/~orhan/dosya.html adresine karşılık gelen dosya yolu /var/html/orhan/dosya.html olarak çözümlenir.

Eğer belirtilen dosya yolu bir yıldız imi (*) içeriyorsa yıldız iminin yerine kullanıcı ismi yerleştirilerek elde edilen dosya yolu kullanılır. Yapılandırmada şöyle bir satır varsa:

UserDir /var/siteler/*/sayfam

http://example.com/~orhan/dosya.html adresine karşılık gelen dosya yolu /var/siteler/orhan/sayfam/dosya.html olarak çözümlenir.

Çok sayıda dizin veya dizin yolu belirtmek de mümkündür.

UserDir public_html /var/siteler

http://example.com/~orhan/dosya.html adresini Apache önce /home/orhan/public_html/dosya.html olarak arayacak, bulamazsa /var/siteler/orhan/sayfam/dosya.html olarak arayacak, bulduğunda istenen dosyayı sunacaktır.

Harici adreslere yönlendirme

UserDir yönergesi kullanıcı dizini isteklerini harici adreslere yönlendirmek için de kullanılabilir.

UserDir http://example.org/users/*/

Bu yapılandırmaya göre http://example.com/~bob/abc.html için yapılan bir istek http://example.org/users/bob/abc.html adresine yönlendirilecektir.

Bu özelliği kullanacak kullanıcıların sınırlandırılması

UserDir yönergesinin açıklamasında belirtilen sözdizimini kullanarak bu işlevselliği bazı kullanıcılara yasaklayabilirsiniz:

UserDir disabled root ahmet mustafa

Bu yapılandırma ile disabled deyiminin bulunduğu satırdaki kullanıcılar dışında kalan bütün kullanıcılar için bu özellik etkin olacaktır. Benzer şekilde, aşağıdaki yapılandırma ile işlevselliğin belli kullanıcılar dışında kullanılmamasını da sağlayabilirsiniz:

UserDir disabled
UserDir enabled orhan yasar

Daha fazla örnek için UserDir yönergesinin açıklamasına bakabilirsiniz.

Her kullanıcıya bir CGI dizini tahsis etmek

Her kullanıcıya kendine ait bir CGI dizini vermek isterseniz, bir <Directory> yönergesi ile kullanıcının ev dizinindeki belli bir dizini CGI-etkin duruma getirebilirsiniz.

<Directory /home/*/public_html/cgi-bin/>
Options ExecCGI
SetHandler cgi-script
</Directory>

UserDir yönergesinde public_html belirtildiği varsayımıyla mesela.cgi betiği bu dizinden şöyle bir adresle yüklenebilir:

http://example.com/~orhan/cgi-bin/mesela.cgi

Kullanıcıların yapılandırmayı değiştirmesine izin vermek

Kullanıcıların kendilerine ayrılan bölge içinde sunucu yapılandırmasını değiştirebilmelerine izin vermek isterseniz, .htaccess dosyalarını kullanmalarına izin vermeniz gerekir. Kullanıcının değiştirmesine izin vereceğiniz yönerge türlerini AllowOverride yönergesinde belirtmeyi ihmal etmeyin. .htaccess dosyalarının kullanımı ile ilgili daha ayrıntılı bilgi için .htaccess öğreticisine bakınız.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Platform Specific Notes - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2

Platform Specific Notes

Microsoft Windows

Using Apache

This document explains how to install, configure and run Apache 2.0 under Microsoft Windows.

See: Using Apache with Microsoft Windows

Compiling Apache

There are many important points before you begin compiling Apache. This document explain them.

See: Compiling Apache for Microsoft Windows

Other Platforms

Novell NetWare

This document explains how to install, configure and run Apache 2.0 under Novell NetWare 5.1 and above.

See: Using Apache With Novell NetWare

EBCDIC

Version 1.3 of the Apache HTTP Server is the first version which includes a port to a (non-ASCII) mainframe machine which uses the EBCDIC character set as its native codeset.

Warning: This document has not been updated to take into account changes made in the 2.0 version of the Apache HTTP Server. Some of the information may still be relevant, but please use it with care.

See: The Apache EBCDIC Port

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


Using Apache HTTP Server on Microsoft Windows - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Platform Specific Notes

Using Apache HTTP Server on Microsoft Windows

This document explains how to install, configure and run Apache 2.2 under Microsoft Windows. If you have questions after reviewing the documentation (and any event and error logs), you should consult the peer-supported users' mailing list.

This document assumes that you are installing a binary distribution of Apache. If you want to compile Apache yourself (possibly to help with development or tracking down bugs), see Compiling Apache for Microsoft Windows.

Operating System Requirements

The primary Windows platform for running Apache 2.2 is Windows 2000 or later. The binary installer only works with the x86 family of processors, such as Intel and AMD processors. Always obtain and install the current service pack to avoid operating system bugs.

Running Apache on Windows 9x is ignored by the developers, and is strongly discouraged. On Windows NT 4.0, installing Service Pack 6 is required. Apache HTTP Server versions later than 2.2 will not run on any operating system earlier than Windows 2000.

Downloading Apache for Windows

The Apache HTTP Server Project itself does not provide binary releases of software, only source code. Individual committers may provide binary packages as a convenience, but it is not a release deliverable.

If you cannot compile the Apache HTTP Server yourself, you can obtain a binary package from numerous binary distributions available on the Internet.

Popular options for deploying Apache httpd, and, optionally, PHP and MySQL, on Microsoft Windows, include:

  • ApacheHaus
  • Apache Lounge
  • BitNami WAMP Stack
  • WampServer
  • XAMPP

Installing Apache for Windows

You need Microsoft Installer 2.0 or above for the installation to work. For Windows NT 4.0 and 2000 refer to Microsoft's article KB 292539. Windows XP and later do not require this update. The Windows 98/ME installer engine appears to no longer be available from Microsoft, and these instructions no longer detail such prerequisites.

Note that you cannot install two versions of Apache 2.2 on the same computer with the binary installer. You can, however, install a version of the 1.3 series and a version of the 2.2 series on the same computer without problems. If you need to have two different 2.2 versions on the same computer, you have to compile and install Apache from the source.

Run the Apache .msi file you downloaded above. The installation will ask you for these things:

  1. Network Domain. Enter the DNS domain in which your server is or will be registered in. For example, if your server's full DNS name is server.mydomain.net, you would type mydomain.net here.

  2. Server Name. Your server's full DNS name. From the example above, you would type server.mydomain.net here.

  3. Administrator's Email Address. Enter the server administrator's or webmaster's email address here. This address will be displayed along with error messages to the client by default.

  4. For whom to install Apache Select for All Users, on Port 80, as a Service - Recommended if you'd like your new Apache to listen at port 80 for incoming traffic. It will run as a service (that is, Apache will run even if no one is logged in on the server at the moment) Select only for the Current User, on Port 8080, when started Manually if you'd like to install Apache for your personal experimenting or if you already have another WWW server running on port 80.

  5. The installation type. Select Typical for everything except the source code and libraries for module development. With Custom you can specify what to install. A full install will require about 13 megabytes of free disk space. This does not include the size of your web site(s).

  6. Where to install. The default path is C:\Program Files\Apache Software Foundation under which a directory called Apache2.2 will be created by default.

During the installation, Apache will configure the files in the conf subdirectory to reflect the chosen installation directory. However, if any of the configuration files in this directory already exist, they will not be overwritten. Instead, the new copy of the corresponding file will be left with the extension .default. So, for example, if conf\httpd.conf already exists, it will be renamed as conf\httpd.conf.default. After the installation you should manually check to see what new settings are in the .default file, and if necessary, update your existing configuration file.

Also, if you already have a file called htdocs\index.html, it will not be overwritten (and no index.html.default will be installed either). This means it should be safe to install Apache over an existing installation, although you would have to stop the existing running server before doing the installation, and then start the new one after the installation is finished.

After installing Apache, you must edit the configuration files in the conf subdirectory as required. These files will be configured during the installation so that Apache is ready to be run from the directory it was installed into, with the documents server from the subdirectory htdocs. There are lots of other options which you should set before you really start using Apache. However, to get started quickly, the files should work as installed.

Advanced Installation Topics

One feature of the installer, "Build Headers and Libraries", can be ignored by most users, but should be installed if compiling third party modules. The "APR Iconv Code Pages" can similarly be omitted by most users, unless using mod_charset_lite or a third party module which relies on APR internationalization features.

There are requests to ship a .zip file from time to time. There is no point in the ASF consuming additional storage, mirroring and bandwidth for this purpose, because the .msi installer allows the installation artifacts to all be unpacked using the msiexec /a network installation option. Using this command against any .msi will result in an exploded tree of all of the individual files and components.

The installation options above can be customized by users familiar with msiexec.exe options and silent installation. The actual installer sources are available in the httpd/httpd/win32-msi/ tree of the httpd project subversion respository. For reference, some of the more common variables which may be modified are;

  • AgreeToLicense (toggle to "Yes")
  • ALLUSERS (choose between Null and "1")
  • ApplicationUsers (toggle to "OnlyCurrentUser")
  • EXISTING_APACHE_SERVICE_PATH
  • INSTALLDIR (default "ProgramFilesFolder\Apache Software Foundation\Apache2.2\")
  • INSTALLLEVEL (default "100", refer to list below)
  • RESOLVED_WINSOCK2 (toggle to "1")
  • SERVERADMIN
  • SERVERDOMAIN
  • SERVERNAME
  • SERVERPORT (default "80")
  • SERVERSSLPORT (default "443")
  • SERVICEINTERNALNAME (default "Apache2.2", no spaces!)
  • SERVICENAME (default "Apache2.2", include spaces)
  • SetupType (default "Typical")

The installation level of various features, which may be individually toggled, include;

  • Apache (1, base Apache HTTP Server 2.2 feature)
  • ApacheDocs (11, Apache Documentation)
  • ApacheMonitoring (41, Apache Service Taskbar Icon)
  • ApacheRuntime (1, Apache Runtime)
  • BuildFiles (101, Build Headers and Libraries)
  • Iconv (21, APR Iconv Code Pages)
  • OpensslBin (31, OpenSSL Runtime)
  • SslBin (41, Ssl Binaries)

Customizing Apache for Windows

Apache is configured by the files in the conf subdirectory. These are the same files used to configure the Unix version, but there are a few different directives for Apache on Windows. See the directive index for all the available directives.

The main differences in Apache for Windows are:

  • Because Apache for Windows is multithreaded, it does not use a separate process for each request, as Apache can on Unix. Instead there are usually only two Apache processes running: a parent process, and a child which handles the requests. Within the child process each request is handled by a separate thread.

    The process management directives are also different:

    MaxRequestsPerChild: Like the Unix directive, this controls how many requests (actually, connections) which a single child process will serve before exiting. However, unlike on Unix, a replacement process is not instantly available. Use the default MaxRequestsPerChild 0, unless instructed to change the behavior to overcome a memory leak in third party modules or in-process applications.

    Warning: The server configuration file is reread when a new child process is started. If you have modified httpd.conf, the new child may not start or you may receive unexpected results.

    ThreadsPerChild: This directive is new. It tells the server how many threads it should use. This is the maximum number of connections the server can handle at once, so be sure to set this number high enough for your site if you get a lot of hits. The recommended default is ThreadsPerChild 150, but this must be adjusted to reflect the greatest anticipated number of simultaneous connections to accept.

  • The directives that accept filenames as arguments must use Windows filenames instead of Unix ones. However, because Apache may interpret backslashes as an "escape character" sequence, you should consistently use forward slashes in path names, not backslashes.

  • While filenames are generally case-insensitive on Windows, URLs are still treated internally as case-sensitive before they are mapped to the filesystem. For example, the <Location>, Alias, and ProxyPass directives all use case-sensitive arguments. For this reason, it is particularly important to use the <Directory> directive when attempting to limit access to content in the filesystem, since this directive applies to any content in a directory, regardless of how it is accessed. If you wish to assure that only lowercase is used in URLs, you can use something like:

    RewriteEngine On
    RewriteMap lowercase int:tolower
    RewriteCond %{REQUEST_URI} [A-Z]
    RewriteRule (.*) ${lowercase:$1} [R,L]

  • When running, Apache needs write access only to the logs directory and any configured cache directory tree. Due to the issue of case insensitive and short 8.3 format names, Apache must validate all path names given. This means that each directory which Apache evaluates, from the drive root up to the directory leaf, must have read, list and traverse directory permissions. If Apache2.2 is installed at C:\Program Files, then the root directory, Program Files and Apache2.2 must all be visible to Apache.

  • Apache for Windows contains the ability to load modules at runtime, without recompiling the server. If Apache is compiled normally, it will install a number of optional modules in the \Apache2.2\modules directory. To activate these or other modules, the new LoadModule directive must be used. For example, to activate the status module, use the following (in addition to the status-activating directives in access.conf):

    LoadModule status_module modules/mod_status.so

    Information on creating loadable modules is also available.

  • Apache can also load ISAPI (Internet Server Application Programming Interface) extensions such as those used by Microsoft IIS and other Windows servers. More information is available. Note that Apache cannot load ISAPI Filters, and ISAPI Handlers with some Microsoft feature extensions will not work.

  • When running CGI scripts, the method Apache uses to find the interpreter for the script is configurable using the ScriptInterpreterSource directive.

  • Since it is often difficult to manage files with names like .htaccess in Windows, you may find it useful to change the name of this per-directory configuration file using the AccessFilename directive.

  • Any errors during Apache startup are logged into the Windows event log when running on Windows NT. This mechanism acts as a backup for those situations where Apache is not yet prepared to use the error.log file. You can review the Windows Application Event Log by using the Event Viewer, e.g. Start - Settings - Control Panel - Administrative Tools - Event Viewer.

Running Apache as a Service

You can install Apache as a service automatically during the installation. If you chose to install for all users, the installation will create an Apache service for you. If you specify to install for yourself only, you can manually register Apache as a service after the installation. You have to be a member of the Administrators group for the service installation to succeed.

Apache comes with a utility called the Apache Service Monitor. With it you can see and manage the state of all installed Apache services on any machine on your network. To be able to manage an Apache service with the monitor, you have to first install the service (either automatically via the installation or manually).

You can install Apache as a Windows NT service as follows from the command prompt at the Apache bin subdirectory:

httpd.exe -k install

If you need to specify the name of the service you want to install, use the following command. You have to do this if you have several different service installations of Apache on your computer. If you specify a name during the install, you have to also specify it during any other -k operation.

httpd.exe -k install -n "MyServiceName"

If you need to have specifically named configuration files for different services, you must use this:

httpd.exe -k install -n "MyServiceName" -f "c:\files\my.conf"

If you use the first command without any special parameters except -k install, the service will be called Apache2.2 and the configuration will be assumed to be conf\httpd.conf.

Removing an Apache service is easy. Just use:

httpd.exe -k uninstall

The specific Apache service to be uninstalled can be specified by using:

httpd.exe -k uninstall -n "MyServiceName"

Normal starting, restarting and shutting down of an Apache service is usually done via the Apache Service Monitor, by using commands like NET START Apache2.2 and NET STOP Apache2.2 or via normal Windows service management. Before starting Apache as a service by any means, you should test the service's configuration file by using:

httpd.exe -n "MyServiceName" -t

You can control an Apache service by its command line switches, too. To start an installed Apache service you'll use this:

httpd.exe -k start -n "MyServiceName"

To stop an Apache service via the command line switches, use this:

httpd.exe -k stop -n "MyServiceName"

or

httpd.exe -k shutdown -n "MyServiceName"

You can also restart a running service and force it to reread its configuration file by using:

httpd.exe -k restart -n "MyServiceName"

By default, all Apache services are registered to run as the system user (the LocalSystem account). The LocalSystem account has no privileges to your network via any Windows-secured mechanism, including the file system, named pipes, DCOM, or secure RPC. It has, however, wide privileges locally.

Never grant any network privileges to the LocalSystem account! If you need Apache to be able to access network resources, create a separate account for Apache as noted below.

It is recommended that users create a separate account for running Apache service(s). If you have to access network resources via Apache, this is required.

  1. Create a normal domain user account, and be sure to memorize its password.
  2. Grant the newly-created user a privilege of Log on as a service and Act as part of the operating system. On Windows NT 4.0 these privileges are granted via User Manager for Domains, but on Windows 2000 and XP you probably want to use Group Policy for propagating these settings. You can also manually set these via the Local Security Policy MMC snap-in.
  3. Confirm that the created account is a member of the Users group.
  4. Grant the account read and execute (RX) rights to all document and script folders (htdocs and cgi-bin for example).
  5. Grant the account change (RWXD) rights to the Apache logs directory.
  6. Grant the account read and execute (RX) rights to the httpd.exe binary executable.
It is usually a good practice to grant the user the Apache service runs as read and execute (RX) access to the whole Apache2.2 directory, except the logs subdirectory, where the user has to have at least change (RWXD) rights.

If you allow the account to log in as a user and as a service, then you can log on with that account and test that the account has the privileges to execute the scripts, read the web pages, and that you can start Apache in a console window. If this works, and you have followed the steps above, Apache should execute as a service with no problems.

Error code 2186 is a good indication that you need to review the "Log On As" configuration for the service, since Apache cannot access a required network resource. Also, pay close attention to the privileges of the user Apache is configured to run as.

When starting Apache as a service you may encounter an error message from the Windows Service Control Manager. For example, if you try to start Apache by using the Services applet in the Windows Control Panel, you may get the following message:

Could not start the Apache2.2 service on \\COMPUTER
Error 1067; The process terminated unexpectedly.

You will get this generic error if there is any problem with starting the Apache service. In order to see what is really causing the problem you should follow the instructions for Running Apache for Windows from the Command Prompt.

If you are having problems with the service, it is suggested you follow the instructions below to try starting httpd.exe from a console window, and work out the errors before struggling to start it as a service again.

Running Apache as a Console Application

Running Apache as a service is usually the recommended way to use it, but it is sometimes easier to work from the command line (on Windows 9x running Apache from the command line is the recommended way due to the lack of reliable service support.)

To run Apache from the command line as a console application, use the following command:

httpd.exe

Apache will execute, and will remain running until it is stopped by pressing Control-C.

You can also run Apache via the shortcut Start Apache in Console placed to Start Menu --> Programs --> Apache HTTP Server 2.2.xx --> Control Apache Server during the installation. This will open a console window and start Apache inside it. If you don't have Apache installed as a service, the window will remain visible until you stop Apache by pressing Control-C in the console window where Apache is running in. The server will exit in a few seconds. However, if you do have Apache installed as a service, the shortcut starts the service. If the Apache service is running already, the shortcut doesn't do anything.

If Apache is running as a service, you can tell it to stop by opening another console window and entering:

httpd.exe -k shutdown

Running as a service should be preferred over running in a console window because this lets Apache end any current operations and clean up gracefully.

But if the server is running in a console window, you can only stop it by pressing Control-C in the same window.

You can also tell Apache to restart. This forces it to reread the configuration file. Any operations in progress are allowed to complete without interruption. To restart Apache, either press Control-Break in the console window you used for starting Apache, or enter

httpd.exe -k restart

if the server is running as a service.

Note for people familiar with the Unix version of Apache: these commands provide a Windows equivalent to kill -TERM pid and kill -USR1 pid. The command line option used, -k, was chosen as a reminder of the kill command used on Unix.

If the Apache console window closes immediately or unexpectedly after startup, open the Command Prompt from the Start Menu --> Programs. Change to the folder to which you installed Apache, type the command httpd.exe, and read the error message. Then change to the logs folder, and review the error.log file for configuration mistakes. If you accepted the defaults when you installed Apache, the commands would be:

c:
cd "\Program Files\Apache Software Foundation\Apache2.2\bin"
httpd.exe

Then wait for Apache to stop, or press Control-C. Then enter the following:

cd ..\logs
more < error.log

When working with Apache it is important to know how it will find the configuration file. You can specify a configuration file on the command line in two ways:

  • -f specifies an absolute or relative path to a particular configuration file:

    httpd.exe -f "c:\my server files\anotherconfig.conf"

    or

    httpd.exe -f files\anotherconfig.conf

  • -n specifies the installed Apache service whose configuration file is to be used:

    httpd.exe -n "MyServiceName"

In both of these cases, the proper ServerRoot should be set in the configuration file.

If you don't specify a configuration file with -f or -n, Apache will use the file name compiled into the server, such as conf\httpd.conf. This built-in path is relative to the installation directory. You can verify the compiled file name from a value labelled as SERVER_CONFIG_FILE when invoking Apache with the -V switch, like this:

httpd.exe -V

Apache will then try to determine its ServerRoot by trying the following, in this order:

  1. A ServerRoot directive via the -C command line switch.
  2. The -d switch on the command line.
  3. Current working directory.
  4. A registry entry which was created if you did a binary installation.
  5. The server root compiled into the server. This is /apache by default, you can verify it by using httpd.exe -V and looking for a value labelled as HTTPD_ROOT.

During the installation, a version-specific registry key is created in the Windows registry. The location of this key depends on the type of the installation. If you chose to install Apache for all users, the key is located under the HKEY_LOCAL_MACHINE hive, like this (the version numbers will of course vary between different versions of Apache:

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Apache\2.2.2

Correspondingly, if you chose to install Apache for the current user only, the key is located under the HKEY_CURRENT_USER hive, the contents of which are dependent of the user currently logged on:

HKEY_CURRENT_USER\SOFTWARE\Apache Software Foundation\Apache\2.2.2

This key is compiled into the server and can enable you to test new versions without affecting the current version. Of course, you must take care not to install the new version in the same directory as another version.

If you did not do a binary install, Apache will in some scenarios complain about the missing registry key. This warning can be ignored if the server was otherwise able to find its configuration file.

The value of this key is the ServerRoot directory which contains the conf subdirectory. When Apache starts it reads the httpd.conf file from that directory. If this file contains a ServerRoot directive which contains a different directory from the one obtained from the registry key above, Apache will forget the registry key and use the directory from the configuration file. If you copy the Apache directory or configuration files to a new location it is vital that you update the ServerRoot directive in the httpd.conf file to reflect the new location.

Testing the Installation

After starting Apache (either in a console window or as a service) it will be listening on port 80 (unless you changed the Listen directive in the configuration files or installed Apache only for the current user). To connect to the server and access the default page, launch a browser and enter this URL:

http://localhost/

Apache should respond with a welcome page and you should see "It Works!". If nothing happens or you get an error, look in the error.log file in the logs subdirectory. If your host is not connected to the net, or if you have serious problems with your DNS (Domain Name Service) configuration, you may have to use this URL:

http://127.0.0.1/

If you happen to be running Apache on an alternate port, you need to explicitly put that in the URL:

http://127.0.0.1:8080/

Once your basic installation is working, you should configure it properly by editing the files in the conf subdirectory. Again, if you change the configuration of the Windows NT service for Apache, first attempt to start it from the command line to make sure that the service starts with no errors.

Because Apache cannot share the same port with another TCP/IP application, you may need to stop, uninstall or reconfigure certain other services before running Apache. These conflicting services include other WWW servers, some firewall implementations, and even some client applications (such as Skype) which will use port 80 to attempt to bypass firewall issues.

Configuring Access to Network Resources

Access to files over the network can be specified using two mechanisms provided by Windows:

Mapped drive letters
e.g., Alias /images/ Z:/
UNC paths
e.g., Alias /images/ //imagehost/www/images/

Mapped drive letters allow the administrator to maintain the mapping to a specific machine and path outside of the Apache httpd configuration. However, these mappings are associated only with interactive sessions and are not directly available to Apache httpd when it is started as a service. Use only UNC paths for network resources in httpd.conf so that the resources can be accessed consistently regardless of how Apache httpd is started. (Arcane and error prone procedures may work around the restriction on mapped drive letters, but this is not recommended.)

Example DocumentRoot with UNC path

DocumentRoot //dochost/www/html/

Example DocumentRoot with IP address in UNC path

DocumentRoot //192.168.1.50/docs/

Example Alias and corresponding Directory with UNC path

Alias /images/ //imagehost/www/images/

<Directory //imagehost/www/images/>
...
<Directory>

When running Apache httpd as a service, you must create a separate account in order to access network resources, as described above.


Compiling Apache for Microsoft Windows - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Platform Specific Notes

Compiling Apache for Microsoft Windows

There are many important points before you begin compiling Apache. See Using Apache with Microsoft Windows before you begin.

Requirements

Compiling Apache requires the following environment to be properly installed:

  • Disk Space

    Make sure you have at least 200 MB of free disk space available. After installation Apache requires approximately 80 MB of disk space, plus space for log and cache files, which can grow rapidly. The actual disk space requirements will vary considerably based on your chosen configuration and any third-party modules or libraries, especially when OpenSSL is also built. Because many files are text and very easily compressed, NTFS filesystem compression cuts these requirements in half.

  • Appropriate Patches

    The httpd binary is built with the help of several patches to third party packages, which ensure the released code is buildable and debuggable. These patches are available and distributed from http://www.apache.org/dist/httpd/binaries/win32/patches_applied/ and are recommended to be applied to obtain identical results as the "official" ASF distributed binaries.

  • Microsoft Visual C++ 6.0 (Visual Studio 97) or later.

    Apache can be built using the command line tools, or from within the Visual Studio IDE Workbench. The command line build requires the environment to reflect the PATH, INCLUDE, LIB and other variables that can be configured with the vcvars32.bat script.

    You may want the Visual Studio Processor Pack for your older version of Visual Studio, or a full (not Express) version of newer Visual Studio editions, for the ml.exe assembler. This will allow you to build OpenSSL, if desired, using the more efficient assembly code implementation.
    Only the Microsoft compiler tool chain is actively supported by the active httpd contributors. Although the project regularly accepts patches to ensure MinGW and other alternative builds work and improve upon them, they are not actively maintained and are often broken in the course of normal development.

  • Updated Microsoft Windows Platform SDK, February 2003 or later.

    An appropriate Windows Platform SDK is included by default in the full (not express/lite) versions of Visual C++ 7.1 (Visual Studio 2002) and later, these users can ignore these steps unless explicitly choosing a newer or different version of the Platform SDK.

    To use Visual C++ 6.0 or 7.0 (Studio 2000 .NET), the Platform SDK environment must be prepared using the setenv.bat script (installed by the Platform SDK) before starting the command line build or launching the msdev/devenv GUI environment. Installing the Platform SDK for Visual Studio Express versions (2003 and later) should adjust the default environment appropriately.

    "c:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32"
    "c:\Program Files\Platform SDK\setenv.bat"

  • Perl and awk

    Several steps recommended here require a perl interpreter during the build preparation process, but it is otherwise not required.

    To install Apache within the build system, several files are modified using the awk.exe utility. awk was chosen since it is a very small download (compared with Perl or WSH/VB) and accomplishes the task of modifying configuration files upon installation. Brian Kernighan's http://www.cs.princeton.edu/~bwk/btl.mirror/ site has a compiled native Win32 binary, http://www.cs.princeton.edu/~bwk/btl.mirror/awk95.exe which you must save with the name awk.exe (rather than awk95.exe).

    If awk.exe is not found, Makefile.win's install target will not perform substitutions in the installed .conf files. You must manually modify the installed .conf files to allow the server to start. Search and replace all "@token@" tags as appropriate.
    The Visual Studio IDE will only find awk.exe from the PATH, or executable path specified in the menu option Tools -> Options -> (Projects ->) Directories. Ensure awk.exe is in your system path.
    Also note that if you are using Cygwin tools (http://www.cygwin.com/) the awk utility is named gawk.exe and that the file awk.exe is really a symlink to the gawk.exe file. The Windows command shell does not recognize symlinks, and because of this building InstallBin will fail. A workaround is to delete awk.exe from the cygwin installation and copy gawk.exe to awk.exe. Also note the cygwin/mingw ports of gawk 3.0.x were buggy, please upgrade to 3.1.x before attempting to use any gawk port.

  • [Optional] zlib library (for mod_deflate)

    Zlib must be installed into a srclib subdirectory named zlib. This must be built in-place. Zlib can be obtained from http://www.zlib.net/ -- the mod_deflate is confirmed to work correctly with version 1.2.3.

    nmake -f win32\Makefile.msc
    nmake -f win32\Makefile.msc test

  • [Optional] OpenSSL libraries (for mod_ssl and ab.exe with ssl support)

    The OpenSSL library is cryptographic software. The country in which you currently reside may have restrictions on the import, possession, use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check your country's laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted. See http://www.wassenaar.org/ for more information.

    Configuring and building OpenSSL requires perl to be installed.

    OpenSSL must be installed into a srclib subdirectory named openssl, obtained from http://www.openssl.org/source/, in order to compile mod_ssl or the abs.exe project, which is ab.c with SSL support enabled. To prepare OpenSSL to be linked to Apache mod_ssl or abs.exe, and disable patent encumbered features in OpenSSL, you might use the following build commands:

    perl Configure no-rc5 no-idea enable-mdc2 enable-zlib VC-WIN32 -Ipath/to/srclib/zlib -Lpath/to/srclib/zlib
    ms\do_masm.bat
    nmake -f ms\ntdll.mak

    It is not advisable to use zlib-dynamic, as that transfers the cost of deflating SSL streams to the first request which must load the zlib dll. Note the suggested patch enables the -L flag to work with windows builds, corrects the name of zdll.lib and ensures .pdb files are generated for troubleshooting. If the assembler is not installed, you would add no-asm above and use ms\do_ms.bat instead of the ms\do_masm.bat script.

  • [Optional] Database libraries (for mod_dbd and mod_authn_dbm)

    The apr-util library exposes dbm (keyed database) and dbd (query oriented database) client functionality to the httpd server and its modules, such as authentication and authorization. The sdbm dbm and odbc dbd providers are compiled unconditionally.

    The dbd support includes the Oracle instantclient package, MySQL, PostgreSQL and sqlite. To build these all, for example, set up the LIB to include the library path, INCLUDE to include the headers path, and PATH to include the dll bin path of all four SDK's, and set the DBD_LIST environment variable to inform the build which client driver SDKs are installed correctly, e.g.;

    set DBD_LIST=sqlite3 pgsql oracle mysql

    Similarly, the dbm support can be extended with DBM_LIST to build a Berkeley DB provider (db) and/or gdbm provider, by similarly configuring LIB, INCLUDE and PATH first to ensure the client library libs and headers are available.

    set DBM_LIST=db gdbm

    Depending on the choice of database distributions, it may be necessary to change the actual link target name (e.g. gdbm.lib vs. libgdb.lib) that are listed in the corresponding .dsp/.mak files within the directories srclib\apr-util\dbd or ...\dbm.

    See the README-win32.txt file for more hints on obtaining the various database driver SDKs.

Command-Line Build

Makefile.win is the top level Apache makefile. To compile Apache on Windows, simply use one of the following commands to build the release or debug flavor:

nmake /f Makefile.win _apacher

nmake /f Makefile.win _apached

Either command will compile Apache. The latter will disable optimization of the resulting files, making it easier to single step the code to find bugs and track down problems.

You can add your apr-util dbd and dbm provider choices with the additional make (environment) variables DBD_LIST and DBM_LIST, see the comments about [Optional] Database libraries, above. Review the initial comments in Makefile.win for additional options that can be provided when invoking the build.

Developer Studio Workspace IDE Build

Apache can also be compiled using VC++'s Visual Studio development environment. To simplify this process, a Visual Studio workspace, Apache.dsw, is provided. This workspace exposes the entire list of working .dsp projects that are required for the complete Apache binary release. It includes dependencies between the projects to assure that they are built in the appropriate order.

Open the Apache.dsw workspace, and select InstallBin (Release or Debug build, as desired) as the Active Project. InstallBin causes all related project to be built, and then invokes Makefile.win to move the compiled executables and dlls. You may personalize the INSTDIR= choice by changing InstallBin's Settings, General tab, Build command line entry. INSTDIR defaults to the /Apache2 directory. If you only want a test compile (without installing) you may build the BuildBin project instead.

The .dsp project files are distributed in Visual Studio 6.0 (98) format. Visual C++ 5.0 (97) will recognize them. Visual Studio 2002 (.NET) and later users must convert Apache.dsw plus the .dsp files into an Apache.sln plus .msproj files. Be sure you reconvert the .msproj file again if its source .dsp file changes! This is really trivial, just open Apache.dsw in the VC++ 7.0 IDE once again and reconvert.

There is a flaw in the .vcproj conversion of .dsp files. devenv.exe will mis-parse the /D flag for RC flags containing long quoted /D'efines which contain spaces. The command:

perl srclib\apr\build\cvtdsp.pl -2005

will convert the /D flags for RC flags to use an alternate, parseable syntax; unfortunately this syntax isn't supported by Visual Studio 97 or its exported .mak files. These /D flags are used to pass the long description of the mod_apachemodule.so files to the shared .rc resource version-identifier build.

Visual Studio 2002 (.NET) and later users should also use the Build menu, Configuration Manager dialog to uncheck both the Debug and Release Solution modules abs, mod_deflate and mod_ssl components, as well as every component starting with apr_db*. These modules are built by invoking nmake, or the IDE directly with the BinBuild target, which builds those modules conditionally if the srclib directories openssl and/or zlib exist, and based on the setting of DBD_LIST and DBM_LIST environment variables.

Exporting command-line .mak files

Exported .mak files pose a greater hassle, but they are required for Visual C++ 5.0 users to build mod_ssl, abs (ab with SSL support) and/or mod_deflate. The .mak files also support a broader range of C++ tool chain distributions, such as Visual Studio Express.

You must first build all projects in order to create all dynamic auto-generated targets, so that dependencies can be parsed correctly. Build the entire project from within the Visual Studio 6.0 (98) IDE, using the BuildAll target, then use the Project Menu Export for all makefiles (checking on "with dependencies".) Run the following command to correct absolute paths into relative paths so they will build anywhere:

perl srclib\apr\build\fixwin32mak.pl

You must type this command from the top level directory of the httpd source tree. Every .mak and .dep project file within the current directory and below will be corrected, and the timestamps adjusted to reflect the .dsp.

Always review the generated .mak and .dep files for Platform SDK or other local, machine specific file paths. The DevStudio\Common\MSDev98\bin\ (VC6) directory contains a sysincl.dat file, which lists all exceptions. Update this file (including both forward and backslashed paths, such as both sys/time.h and sys\time.h) to ignore such newer dependencies. Including local-install paths in a distributed .mak file will cause the build to fail completely.

If you contribute back a patch that revises project files, we must commit project files in Visual Studio 6.0 format. Changes should be simple, with minimal compilation and linkage flags that can be recognized by all Visual Studio environments.

Installation

Once Apache has been compiled, it needs to be installed in its server root directory. The default is the \Apache2 directory, of the same drive.

To build and install all the files into the desired folder dir automatically, use one of the following nmake commands:

nmake /f Makefile.win installr INSTDIR=dir
nmake /f Makefile.win installd INSTDIR=dir

The dir argument to INSTDIR provides the installation directory; it can be omitted if Apache is to be installed into \Apache22 (of the current drive).

Warning about building Apache from the development tree

Note only the .dsp files are maintained between release builds. The .mak files are NOT regenerated, due to the tremendous waste of reviewer's time. Therefore, you cannot rely on the NMAKE commands above to build revised .dsp project files unless you then export all .mak files yourself from the project. This is unnecessary if you build from within the Microsoft Developer Studio environment.


Using Apache With Novell NetWare - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Platform Specific Notes

Using Apache With Novell NetWare

This document explains how to install, configure and run Apache 2.0 under Novell NetWare 6.0 and above. If you find any bugs, or wish to contribute in other ways, please use our bug reporting page.

The bug reporting page and dev-httpd mailing list are not provided to answer questions about configuration or running Apache. Before you submit a bug report or request, first consult this document, the Frequently Asked Questions page and the other relevant documentation topics. If you still have a question or problem, post it to the novell.devsup.webserver newsgroup, where many Apache users are more than willing to answer new and obscure questions about using Apache on NetWare.

Most of this document assumes that you are installing Apache from a binary distribution. If you want to compile Apache yourself (possibly to help with development, or to track down bugs), see the section on Compiling Apache for NetWare below.

Requirements

Apache 2.0 is designed to run on NetWare 6.0 service pack 3 and above. If you are running a service pack less than SP3, you must install the latest NetWare Libraries for C (LibC).

NetWare service packs are available here.

Apache 2.0 for NetWare can also be run in a NetWare 5.1 environment as long as the latest service pack or the latest version of the NetWare Libraries for C (LibC) has been installed . WARNING: Apache 2.0 for NetWare has not been targeted for or tested in this environment.

Downloading Apache for NetWare

Information on the latest version of Apache can be found on the Apache web server at http://www.apache.org/. This will list the current release, any more recent alpha or beta-test releases, together with details of mirror web and anonymous ftp sites. Binary builds of the latest releases of Apache 2.0 for NetWare can be downloaded from here.

Installing Apache for NetWare

There is no Apache install program for NetWare currently. If you are building Apache 2.0 for NetWare from source, you will need to copy the files over to the server manually.

Follow these steps to install Apache on NetWare from the binary download (assuming you will install to sys:/apache2):

  • Unzip the binary download file to the root of the SYS: volume (may be installed to any volume)
  • Edit the httpd.conf file setting ServerRoot and ServerName along with any file path values to reflect your correct server settings
  • Add SYS:/APACHE2 to the search path, for example:

    SEARCH ADD SYS:\APACHE2

Follow these steps to install Apache on NetWare manually from your own build source (assuming you will install to sys:/apache2):

  • Create a directory called Apache2 on a NetWare volume
  • Copy APACHE2.NLM, APRLIB.NLM to SYS:/APACHE2
  • Create a directory under SYS:/APACHE2 called BIN
  • Copy HTDIGEST.NLM, HTPASSWD.NLM, HTDBM.NLM, LOGRES.NLM, ROTLOGS.NLM to SYS:/APACHE2/BIN
  • Create a directory under SYS:/APACHE2 called CONF
  • Copy the HTTPD-STD.CONF file to the SYS:/APACHE2/CONF directory and rename to HTTPD.CONF
  • Copy the MIME.TYPES, CHARSET.CONV and MAGIC files to SYS:/APACHE2/CONF directory
  • Copy all files and subdirectories in \HTTPD-2.0\DOCS\ICONS to SYS:/APACHE2/ICONS
  • Copy all files and subdirectories in \HTTPD-2.0\DOCS\MANUAL to SYS:/APACHE2/MANUAL
  • Copy all files and subdirectories in \HTTPD-2.0\DOCS\ERROR to SYS:/APACHE2/ERROR
  • Copy all files and subdirectories in \HTTPD-2.0\DOCS\DOCROOT to SYS:/APACHE2/HTDOCS
  • Create the directory SYS:/APACHE2/LOGS on the server
  • Create the directory SYS:/APACHE2/CGI-BIN on the server
  • Create the directory SYS:/APACHE2/MODULES and copy all nlm modules into the modules directory
  • Edit the HTTPD.CONF file searching for all @@Value@@ markers and replacing them with the appropriate setting
  • Add SYS:/APACHE2 to the search path, for example:

    SEARCH ADD SYS:\APACHE2

Apache may be installed to other volumes besides the default SYS volume.

During the build process, adding the keyword "install" to the makefile command line will automatically produce a complete distribution package under the subdirectory DIST. Install Apache by simply copying the distribution that was produced by the makfiles to the root of a NetWare volume (see: Compiling Apache for NetWare below).

Running Apache for NetWare

To start Apache just type apache at the console. This will load apache in the OS address space. If you prefer to load Apache in a protected address space you may specify the address space with the load statement as follows:

load address space = apache2 apache2

This will load Apache into an address space called apache2. Running multiple instances of Apache concurrently on NetWare is possible by loading each instance into its own protected address space.

After starting Apache, it will be listening to port 80 (unless you changed the Listen directive in the configuration files). To connect to the server and access the default page, launch a browser and enter the server's name or address. This should respond with a welcome page, and a link to the Apache manual. If nothing happens or you get an error, look in the error_log file in the logs directory.

Once your basic installation is working, you should configure it properly by editing the files in the conf directory.

To unload Apache running in the OS address space just type the following at the console:

unload apache2

or

apache2 shutdown

If apache is running in a protected address space specify the address space in the unload statement:

unload address space = apache2 apache2

When working with Apache it is important to know how it will find the configuration files. You can specify a configuration file on the command line in two ways:

  • -f specifies a path to a particular configuration file

apache2 -f "vol:/my server/conf/my.conf"

apache -f test/test.conf

In these cases, the proper ServerRoot should be set in the configuration file.

If you don't specify a configuration file name with -f, Apache will use the file name compiled into the server, usually conf/httpd.conf. Invoking Apache with the -V switch will display this value labeled as SERVER_CONFIG_FILE. Apache will then determine its ServerRoot by trying the following, in this order:

  • A ServerRoot directive via a -C switch.
  • The -d switch on the command line.
  • Current working directory
  • The server root compiled into the server.

The server root compiled into the server is usually sys:/apache2. invoking apache with the -V switch will display this value labeled as HTTPD_ROOT.

Apache 2.0 for NetWare includes a set of command line directives that can be used to modify or display information about the running instance of the web server. These directives are only available while Apache is running. Each of these directives must be preceded by the keyword APACHE2.

RESTART
Instructs Apache to terminate all running worker threads as they become idle, reread the configuration file and restart each worker thread based on the new configuration.
VERSION
Displays version information about the currently running instance of Apache.
MODULES
Displays a list of loaded modules both built-in and external.
DIRECTIVES
Displays a list of all available directives.
SETTINGS
Enables or disables the thread status display on the console. When enabled, the state of each running threads is displayed on the Apache console screen.
SHUTDOWN
Terminates the running instance of the Apache web server.
HELP
Describes each of the runtime directives.

By default these directives are issued against the instance of Apache running in the OS address space. To issue a directive against a specific instance running in a protected address space, include the -p parameter along with the name of the address space. For more information type "apache2 Help" on the command line.

Configuring Apache for NetWare

Apache is configured by reading configuration files usually stored in the conf directory. These are the same as files used to configure the Unix version, but there are a few different directives for Apache on NetWare. See the Apache module documentation for all the available directives.

The main differences in Apache for NetWare are:

  • Because Apache for NetWare is multithreaded, it does not use a separate process for each request, as Apache does on some Unix implementations. Instead there are only threads running: a parent thread, and multiple child or worker threads which handle the requests.

    Therefore the "process"-management directives are different:

    MaxRequestsPerChild - Like the Unix directive, this controls how many requests a worker thread will serve before exiting. The recommended default, MaxRequestsPerChild 0, causes the thread to continue servicing request indefinitely. It is recommended on NetWare, unless there is some specific reason, that this directive always remain set to 0.

    StartThreads - This directive tells the server how many threads it should start initially. The recommended default is StartThreads 50.

    MinSpareThreads - This directive instructs the server to spawn additional worker threads if the number of idle threads ever falls below this value. The recommended default is MinSpareThreads 10.

    MaxSpareThreads - This directive instructs the server to begin terminating worker threads if the number of idle threads ever exceeds this value. The recommended default is MaxSpareThreads 100.

    MaxThreads - This directive limits the total number of work threads to a maximum value. The recommended default is ThreadsPerChild 250.

    ThreadStackSize - This directive tells the server what size of stack to use for the individual worker thread. The recommended default is ThreadStackSize 65536.

  • The directives that accept filenames as arguments must use NetWare filenames instead of Unix names. However, because Apache uses Unix-style names internally, forward slashes must be used rather than backslashes. It is recommended that all rooted file paths begin with a volume name. If omitted, Apache will assume the SYS: volume which may not be correct.

  • Apache for NetWare has the ability to load modules at runtime, without recompiling the server. If Apache is compiled normally, it will install a number of optional modules in the \Apache2\modules directory. To activate these, or other modules, the LoadModule directive must be used. For example, to active the status module, use the following:

    LoadModule status_module modules/status.nlm

    Information on creating loadable modules is also available.

Additional NetWare specific directives:

  • CGIMapExtension - This directive maps a CGI file extension to a script interpreter.
  • SecureListen - Enables SSL encryption for a specified port.
  • NWSSLTrustedCerts - Adds trusted certificates that are used to create secure connections to proxied servers.
  • NWSSLUpgradeable - Allow a connection created on the specified address/port to be upgraded to an SSL connection.

Compiling Apache for NetWare

Compiling Apache requires MetroWerks CodeWarrior 6.x or higher. Once Apache has been built, it can be installed to the root of any NetWare volume. The default is the sys:/Apache2 directory.

Before running the server you must fill out the conf directory. Copy the file HTTPD-STD.CONF from the distribution conf directory and rename it to HTTPD.CONF. Edit the HTTPD.CONF file searching for all @@Value@@ markers and replacing them with the appropriate setting. Copy over the conf/magic and conf/mime.types files as well. Alternatively, a complete distribution can be built by including the keyword install when invoking the makefiles.

Requirements:

The following development tools are required to build Apache 2.0 for NetWare:

  • Metrowerks CodeWarrior 6.0 or higher with the NetWare PDK 3.0 or higher.
  • NetWare Libraries for C (LibC)
  • LDAP Libraries for C
  • ZLIB Compression Library source code
  • AWK utility (awk, gawk or similar). AWK can be downloaded from http://developer.novell.com/ndk/apache.htm. The utility must be found in your windows path and must be named awk.exe.
  • To build using the makefiles, you will need GNU make version 3.78.1 (GMake) available at http://developer.novell.com/ndk/apache.htm.

Building Apache using the NetWare makefiles:

  • Set the environment variable NOVELLLIBC to the location of the NetWare Libraries for C SDK, for example:

    Set NOVELLLIBC=c:\novell\ndk\libc

  • Set the environment variable METROWERKS to the location where you installed the Metrowerks CodeWarrior compiler, for example:

    Set METROWERKS=C:\Program Files\Metrowerks\CodeWarrior

    If you installed to the default location C:\Program Files\Metrowerks\CodeWarrior, you don't need to set this.
  • Set the environment variable LDAPSDK to the location where you installed the LDAP Libraries for C, for example:

    Set LDAPSDK=c:\Novell\NDK\cldapsdk\NetWare\libc

  • Set the environment variable ZLIBSDK to the location where you installed the source code for the ZLib Library, for example:

    Set ZLIBSDK=D:\NOVELL\zlib

  • Set the environment variable AP_WORK to the full path of the httpd source code directory.

    Set AP_WORK=D:\httpd-2.0.x

  • Set the environment variable APR_WORK to the full path of the apr source code directory. Typically \httpd\srclib\apr but the APR project can be outside of the httpd directory structure.

    Set APR_WORK=D:\apr-1.x.x

  • Set the environment variable APU_WORK to the full path of the apr-util source code directory. Typically \httpd\srclib\apr-util but the APR-UTIL project can be outside of the httpd directory structure.

    Set APU_WORK=D:\apr-util-1.x.x

  • Make sure that the path to the AWK utility and the GNU make utility (gmake.exe) have been included in the system's PATH environment variable.
  • Download the source code and unzip to an appropriate directory on your workstation.
  • Change directory to \httpd-2.0 and build the prebuild utilities by running "gmake -f nwgnumakefile prebuild". This target will create the directory \httpd-2.0\nwprebuild and copy each of the utilities to this location that are necessary to complete the following build steps.
  • Copy the files \httpd-2.0\nwprebuild\GENCHARS.nlm and \httpd-2.0\nwprebuild\DFTABLES.nlm to the SYS: volume of a NetWare server and run them using the following commands:

    SYS:\genchars > sys:\test_char.h
    SYS:\dftables sys:\chartables.c

  • Copy the files test_char.h and chartables.c to the directory \httpd-2.0\os\netware on the build machine.
  • Change directory to \httpd-2.0 and build Apache by running "gmake -f nwgnumakefile". You can create a distribution directory by adding an install parameter to the command, for example:

    gmake -f nwgnumakefile install

Additional make options

  • gmake -f nwgnumakefile

    Builds release versions of all of the binaries and copies them to a \release destination directory.

  • gmake -f nwgnumakefile DEBUG=1

    Builds debug versions of all of the binaries and copies them to a \debug destination directory.

  • gmake -f nwgnumakefile install

    Creates a complete Apache distribution with binaries, docs and additional support files in a \dist\Apache2 directory.

  • gmake -f nwgnumakefile prebuild

    Builds all of the prebuild utilities and copies them to the \nwprebuild directory.

  • gmake -f nwgnumakefile installdev

    Same as install but also creates a \lib and \include directory in the destination directory and copies headers and import files.

  • gmake -f nwgnumakefile clean

    Cleans all object files and binaries from the \release.o or \debug.o build areas depending on whether DEBUG has been defined.

  • gmake -f nwgnumakefile clobber_all

    Same as clean and also deletes the distribution directory if it exists.

Additional environment variable options

  • To build all of the experimental modules, set the environment variable EXPERIMENTAL:

    Set EXPERIMENTAL=1

  • To build Apache using standard BSD style sockets rather than Winsock, set the environment variable USE_STDSOCKETS:

    Set USE_STDSOCKETS=1

Building mod_ssl for the NetWare platform

By default Apache for NetWare uses the built-in module mod_nw_ssl to provide SSL services. This module simply enables the native SSL services implemented in NetWare OS to handle all encryption for a given port. Alternatively, mod_ssl can also be used in the same manner as on other platforms.

Before mod_ssl can be built for the NetWare platform, the OpenSSL libraries must be provided. This can be done through the following steps:

  • Download the recent OpenSSL 0.9.8 release source code from the OpenSSL Source page (older 0.9.7 versions need to be patched and are therefore not recommended).
  • Edit the file NetWare/set_env.bat and modify any tools and utilities paths so that they correspond to your build environment.
  • From the root of the OpenSSL source directory, run the following scripts:

    Netware\set_env netware-libc
    Netware\build netware-libc

    For performance reasons you should enable to build with ASM code. Download NASM from the SF site. Then configure OpenSSL to use ASM code:

    Netware\build netware-libc nw-nasm enable-mdc2 enable-md5

    Warning: dont use the CodeWarrior Assembler - it produces broken code!
  • Before building Apache, set the environment variable OSSLSDK to the full path to the root of the openssl source code directory, and set WITH_MOD_SSL to 1.

    Set OSSLSDK=d:\openssl-0.9.8x
    Set WITH_MOD_SSL=1

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


Running a High-Performance Web Server on HPUX - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Platform Specific Notes

Running a High-Performance Web Server on HPUX

Date: Wed, 05 Nov 1997 16:59:34 -0800
From: Rick Jones <raj@cup.hp.com>
Reply-To: raj@cup.hp.com
Organization: Network Performance
Subject: HP-UX tuning tips

Here are some tuning tips for HP-UX to add to the tuning page.

For HP-UX 9.X: Upgrade to 10.20
For HP-UX 10.[00|01|10]: Upgrade to 10.20

For HP-UX 10.20:

Install the latest cumulative ARPA Transport Patch. This will allow you to configure the size of the TCP connection lookup hash table. The default is 256 buckets and must be set to a power of two. This is accomplished with adb against the *disc* image of the kernel. The variable name is tcp_hash_size. Notice that it's critically important that you use "W" to write a 32 bit quantity, not "w" to write a 16 bit value when patching the disc image because the tcp_hash_size variable is a 32 bit quantity.

How to pick the value? Examine the output of ftp://ftp.cup.hp.com/dist/networking/tools/connhist and see how many total TCP connections exist on the system. You probably want that number divided by the hash table size to be reasonably small, say less than 10. Folks can look at HP's SPECweb96 disclosures for some common settings. These can be found at http://www.specbench.org/. If an HP-UX system was performing at 1000 SPECweb96 connections per second, the TIME_WAIT time of 60 seconds would mean 60,000 TCP "connections" being tracked.

Folks can check their listen queue depths with ftp://ftp.cup.hp.com/dist/networking/misc/listenq.

If folks are running Apache on a PA-8000 based system, they should consider "chatr'ing" the Apache executable to have a large page size. This would be "chatr +pi L <BINARY>". The GID of the running executable must have MLOCK privileges. Setprivgrp(1m) should be consulted for assigning MLOCK. The change can be validated by running Glance and examining the memory regions of the server(s) to make sure that they show a non-trivial fraction of the text segment being locked.

If folks are running Apache on MP systems, they might consider writing a small program that uses mpctl() to bind processes to processors. A simple pid % numcpu algorithm is probably sufficient. This might even go into the source code.

If folks are concerned about the number of FIN_WAIT_2 connections, they can use nettune to shrink the value of tcp_keepstart. However, they should be careful there - certainly do not make it less than oh two to four minutes. If tcp_hash_size has been set well, it is probably OK to let the FIN_WAIT_2's take longer to timeout (perhaps even the default two hours) - they will not on average have a big impact on performance.

There are other things that could go into the code base, but that might be left for another email. Feel free to drop me a message if you or others are interested.

sincerely,

rick jones

http://www.netperf.org/netperf/


The Apache EBCDIC Port - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Platform Specific Notes

The Apache EBCDIC Port

Warning: This document has not been updated to take into account changes made in the 2.0 version of the Apache HTTP Server. Some of the information may still be relevant, but please use it with care.

Overview of the Apache EBCDIC Port

Version 1.3 of the Apache HTTP Server is the first version which includes a port to a (non-ASCII) mainframe machine which uses the EBCDIC character set as its native codeset.

(It is the SIEMENS family of mainframes running the BS2000/OSD operating system. This mainframe OS nowadays features a SVR4-derived POSIX subsystem).

The port was started initially to

  • prove the feasibility of porting the Apache HTTP server to this platform
  • find a "worthy and capable" successor for the venerable CERN-3.0 daemon (which was ported a couple of years ago), and to
  • prove that Apache's preforking process model can on this platform easily outperform the accept-fork-serve model used by CERN by a factor of 5 or more.

This document serves as a rationale to describe some of the design decisions of the port to this machine.

Design Goals

One objective of the EBCDIC port was to maintain enough backwards compatibility with the (EBCDIC) CERN server to make the transition to the new server attractive and easy. This required the addition of a configurable method to define whether a HTML document was stored in ASCII (the only format accepted by the old server) or in EBCDIC (the native document format in the POSIX subsystem, and therefore the only realistic format in which the other POSIX tools like grep or sed could operate on the documents). The current solution to this is a "pseudo-MIME-format" which is intercepted and interpreted by the Apache server (see below). Future versions might solve the problem by defining an "ebcdic-handler" for all documents which must be converted.

Technical Solution

Since all Apache input and output is based upon the BUFF data type and its methods, the easiest solution was to add the conversion to the BUFF handling routines. The conversion must be settable at any time, so a BUFF flag was added which defines whether a BUFF object has currently enabled conversion or not. This flag is modified at several points in the HTTP protocol:

  • set before a request is received (because the request and the request header lines are always in ASCII format)
  • set/unset when the request body is received - depending on the content type of the request body (because the request body may contain ASCII text or a binary file)
  • set before a reply header is sent (because the response header lines are always in ASCII format)
  • set/unset when the response body is sent - depending on the content type of the response body (because the response body may contain text or a binary file)

Porting Notes

  1. The relevant changes in the source are #ifdef'ed into two categories:

    #ifdef CHARSET_EBCDIC

    Code which is needed for any EBCDIC based machine. This includes character translations, differences in contiguity of the two character sets, flags which indicate which part of the HTTP protocol has to be converted and which part doesn't etc.

    #ifdef _OSD_POSIX

    Code which is needed for the SIEMENS BS2000/OSD mainframe platform only. This deals with include file differences and socket implementation topics which are only required on the BS2000/OSD platform.

  2. The possibility to translate between ASCII and EBCDIC at the socket level (on BS2000 POSIX, there is a socket option which supports this) was intentionally not chosen, because the byte stream at the HTTP protocol level consists of a mixture of protocol related strings and non-protocol related raw file data. HTTP protocol strings are always encoded in ASCII (the GET request, any Header: lines, the chunking information etc.) whereas the file transfer parts (i.e., GIF images, CGI output etc.) should usually be just "passed through" by the server. This separation between "protocol string" and "raw data" is reflected in the server code by functions like bgets() or rvputs() for strings, and functions like bwrite() for binary data. A global translation of everything would therefore be inadequate.

    (In the case of text files of course, provisions must be made so that EBCDIC documents are always served in ASCII)

  3. This port therefore features a built-in protocol level conversion for the server-internal strings (which the compiler translated to EBCDIC strings) and thus for all server-generated documents. The hard coded ASCII escapes \012 and \015 which are ubiquitous in the server code are an exception: they are already the binary encoding of the ASCII \n and \r and must not be converted to ASCII a second time. This exception is only relevant for server-generated strings; and external EBCDIC documents are not expected to contain ASCII newline characters.

  4. By examining the call hierarchy for the BUFF management routines, I added an "ebcdic/ascii conversion layer" which would be crossed on every puts/write/get/gets, and a conversion flag which allowed enabling/disabling the conversions on-the-fly. Usually, a document crosses this layer twice from its origin source (a file or CGI output) to its destination (the requesting client): file -> Apache, and Apache -> client.

    The server can now read the header lines of a CGI-script output in EBCDIC format, and then find out that the remainder of the script's output is in ASCII (like in the case of the output of a WWW Counter program: the document body contains a GIF image). All header processing is done in the native EBCDIC format; the server then determines, based on the type of document being served, whether the document body (except for the chunking information, of course) is in ASCII already or must be converted from EBCDIC.

  5. For Text documents (MIME types text/plain, text/html etc.), an implicit translation to ASCII can be used, or (if the users prefer to store some documents in raw ASCII form for faster serving, or because the files reside on a NFS-mounted directory tree) can be served without conversion.

    Example:

    to serve files with the suffix .ahtml as a raw ASCII text/html document without implicit conversion (and suffix .ascii as ASCII text/plain), use the directives:

    AddType text/x-ascii-html .ahtml
    AddType text/x-ascii-plain .ascii

    Similarly, any text/foo MIME type can be served as "raw ASCII" by configuring a MIME type "text/x-ascii-foo" for it using AddType.

  6. Non-text documents are always served "binary" without conversion. This seems to be the most sensible choice for, .e.g., GIF/ZIP/AU file types. This of course requires the user to copy them to the mainframe host using the "rcp -b" binary switch.

  7. Server parsed files are always assumed to be in native (i.e., EBCDIC) format as used on the machine, and are converted after processing.

  8. For CGI output, the CGI script determines whether a conversion is needed or not: by setting the appropriate Content-Type, text files can be converted, or GIF output can be passed through unmodified. An example for the latter case is the wwwcount program which we ported as well.

Document Storage Notes

Binary Files

All files with a Content-Type: which does not start with text/ are regarded as binary files by the server and are not subject to any conversion. Examples for binary files are GIF images, gzip-compressed files and the like.

When exchanging binary files between the mainframe host and a Unix machine or Windows PC, be sure to use the ftp "binary" (TYPE I) command, or use the rcp -b command from the mainframe host (the -b switch is not supported in unix rcp's).

Text Documents

The default assumption of the server is that Text Files (i.e., all files whose Content-Type: starts with text/) are stored in the native character set of the host, EBCDIC.

Server Side Included Documents

SSI documents must currently be stored in EBCDIC only. No provision is made to convert it from ASCII before processing.

Apache Modules' Status

Module | Status | Notes
core | + |
mod_access | + |
mod_actions | + |
mod_alias | + |
mod_asis | + |
mod_auth | + |
mod_auth_anon | + |
mod_auth_dbm | ? | with own libdb.a
mod_autoindex | + |
mod_cern_meta | ? |
mod_cgi | + |
mod_digest | + |
mod_dir | + |
mod_so | - | no shared libs
mod_env | + |
mod_example | - | (test bed only)
mod_expires | + |
mod_headers | + |
mod_imagemap | + |
mod_include | + |
mod_info | + |
mod_log_agent | + |
mod_log_config | + |
mod_log_referer | + |
mod_mime | + |
mod_mime_magic | ? | not ported yet
mod_negotiation | + |
mod_proxy | + |
mod_rewrite | + | untested
mod_setenvif | + |
mod_speling | + |
mod_status | + |
mod_unique_id | + |
mod_userdir | + |
mod_usertrack | ? | untested

Third Party Modules' Status

Module | Status | Notes
mod_jserv | - | JAVA still being ported.
mod_php3 | + | mod_php3 runs fine, with LDAP and GD and FreeType libraries.
mod_put | ? | untested
mod_session | - | untested


Sunucu ve Destek Programları - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Sunucu ve Destek Programları

Bu sayfada Apache HTTP Sunucusuna dahil tüm çalıştırılabilir programlar tanıtılmıştır.

Dizin

httpd
Apache hiper metin aktarım protokolü sunucusu.
apachectl
Apache HTTP Sunucusu denetim arayüzü.
ab
Apache HTTP Sunucusu başarım ölçme aracı.
apxs
Apache HTTP Sunucusu eklenti aracı (APache eXtenSion tool).
configure
Kaynak ağacını yapılandırır.
dbmmanage
Kullanıcı kimlik doğrulama dosyalarını temel kimlik doğrulaması için DBM biçeminde oluşturur ve günceller.
htcacheclean
Disk arabelleğini temizler.
htdigest
Kullanıcı kimlik doğrulama dosyalarını özet kimlik doğrulaması için oluşturur ve günceller.
htdbm
DBM parola veritabanlarını idare eder.
htpasswd
Kullanıcı kimlik doğrulama dosyalarını temel kimlik doğrulaması için oluşturur ve günceller.
httxt2dbm
RewriteMap ile kullanmak üzere DBM dosyaları oluşturur.
logresolve
Apache günlük dosyalarındaki IP adreslerini konak isimlerine dönüştürür.
rotatelogs
Sunucuyu öldürmek gerekmeksizin günlük dosyalarının döndürülmesini sağlar.
suexec
Bir dosyayı belli bir kullanıcı adına çalıştırır.
Diğer Programlar
Kendi kılavuz sayfası bulunmayan destek araçları.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


httpd - Apache Hiper Metin Aktarım Protokolü Sunucusu - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

httpd - Apache Hiper Metin Aktarım Protokolü Sunucusu

httpd, Apache Hiper Metin Aktarım Protokolü (HTTP) sunucusu programıdır. Tek başına çalışan bir artalan süreci olarak tasarlanmıştır. Bu tarz kullanıldığında istekleri işleme sokmak için çocuk süreçlerden ve evrelerden oluşan bir havuz oluşturur.

Genelde, httpd'nin doğrudan çağrılmaması gerekir. Unix ve benzerlerinde apachectl aracılığıyla, Windows NT, 2000 ve XP'de bir hizmet olarak, Windows 9x ve ME'de ise bir konsol uygulaması olarak çalıştırılır.

Ayrıca bakınız:

  • Apache httpd'nin Başlatılması
  • Apache httpd'nin Durdurulması
  • Yapılandırma Dosyaları
  • Platforma Özgü Belgeler
  • apachectl

Kullanım

httpd [ -d sunucu-kök-dizini ] [ -f yapılandırma-dosyası ] [ -C yönerge ] [ -c yönerge ] [ -D parametre ] [ -e seviye ] [ -E dosya ] [ -k start | restart | graceful | stop | graceful-stop ] [ -R dizin ] [ -h ] [ -l ] [ -L ] [ -S ] [ -t ] [ -v ] [ -V ] [ -X ] [ -M ] [ -T ]

Windows sistemlerinde, ek olarak şunlar vardır:

httpd [ -k install | config | uninstall ] [ -n isim ] [ -w ]

Seçenekler

-d sunucu-kök-dizini
sunucu-kök-dizini'ni ServerRoot yönergesine ilk değer olarak atar. Yapılandırma dosyasındaki bir ServerRoot yönergesiyle bu atama geçersiz kılınabilir. Bu seçenek belirtilmediği takdirde /usr/local/apache2 dizini öntanımlıdır.
-f yapılandırma-dosyası
Başlatma sırasında yapılandırma-dosyası'ndaki yönergeler kullanılır. Eğer yapılandırma-dosyası bir / ile başlamıyorsa dosyanın ServerRoot yönergesinin değerine göreli olduğu varsayılır. Seçenek belirtilmediği takdirde conf/httpd.conf öntanımlı değerdir.
-k start | restart | graceful | stop | graceful-stop
httpd'yi başlatmak, durdurmak ve yeniden başlatmak için sinyal gönderir. Daha ayrıntılı bilgi edinmek için Apache httpd'nin Durdurulması belgesine bakınız.
-C yönerge
Yapılandırma yönerge'sini yapılandırma dosyalarını okumadan önce işleme sokar.
-c yönerge
Yapılandırma yönerge'sini yapılandırma dosyalarını okuduktan sonra işleme sokar.
-D parametre
Sunucu başlatılırken veya yeniden başlatılırken komutları şarta bağlı olarak işleme sokmak veya atlamak için yapılandırma dosyalarında kullanılan <IfDefine> bölümlerinde kullanılmak üzere bir yapılandırma parametre'si tanımlar. Ayrıca, -DNO_DETACH (ana sürecin çatallanmasını engellemek için), -DFOREGROUND (ana sürecin setsid() ve benzerlerinden çağrılmasını engellemek için) gibi daha az bilinen bazı başlatma parametrelerini atamakta da kullanılabilir.
-e seviye
Hata günlüğü seviyesi olarak LogLevel yönergesine sunucu başlatılırken seviye değerini atar. Bu seçenek, başlatma sırasındaki sorunları saptamak amacıyla hata iletilerinin ayrıntı seviyesini geçici olarak arttırmak için kullanılır.
-E dosya
Sunucunun başlatılması sırasında hata iletilerinin belirtilen dosya'ya gönderilmesini sağlar.
-h
Mevcut komut satırı seçeneklerinin kısa bir özetini çıktılar.
-l
Sunucunun içinde derlenmiş modüllerin listesini çıktılar. Bu liste LoadModule yönergesi kullanılarak devingen olarak yüklenen modülleri içermez.
-L
Durağan modüllerce sağlanmış yönergeleri olası değerleriyle geçerli konumlarına yerleştirerek listeler.
-M
Yüklü durağan ve paylaşımlı modülleri listeler.
-R dizin
Sunucu SHARED_CORE kullanılarak derlendiği takdirde bu seçenek paylaşımlı nesne dosyaları için dizin belirtir.
-S
Yapılandırma dosyasından çözümlenmiş haliyle ayarları gösterir (şu an sadece sanal konak ayarları gösterilmektedir).
-T (2.2.17 ve sonrasında kullanılabilir.)
Başlatma veya yeniden başlatma sırasında belge kök dizini sınamasını yapmadan geçer.
-t
Yapılandırma dosyasını sözdizimi hatalarına karşı denetler. Program sözdizimini denetledikten sonra sözdizimi geçerliyse 0 ile, değilse sıfırdan farklı bir değerle çıkar. -DDUMP_VHOSTS seçeneği ile birlikte kullanılmışsa ek olarak sanal konak ayrıntıları da basılır. -DDUMP_MODULES seçeneği ile ise ek olarak tüm modüller listelenir.
-v
httpd sürümünü basar ve çıkar.
-V
Sürümü ve httpd kurulum parametrelerini basar ve çıkar.
-X
httpd hata ayıklama kipinde çalışır. Tek çocuk süreç başlatılır ve sunucu konsolu terketmez.

Aşağıdaki seçenekler sadece Windows platformunda geçerlidir:

-k install | config | uninstall
Parametreler bakımından sırasıyla: Apache httpd bir Windows NT hizmeti haline getirilir; başlatma seçenekleri Apache httpd hizmeti için değiştirilir; ve Apache httpd hizmeti sistemden kaldırılır.
-n isim
Sinyal gönderilecek Apache httpd hizmetinin ismi.
-w
Hata durumunda konsol penceresi açık tutularak hata iletilerinin okunması sağlanır.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


ab - Apache HTTP sunucusu başarım ölçme aracı - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

ab - Apache HTTP sunucusu başarım ölçme aracı

ab Apache Hiper Metin Aktarım Protokolü (HTTP) sunucunuzun başarımını ölçmek amacıyla kullanabileceğiniz bir kıyaslama aracıdır. Mevcut Apache kurulumunuzun görevini nasıl yerine getirdiği hakkında bir izlenim edinmeniz için tasarlanmıştır. Özellikle, Apache kurulumunuzun saniyede kaç isteği sunma yeteneğinde olduğunu gösterir.

Ayrıca bakınız:

  • httpd

Kullanım

ab
    [ -A yetkili-kullanıcı:parola ]
    [ -b tampon-boyu ]
    [ -c bağlantı-sayısı ]
    [ -C çerez-ismi=değer ]
    [ -d ]
    [ -e csv-dosyası ]
    [ -f protokol ]
    [ -g gnuplot-dosyası ]
    [ -h ]
    [ -H özel-başlık ]
    [ -i ]
    [ -k ]
    [ -n istek-sayısı ]
    [ -p POST-dosyası ]
    [ -P vekil-yetkilisi:parola ]
    [ -q ]
    [ -r ]
    [ -s ]
    [ -S ]
    [ -t saniye ]
    [ -T içerik-türü ]
    [ -u PUT-dosyası ]
    [ -v ayrıntı-düzeyi]
    [ -V ]
    [ -w ]
    [ -x <table>-öznitelikleri ]
    [ -X vekil[:port] ]
    [ -y <tr>-öznitelikleri ]
    [ -z <td>-öznitelikleri ]
    [ -Z şifre-kümesi ]
    [http[s]://]konakadı[:port]/dizin

Seçenekler

-A yetkili-kullanıcı:parola
Sunucuya TEMEL Kimlik Doğrulamada kullanılmak üzere kanıt sağlar. Kullanıcı adı ile parola arasına sadece : konur ve sunucunun buna ihtiyacı olup olmadığına bakılmaksızın (yani, bir "401 kimlik doğrulaması gerekli" yanıtı beklenmeden) bağlantı üzerinden base64 kodlu olarak sunucuya gönderilir.
-b tampon-boyu
TCP gönderme/alma tamponlarının bayt cinsinden uzunluğu.
-c bağlantı-sayısı
Aynı anda işleme sokulacak bağlantı sayısı. Aynı anda bir bağlantı öntanımlı değerdir.
-C çerez-ismi=değer
İsteğe bir Cookie: satırı ekler. Argüman olarak genellikle bir isim=değer çifti kullanılır. Bu çiftler birden fazla olabilir.
-d
"percentage served within XX [ms] table" iletisi gösterilmez. (Geriye uyumluluk için vardır).
-e csv-dosyası
Sunulan isteğin birim zamanda (milisaniye) ne kadarının (yüzde cinsinden) sunulduğunu gösteren virgül ayraçlı değerler (CSV) dosyası. Sonuçlar 'bobin haline' getirilmiş olduğundan doğal olarak 'gnuplot' dosyasından daha yararlıdır.
-f protokol
SSL/TLS protokolü belirtilir (SSL2, SSL3, TLS1 veya ALL).
-g gnuplot-dosyası
Ölçülen değerler bir 'gnuplot' veya TSV (sekme ayraçlı değerler) dosyasına yazılır. Bu dosya, Gnuplot, IDL, Mathematica, Igor hatta Excel tarafından veri dosyası olarak kabul edilir. Veri sütunlarının başlıkları dosyanın ilk satırında bulunur.
-h
Kullanım bilgisi gösterir.
-H özel-başlık
İsteğe fazladan başlık ekler. özel-başlık, aralarında iki nokta imi bulunan bir isim-değer çifti olarak belirtilir. Örnek: "Accept-Encoding: zip/zop;8bit"
-i
GET istekleri yerine HEAD istekleri yapılır.
-k
HTTP KeepAlive (kalıcı bağlantı) özelliğini etkinleştirir, yani tek bir oturum içinde çok sayıda isteğe hizmet sunulabilir. Özellik öntanımlı olarak kapalıdır.
-n istek-sayısı
Kıyaslama oturumu sırasında sunucuya uygulanacak istek sayısı. Öntanımlı olarak hiçbir başarım ölçütü sağlamayan tek bir istek yapılır.
-p POST-dosyası
POST isteği ile ilgili verileri içeren dosya. Ayrıca -T seçeneğini de belirtmeyi unutmayın..
-P vekil-yetkilisi:parola
Vekil sunucuya TEMEL Kimlik Doğrulamasında kullanılacak kanıtları sağlar. Kullanıcı adı ile parola arasına sadece : konur ve vekilin buna ihtiyacı olup olmadığına bakılmaksızın (yani, bir "407 vekilde kimlik doğrulaması gerekiyor" yanıtı beklenmeden) bağlantı üzerinden base64 kodlu olarak sunucuya gönderilir.
-q
İstek sayısı 150'den fazla olduğunda, ab her 100 veya %10 istekte bir, standart hataya bir işlenen istek sayacı çıktılar. -q seçeneği bu çıktının üretilmemesini sağlar.
-r
Soket hata alsa bile program çıkmaz.
-s
Derlendiği takdirde (ab -h bunu gösterir) http protokolü yerine SSL korumalı https protokolü kullanılır. Bu özellik henüz emekleme aşamasında olup geliştirilmeye devam edilmektedir. Bu bakımdan kullanımı önerilmez.
-S
Ortalama ve ortanca değerler arasında bir veya iki standart sapmadan fazlası varsa ne ortalama değer ne standart sapma değeri ne de uyarı/hata iletileri gösterilir. Öntanımlı olarak, asgari/ortalama/azami değerler gösterilir. (Geriye uyumluluk).
-t saniye
Ölçümleme işleminin ne kadar süreyle uygulanacağı belirtilir. Dahili olarak -n 50000 seçeneği uygulanır. Bunu belli bir süreye göre kıyaslama yapmak amacıyla kullanabilirsiniz. Öntanımlı olarak bir süre kısıtlaması yoktur.
-T içerik-türü
POST/PUT verisi için kullanılacak içerik türü belirtilir. Örnek: application/x-www-form-urlencoded. Öntanımlı değer: text/plain.
-u PUT-dosyası
PUT verisini içeren dosya. Ayrıca, -T seçeneğini belirtmeyi de unutmayın.
-v ayrıntı-düzeyi
Çıktının ayrıntı düzeyi belirtilir. 4 ve üstü ile başlıklar hakkında bilgi, 3 ve üstü ile yanıt kodları (404, 200, vb.), 2 ve üstü ile ise uyarı ve bilgi iletileri gösterilir.
-V
Sürüm bilgilerini gösterir ve çıkar.
-w
Sonuçları HTML tabloları olarak basar. Öntanımlı tablo, beyaz artalanlı ve iki sütunludur.
-x <table>-öznitelikleri
<table> etiketinde kullanılacak öznitelikler belirtilir. Belirtilen öznitelikler etiket içine <table buraya > biçeminde yerleştirilir.
-X vekil[:port]
İstekler için bir vekil sunucu kullanılır.
-y <tr>-öznitelikleri
<tr> etiketinde kullanılacak öznitelikler belirtilir.
-z <td>-öznitelikleri
<td> etiketinde kullanılacak öznitelikler belirtilir.
-Z şifre-kümesi
SSL/TLS şifre kümesi belirtilir (openssl(1) şifrelerine bakınız).

Çıktı

Aşağıdaki listede ab çıktısındaki değerler açıklanmıştır:

Server Software
Varsa, bu değer başarılı ilk yanıtın server HTTP başlığında döner. Bu değer, başlıktan saptanan, başlangıçtan 32 onluk değerli karaktere (gerçekte, bir boşluk veya CR/LF) kadar olan tüm karakterleri içerir.
Server Hostname
Komut satırında belirtilen DNS veya IP adresi.
Server Port
ab'nin bağlandığı port. Komut satırında bir port belirtilmemişse http için 80, https için 443 öntanımlıdır.
SSL/TLS Protocol
İstemci ile sunucu arasında alıp verilen protokol değerleri. Bu sadece SSL kullanılıyorsa çıktılanır.
Document Path
Komut satırından elde edilen istek URI'si.
Document Length
Başarıyla dönen ilk belgenin bayt cinsinden uzunluğu. Eğer belge uzunluğu sınama sırasında değişirse yanıt bir hata olarak ele alınır.
Concurrency Level
Sınama sırasında eşzamanlanan istemci sayısı.
Time taken for tests
İlk soket bağlantısının kurulduğu andan son yanıtın alındığı ana kadar geçen süre.
Complete requests
Alınan başarılı yanıtların sayısı.
Failed requests
Başarısız olarak kabul edilen istek sayısı. Bu sayı sıfırdan farklıysa, ayrı bir satırda, bağlantıdan, okumadan, yanlış içerik uzunluğundan veya istisnalardan kaynaklanan başarısızlık sayıları da gösterilir.
Write errors
Yazma sırasında oluşan hata (kırık boru) sayısı.
Non-2xx responses
200 serisinden olmayan yanıt kodlarının sayısı. Tüm yanıtlar 200 kodlu ise bu alan çıktılanmaz.
Keep-Alive requests
Keep-Alive isteklerinde sonuçlanan bağlantı sayısı.
Total body sent
Yapılandırılmışsa, sınamanın bir parçası olarak gönderilecek toplam veri miktarı (bayt). Sınama sırasında gönderi bir veri gövdesi içermiyorsa bu alan çıktılanmaz.
Total transferred
Sunucudan alınan toplam bayt sayısı. Bu sayı aslında hattan gönderilen bayt miktarıdır.
HTML transferred
Sunucudan alınan toplam belge baytı miktarı. Bu miktar HTTP başlıklarındaki baytları içermez.
Requests per second
Saniyedeki istek sayısı. Toplam istek sayısının isteklerin toplam zamanına oranıdır.
Time per request
İstek başına harcanan ortalama zaman. İlk değerin formülü: eşzamanlananİstemciSayısı * geçenSüre * 1000 / tamamlananİstekSayısı, ikinci değerin formülü: geçenSüre * 1000 / tamamlananİstekSayısı
Transfer rate
okunanToplam / 1024 / geçenSüre formülü ile hesaplanan aktarım hızı.

Börtü böcek

Duruk bildirimli sabit uzunlukta çeşitli tamponlar vardır. Sunucudan gelen yanıt başlıkları ve diğer harici girdiler, komut satırı argümanları ile birlikte basitçe çözümlenir, bu size can sıkıcı gelebilir.

HTTP/1.x protokolünü tamamen gerçeklemez; sadece yanıtların 'belli başlı' bazı biçimlerini kabul eder. Aksi takdirde, strstr(3) işlevinin yoğun kullanımı nedeniyle sunucu yerine ab'nin başarımını ölçerdiniz.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


apachectl - Apache HTTP Sunucusu Denetim Arayüzü - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

apachectl - Apache HTTP Sunucusu Denetim Arayüzü

apachectl Apache Hiper Metin Aktarım Protokolü (HTTP) sunucusu için bir denetim aracıdır. Sistem yöneticisinin Apache httpd artalan sürecini denetimi altında tutabilmesine yardımcı olmak amacıyla tasarlanmıştır.

apachectl iki kipte işleyebilir. İlkinde, httpd komutu için basit bir önyüz gibi davranarak, gerekli ortam değişkenlerini atar ve belirtilen komut satırı seçenekleriyle httpd sürecini başlatır. İkinci kipte ise, apachectl bir SysV başlatma betiği olarak start, restart, stop gibi tek sözcüklük basit argümanlar alır ve bunları uygun sinyallere dönüştürerek httpd'ye gönderir.

Eğer Apache kurulumunuzda standart dışı dosya yolları kullanmışsanız, httpd programına uygun yolları atamak için apachectl betiğini elden geçirmelisiniz. Bu arada gerek gördüğünüz httpd komut satırı argümanlarını da belirtebilirsiniz. Ayrıntılar için betik içindeki açıklamalara bakınız.

apachectl betiği başarı durumunda 0 çıkış değeri ile döner. Bir hata durumunda ise sıfırdan farklı bir değerle döner. Daha fazla bilgi için betik içindeki açıklamalara bakınız.

Ayrıca bakınız:

  • Apache'nin Başlatılması
  • Apache'nin Durdurulması
  • Yapılandırma Dosyaları
  • Platform Belgeleri
  • httpd

Kullanım

apachectl önyüz kipinde çalıştığında httpd programının bütün komut satırı argümanlarını kabul edebilir.

apachectl [ httpd-argümanları ]

SysV başlatma betiği kipinde ise, apachectl aşağıda tanımlanan basit, tek sözcüklük komutları kabul eder.

apachectl komut

Seçenekler

Burada sadece SysV başlatma betiğine özgü seçeneklere yer verilmiştir. Diğer argümanlar için httpd kılavuz sayfasına bakınız.

start
Apache httpd artalan sürecini başlatır. Zaten çalışmaktaysa bir hata verir. apachectl -k start komutuna eşdeğerdir.
stop
Apache httpd artalan sürecini durdurur. apachectl -k stop komutuna eşdeğerdir.
restart
Apache httpd artalan sürecini yeniden başlatır; çalışmıyorsa çalıştırılır. Artalan sürecinin ölü olmadığından emin olmak için yeniden başlatmadan önce configtest seçeneği verilmiş gibi yapılandırma dosyaları sınanır. apachectl -k restart komutuna eşdeğerdir.
fullstatus
mod_status üzerinden tam bir durum raporu gösterir. Bunun çalışması için sunucuda mod_status etkinleştirilmiş olmalı ve sisteminizde lynx gibi bir metin kipi HTTP tarayıcı kurulu olmalıdır. Durum raporuna erişmek için kullanılacak adres betik içinde STATUSURL değişkenine atanabilir.
status
Özet halinde bir durum raporu gösterir. O an sunulmakta olan isteklerin gösterilmemesi dışında fullstatus seçeneği gibidir.
graceful
Apache httpd artalan sürecini nazikçe yeniden başlatır; çalışmıyorsa çalıştırılır. O an hizmet sunmakta olan çocuk süreçleri hemen durdurmaması dışında normal yeniden başlatma gibidir. Bir yan etki olarak eski günlük dosyaları hemen kapatılmaz. Yani, günlük dosyalarını döndüren bir betik kullanıyorsanız yenilerini başlatmadan önce eski dosyaların tamamen kapandığından emin olmak için belli bir süre beklemeniz gerekecektir. Artalan sürecinin ölü olmadığından emin olmak için yeniden başlatmadan önce configtest seçeneği verilmiş gibi yapılandırma dosyaları sınanır. apachectl -k graceful komutuna eşdeğerdir.
graceful-stop
Apache httpd artalan sürecini nazikçe durdurur. O an hizmet sunmakta olan çocuk süreçleri hemen durdurmaması dışında normal durdurma gibidir. Bir yan etki olarak eski günlük dosyaları hemen kapatılmaz. apachectl -k graceful-stop komutuna eşdeğerdir.
configtest
Yapılandırma dosyasında sözdizimi denetimi yapılmasını sağlar. Yapılandırma dosyaları çözümlenir ve bir sorun yoksa bir Syntax Ok raporu verilir fakat, bir hata varsa o hataya ilişkin ayrıntılı bilgi verilir. apachectl -t komutuna eşdeğerdir.

Aşağıdaki seçenek eski sürümlerde kullanılmaktaydı, fakat artık kullanılmamaktadır.

startssl
httpd programını SSL destekli başlatmak için, yapılandırma dosyanızı ilgili yönergeleri içermesi için elden geçirmeli ve normal apachectl start komutunu kullanmalısınız.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


apxs - Apache Eklenti Aracı - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

apxs - Apache Eklenti Aracı

apxs, Apache Hiper Metin Aktarım Protokolü (HTTP) sunucusu için ek modül derleme ve kurulum aracıdır. Bu araç sayesinde, bir veya daha fazla kaynak veya nesne dosyasından bir devingen paylaşımlı nesne (DSO - "Dynamic Shared Object" kısaltması) derlemek ve bu nesneyi (modülü) Apache sunucusuna çalışma anında mod_so modülünün LoadModule yönergesi üzerinden yüklemek mümkün olmaktadır.

Bu eklenti mekanizmasını platformunuzda kullanmak için DSO desteğinin olması ve httpd programının mod_so modülünü içerecek şekilde derlenmiş olması gerekir. Eğer bunlar mevcut değilse apxs aracı durumu size bildirecektir. Bunu aşağıdaki komutla kendiniz de sınayabilirsiniz:

$ httpd -l

mod_so modülü gösterilen listede yer almalıdır. Bu gereksinimler sağlandığı takdirde apxs aracı sayesinde DSO mekanizması üzerinden kendi modüllerinizi kurmak suretiyle Apache sunucunuzun işlevselliğini kolayca arttırabilirsiniz. Örnek bir uygulama:

$ apxs -i -a -c mod_foo.c
gcc -fpic -DSHARED_MODULE -I/dosya/yolu/apache/include -c mod_foo.c
ld -Bshareable -o mod_foo.so mod_foo.o
cp mod_foo.so /dosya/yolu/apache/modules/mod_foo.so
chmod 755 /dosya/yolu/apache/modules/mod_foo.so
[`foo' modülü /dosya/yolu/apache/etc/httpd.conf'ta etkinleştiriliyor]
$ apachectl restart
/dosya/yolu/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/dosya/yolu/apache/sbin/apachectl restart: httpd started
$ _

dosya olarak bir C kaynak dosyası (.c), bir nesne dosyası (.o) ve hatta bir kütüphane arşivi archive (.a) belirtebilirsiniz. apxs aracı bu dosya uzantılarını tanıdığından C dosyalarını derleme işleminden, arşiv ve nesne dosyalarını ise doğrudan ilintileme işleminden geçirir. Fakat böyle önceden derlenmiş nesne dosyalarını kullanırken, devingen paylaşımlı nesne olarak kullanılmalarını sağlamak üzere konumdan bağımsız kod (PIC) üretecek şekilde derlenmiş olduklarından emin olmalısınız. Örneğin GCC'yi bunun için daima -fpic seçeneği ile kullanmalısınız. Diğer C derleyiciler için, apxs'in nesne dosyalarını derlerken kullanacağı seçenekleri öğrenmek için o derleyicilerin kılavuz sayfalarına bakınız.

Apache'deki DSO desteği ile ilgili daha ayrıntılı bilgi edinmek için mod_so belgesini okumakla yetinmeyip src/modules/standard/mod_so.c kaynak dosyasını da okuyunuz.

Ayrıca bakınız:

  • apachectl
  • httpd

Kullanım

apxs -g [ -S isim=değer ] -n modüladı

apxs -q [ -S isim=değer ] sorgu ...

apxs -c
    [ -S isim=değer ]
    [ -o dso-dosyası ]
    [ -I include-dizini ]
    [ -D isim=değer ]
    [ -L lib-dizini ]
    [ -l kütüphane-adı ]
    [ -Wc,derleyici-seçenekleri ]
    [ -Wl,ilintileyici-seçenekleri ]
    dosya ...

apxs -i
    [ -S isim=değer ]
    [ -n modüladı ]
    [ -a ]
    [ -A ]
    dso-dosyası ...

apxs -e
    [ -S isim=değer ]
    [ -n modüladı ]
    [ -a ]
    [ -A ]
    dso-dosyası ...

Seçenekler

Ortak Seçenekler

-n modüladı
-i (kurulum) ve -g (şablon üretimi) seçenekleri için modül ismi belirtmek amacıyla kullanılır. Bir modül ismi belirtmek için bu seçeneği kullanın. -g seçeneği için bu gereklidir. -i seçeneği için ise araç, modül ismini kaynağın ismine bakarak veya (son çare olarak) dosya isminden tahmin etmeye çalışarak saptamaya çalışır.

Sorgu Seçenekleri

-q sorgu
apxs'in belli ayarlar hakkında bilgisine başvurmak için bir sorgu gerçekleştirir. sorgu olarak şu dizgelerden biri veya birkaçı belirtilebilir: CC, CFLAGS, CFLAGS_SHLIB, INCLUDEDIR, LD_SHLIB, LDFLAGS_SHLIB, LIBEXECDIR, LIBS_SHLIB, SBINDIR, SYSCONFDIR, TARGET.

Bu seçeneği ayarları öğrenmek için kullanın. Örneğin, Apache'nin C başlık dosyalarının yerini kendi Makefile dosyalarınızın içinde şöyle belirtebilirsiniz:

INC=-I`apxs -q INCLUDEDIR`

Yapılandırma Seçenekleri

-S isim=değer
Bu seçenek yukarıda açıklanan apxs ayarlarını değiştirir.

Şablon Üretme Seçenekleri

-g
modüladı (-n seçeneğihe bakınız) adında bir alt dizin oluşturur ve içine iki dosya yerleştirir: Kendi modülünüzü oluşturabilmeniz için veya apxs mekanizmaları ile hemen oynamaya başlayabilmeniz için mod_modüladı.c adında bir modül kaynak dosyası örneği ve bu modülü derleyip kurmayı kolaylaştırmak için bir Makefile dosyası.

DSO Derleme Seçenekleri

-c
Bu seçenek derleme yapılacağını belirtir. Önce belirtilen C kaynak dosyalarını (.c), nesne dosyalarını (.o) elde etmek için derler. Sonra bunları kalan nesne dosyaları (.o ve .a) ile ilintileyerek dso-dosyası adında bir devingen paylaşımlı nesne oluşturur. Eğer -o seçeneği ile modül ismi belirtilmemişse dosyalar arasındaki ilk dosyanın ismine bakarak dosya ismi tahmin edilmeye çalışılır ve mod_isim.so dosya adı bu isimden elde edilir.
-o dso-dosyası
Oluşturulacak devingen paylaşımlı nesnenin ismini belirtmek için kullanılır. Modül ismi bu seçenekle belirtilmez ve dosya listesinden bir isim tahmini de yapılamazsa son çare olarak mod_unknown.so ismi kullanılır.
-D isim=değer
Bu seçenek doğrudan derleme komutlarına aktarılır. Bu seçeneği derleme işlemine kendi tanımlarınızı belirtmek için kullanın.
-I include-dizini
Bu seçenek doğrudan derleme komutlarına aktarılır. Bu seçeneği derleme işleminde kullanılmak üzere kendi başlık dosyalarınızı içeren dizinleri arama yollarına eklemek için kullanın.
-L lib-dizini
Bu seçenek doğrudan derleme komutlarına aktarılır. Bu seçeneği derleme işleminde kullanılmak üzere kendi kütüphane dizinlerinizi arama yollarına eklemek için kullanın.
-l kütüphane-adı
Bu seçenek doğrudan derleme komutlarına aktarılır. Bu seçeneği derleme işleminde kullanılmak üzere kendi kütüphanelerinizi arama yollarına eklemek için kullanın.
-Wc,derleyici-seçenekleri
Bu seçenek libtool --mode=compile komutuna doğrudan seçenek aktarmak için kullanılır. Bu seçeneği yerel derleyiciniz için gereken ek seçenekleri belirtmek için kullanın.
-Wl,ilintileyici-seçenekleri
Bu seçenek libtool --mode=link komutuna doğrudan seçenek aktarmak için kullanılır. Bu seçeneği yerel ilintileyiciniz için gereken ek seçenekleri belirtmek için kullanın.

DSO Kurulum ve Yapılandırma Seçenekleri

-i
Kurulum işlemini belirtir ve devingen olarak paylaşımlı nesneleri sunucunun modules dizinine kurar.
-a
İlgili LoadModule satırını Apache'nin httpd.conf yapılandırma dosyasına özdevinimli olarak ekleyerek veya böyle bir satır varsa bunu etkin kılarak modülü etkinleştirir.
-A
LoadModule yönergesini daha sonra etkinleştirmek üzere satırın başına bir diyez imi (#) yerleştirmesi dışında -a seçeneği ile aynıdır.
-e
Modülü kurmaya çalışmaksızın Apache'nin httpd.conf yapılandırma dosyasını -i işlemine benzer şekilde -a ve -A seçenekleri ile düzenleme işlemini belirtir.

Örnekler

Apache'nin sunucu işlevselliğini genişletmek amacıyla kullanacağınız mod_foo.c adında bir Apache modülünüz olduğunu varsayalım. Öncelikle, C kaynak dosyasını, Apache sunucusuna çalışma anında yüklenmeye uygun bir paylaşımlı nesne olarak derlemeniz gerekir. Bunu sağlamak için şu komutları vermelisiniz:

$ apxs -c mod_foo.c
/dosya/yolu/libtool --mode=compile gcc ... -c mod_foo.c
/dosya/yolu/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
$ _

Bundan sonra, Apache yapılandırmanızın bu paylaşımlı nesneyi yüklemek için bir LoadModule yönergesi içermesini sağlamalısınız. apxs bu adımı basitleştirmek amacıyla, paylaşımlı nesneyi sunucunun modules dizinine özdevinimli olarak kurmak ve httpd.conf dosyasını buna uygun olarak güncellemek için bir yol sağlar. Bu sonuç şöyle elde edilebilir:

$ apxs -i -a mod_foo.la
/dosya/yolu/instdso.sh mod_foo.la /path/to/apache/modules
/dosya/yolu/libtool --mode=install cp mod_foo.la /dosya/yolu/apache/modules ... chmod 755 /dosya/yolu/apache/modules/mod_foo.so
[`foo' modülü /dosya/yolu/apache/conf/httpd.conf'da etkinleştiriliyor]
$ _

Yapılandıma dosyasına (eğer yoksa) şu satır eklenir:

LoadModule foo_module modules/mod_foo.so

Bunu öntanımlı olarak iptal etmek isterseniz -A seçeneğini kullanmanız gerekir:

$ apxs -i -A mod_foo.c

apxs mekanizmalarını hızlıca denemek için örnek bir Apache modül şablonunu ve bir Makefile dosyasını şöyle oluşturabilirsiniz:

$ apxs -g -n foo
Creating [DIR] foo
Creating [FILE] foo/Makefile
Creating [FILE] foo/modules.mk
Creating [FILE] foo/mod_foo.c
Creating [FILE] foo/.deps
$ _

Ardından bu örnek modülü bir paylaşımlı nesne olarak derleyip Apache sunucusuna yükleyebilirsiniz:

$ cd foo
$ make all reload
apxs -c mod_foo.c
/dosya/yolu/libtool --mode=compile gcc ... -c mod_foo.c
/dosya/yolu/libtool --mode=link gcc ... -o mod_foo.la mod_foo.slo
apxs -i -a -n "foo" mod_foo.la
/dosya/yolu/instdso.sh mod_foo.la /dosya/yolu/apache/modules
/dosya/yolu/libtool --mode=install cp mod_foo.la /dosya/yolu/apache/modules ... chmod 755 /dosya/yolu/apache/modules/mod_foo.so
[`foo' modülü /dosya/yolu/apache/conf/httpd.conf'ta etkinleştiriliyor]
apachectl restart
/dosya/yolu/apache/sbin/apachectl restart: httpd not running, trying to start
chmod 755 /dosya/yolu/apache/modules/mod_foo.so
[`foo' modülü /dosya/yolu/apache/etc/httpd.conf'ta etkinleştiriliyor]
apachectl restart
/dosya/yolu/apache/sbin/apachectl restart: httpd not running, trying to start
[Tue Mar 31 11:27:55 1998] [debug] mod_so.c(303): loaded module foo_module
/dosya/yolu/apache/sbin/apachectl restart: httpd started
$ _

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


configure - kaynak ağacını yapılandırır - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

configure - kaynak ağacını yapılandırır

configure betiği, Apache HTTP Sunucusunun kaynak kodlarını belli bir platform için yapılandırmakta ve derlemekte kullanılır. Sunucuyu kişisel gereksinimlerinize uygun şekilde derlemek için çeşitli seçeneklere sahiptir.

Bu betik Apache HTTP Sunucusu kaynak paketinin kök dizininde bulunur ve sadece Unix ve benzeri sistemlerde kullanılabilir. Kaynak paketinin diğer platformalarda yapılandırılması ve derlenmesi hakkında bilgi edinmek için platform belgelerine bakınız.

Ayrıca bakınız:

  • Derleme ve Kurulum

Komut Satırı

configure betiğini kaynak paketinin kök dizininden başka bir yere kopyalayıp çalıştırmamalısınız.

./configure [seçenek]... [değişken=değer]...

CC, CFLAGS gibi ortam değişkenlerini değişken=değer atamaları biçiminde kullanabilirsiniz. Kullanışlı değişkenlerin bazıları aşağıda açıklanmıştır.

Seçenekler

  • Yapılandırma seçenekleri
  • Kurulum dizinleri
  • Sistem türleri
  • Seçimlik özellikler
  • Destek programları için seçenekler

Yapılandırma seçenekleri

Aşağıdaki seçenekler configure betiğinin kendi davranışını belirlemekte kullanılır.

-C
--config-cache
--cache-file=config.cache için bir kısaltmadır.
--cache-file=dosya
Sınama sonuçları dosya dosyasında saklanır. Bu seçenek açıkça belirtilmedikçe işlevsizdir.
-h
--help [short|recursive]
Yardım metnini basar ve çıkar. short değeriyle sadece bu pakete özgü seçenekler listelenir. recursive değeriyle ise paketin içindeki tüm paketler için kısa bir yardım metni basılır.
-n
--no-create
configure betiği normal olarak çalışır fakat herhangi bir çıktı dosyası üretmez. Derleme için Makefile dosyalarını üretmeksizin sınamaların sonuçlarını görmek için yararlıdır.
-q
--quiet
Yapılandırma sürecinde checking ... iletilerini basmaz.
--srcdir=dizin
dizin dizinini kaynak dosyaları dizini olarak tanımlar. configure betiğinin bulunduğu dizin veya bir üst dizin öntanımlıdır.
--silent
--quiet ile aynı.
-V
--version
Telif hakkı bilgilerini gösterir ve çıkar.

Kurulum dizinleri

Bu seçenekler kurulum dizinlerini tanımlar. Kurulum dizinleri seçilmiş yerleşime bağımlıdır.

--prefix=PREFIX
Mimariden bağımsız dosyalar PREFIX dizininin altına kurulur. /usr/local/apache2 öntanımlı kurulum dizinidir.
--exec-prefix=EPREFIX
Mimariye bağımlı dosyalar EPREFIX dizininin altına kurulur. Bunun için PREFIX dizini öntanımlı kurulum dizinidir.

Öntanımlı olarak, make install tüm dosyaların /usr/local/apache2/bin, /usr/local/apache2/lib gibi dizinlere kurulmasını sağlar. Kurulum dizini önekini örneğin, --prefix=$HOME şeklinde belirterek kurulumun başka bir yere yapılmasını sağlayabilirsiniz.

Bir dizin yerleşimi tanımlamak

--enable-layout=LAYOUT
Kaynak kodu ve derleme betikleri kurulum ağacının LAYOUT yerleşimine dayalı olduğu varsayımıyla yapılandırılır. Bu seçenek sayesinde Apache HTTP Sunucusu kurulumu içinde her dosya türü için farklı bir yer belirleyebilirsiniz. config.layout dosyasında böyle yapılandırma örnekleri vardır. Örnekleri izleyerek kendi yapılandırmanızı oluşturabilirsiniz. Bu dosyada örneğin FOO isimli yerleşim <Layout FOO>...</Layout> bölümü içinde düzenlenmiştir ve her yerleşim için böyle ayrı bir bölüm vardır. Öntanımlı yerleşim Apache’dir.

Kurulum dizinlerinde ince ayar

Kurulum dizinlerini daha iyi denetim altında tutmak için aşağıdaki seçenekler kullanılır. Lütfen, dizin öntanımlılarının autoconf tarafından tanımlandığına ve seçilen yerleşim ayarlarının bunları yerini aldığına dikkat ediniz.

--bindir=dizin
Kullanıcı tarafından çalıştırılabilen dosyalar dizin dizinine kurulur. Bunlar htpasswd, dbmmanage gibi site yönetimi için yararlı destek programlarıdır. Öntanımlı olarak bu dosyalar EPREFIX/bin dizinine kurulur.
--datadir=dizin
Mimariden bağımsız salt okunur veriler dizin dizinine kurulur. Bunların öntanımlı kurulum dizini PREFIX/share dizinidir. Bu seçenek autoconf tarafından atanır ve şimdilik kullanılmamıştır.
--includedir=dizin
C başlık dosyaları dizin dizinine kurulur. Bunların öntanımlı kurulum dizini PREFIX/include dizinidir.
--infodir=dizin
Info belgeleri dizin dizinine kurulur. Bunların öntanımlı kurulum dizini PREFIX/info dizinidir. Bu seçenek şimdilik kullanılmamıştır.
--libdir=dizin
Nesne kod kütüphaneleri dizin dizinine kurulur. Bunların öntanımlı kurulum dizini PREFIX/lib dizinidir.
--libexecdir=dizin
Paylaşımlı modüller gibi program dosyaları dizin dizinine kurulur. Öntanımlı olarak libexecdir bu dizini EPREFIX/modules olarak tanımlar.
--localstatedir=dizin
Düzenlenebilir tek makinelik veri dizin dizinine kurulur. Öntanımlı olarak localstatedir bu dizini PREFIX/var olarak tanımlar. Bu seçenek autoconf tarafından atanır ve şimdilik kullanılmamıştır.
--mandir=dizin
Kılavuz sayfaları dizin dizinine kurulur. Öntanımlı olarak mandir bu dizini EPREFIX/man olarak tanımlar.
--oldincludedir=dizin
GCC harici C başlık dosyaları dizin dizinine kurulur. Öntanımlı olarak oldincludedir bu dizini /usr/include olarak tanımlar. Bu seçenek autoconf tarafından atanır ve şimdilik kullanılmamıştır.
--sbindir=dizin
Sistem yöneticisi tarafından kullanılabilen programlar dizin dizinine kurulur. Bunlar httpd, apachectl, suexec gibi Apache HTTP Sunucusunu çalıştırmak için gereken programlardır. Öntanımlı olarak sbindir bu dizini EPREFIX/sbin olarak tanımlar.
--sharedstatedir=dizin
Mimariye bağımlı düzenlenebilir veriler dizin dizinine kurulur. Öntanımlı olarak sharedstatedir bu dizini PREFIX/com olarak tanımlar. Bu seçenek autoconf tarafından atanır ve şimdilik kullanılmamıştır.
--sysconfdir=dizin
httpd.conf, mime.types gibi tek makinelik salt okunur sunucu yapılandırma dosyaları dizin dizinine kurulur. Öntanımlı olarak sysconfdir bu dizini PREFIX/conf olarak tanımlar.

Sistem türleri

Bu seçenekleri Apache HTTP Sunucusunu başka bir platformda çalıştırmak üzere çapraz derleme yaparken kullanılır. Normal durumlarda sunucu derlendiği platformda çalıştırıldığından bu seçenekler kullanılmaz.

--build=derleme-ortamı
Derleme araçlarının derleneceği sistemin sistem türünü tanımlar. config.guess betiği ile elde edilen sonuç öntanımlıdır.
--host=çalışma-ortamı
Sunucunun çalışacağı sistemin sistem türünü tanımlar. Öntanımlı sistem türü derleme-ortamı’dır.
--target=hedef-ortam
Derleyicileri hedef-ortam sistem türü için yapılandırır. Öntanımlı sistem türü çalışma-ortamı’dır. Bu seçenek autoconf tarafından atanır ve Apache HTTP Sunucusu için gerekli değildir.

Seçimlik özellikler

Bu seçenekler HTTP sunucunuzun sahip olmasını istediğiniz özelliklerin hassas olarak ayarlanmasını sağlar.

Genel sözdizimi

Bir özelliği etkin kılmak veya iptal etmek için genellikle şu sözdizimi kullanılır:

--disable-özellik
Sunucu özellik özelliğine sahip olmaz. Bu seçenek--enable-özellik=no seçeneğine eşdeğerdir.
--enable-özellik[=değer]
Sunucu özellik özelliğine sahip olur. değer belirtilmediği takdirde yes (evet) öntanımlıdır.
--enable-modül=shared
Belirtilen modül DSO modülü olarak derlenir.
--enable-modül=static
Öntanımlı olarak etkin olan modüller durağan ilintilenir. Bunu bu seçenekle alenen zorlayabilirsiniz.

Bilginize

--enable-filanca seçeneğinin varlığı configure betiğinin filanca diye bir modül var olmasa bile bundan şikayetçi olmasına sebep olmaz. Bu bakımdan dikkatli olunuz.

Öntanımlı olarak etkin modüller

Bazı modüller öntanımlı olarak derlendiğinden iptal edilmek istenirse bunun açıkça belirtilmesi gerekir. Aşağıdaki seçenekler bu tür modüllerin diğerlerinden bağımsız olarak derlenmemesini sağlar.

--disable-actions
mod_actions modülü tarafından sağlanan ve isteklerle tetiklenen eylemleri iptal eder.
--disable-alias
mod_alias modülü tarafından sağlanan, isteklerin farklı dosya sistemi bölümleriyle eşlenmesi iptal edilir.
--disable-asis
mod_asis modülü tarafından sağlanan kendinden HTTP başlıklı dosya türü desteğini iptal eder.
--disable-auth-basic
mod_auth_basic modülü tarafından sağlanan kullanıcıya dayalı erişim denetimi iptal edilir. Bu modül, kullanıcı isminin ve parolasının salt metin dosyalarda saklandığı Temel HTTP Kimlik Doğrulaması için kullanılır.
--disable-autoindex
mod_autoindex modülü tarafından sağlanan dizin içerik listelemesini iptal eder.
--disable-cgi
CGI betiklerine destek sağlayan mod_cgi, çok evreli olmayan MPM kullanıldığında öntanımlı olarak etkin kılınır. CGI desteğini iptal etmek için bu seçeneği kullanın.
--disable-cgid
worker çok evreli MPM’i kullanılırken CGI betikleri için desteği öntanımlı olarak mod_cgid modülü sağlar. CGI desteğini iptal etmek için bu seçeneği kullanın.
--disable-charset-lite
mod_charset_lite modülü tarafından sağlanan karakter kümesi dönüşümleri iptal edilir. Bu modül sadece EBCDIC sistemlerinde öntanımlı olarak kurulur.
--disable-dir
mod_dir modülü tarafından sağlanan dizin isteklerine destek iptal edilir.
--disable-env
mod_env modülü tarafından sağlanan ortam değişkenlerine destek iptal edilir.
--disable-http
HTTP protokolüne destek iptal edilir. http modülü en temel modüldür ve sunucunun bir HTTP sunucusu olarak çalışmasını sağlar. Sadece, HTTP protokolü yerine başka bir protokol kullanmak isterseniz bu seçeneği kullunın. Ne yaptığınızdan gerçekten emin olamıyorsanız bu desteği asla iptal etmeyin.
Dikkat: Bu modül ana kodla daima durağan ilintilidir.
--disable-imagemap
mod_imagemap modülü tarafından sağlanan resim eşlemlerine destek iptal edilir.
--disable-include
mod_include modülü tarafından sağlanan SSI sayfaları desteği iptal edilir.
--disable-log-config
mod_log_config modülü tarafından sağlanan günlük kayıtları yapılandırması iptal edilir. Bu modül olmaksızın sunucu yapılan isteklerin günlük kayıtlarını tutamaz.
--disable-mime
mod_mime modülü istenen dosyanın uzantısına bakarak dosya içeriğinin (MIME türü, dil, karakter kümesi ve kodlama) nasıl ele alınacağını belirler. Bu modülün iptal edilmesi önerilmez.
--disable-negotiation
mod_negotiation modülü tarafından sağlanan içerik dili uzlaşımı iptal edilir.
--disable-setenvif
mod_setenvif modülü tarafından sağlanan başlıklarla ilgili ortam değişkenlerine dayalı destek iptal edilir.
--disable-status
mod_status modülü tarafından sağlanan süreç/evre izleme iptal edilir.
--disable-userdir
mod_userdir modülü tarafından sağlanan, isteklerin kullanıcıya özel dizinlere eşlenmesi iptal edilir.

Öntanımlı olarak etkin olmayan modüller

Bazı modüller öntanımlı olarak derlendiği halde açıkça istenmedikçe veya most ya da all anahtar sözcükleri kullanılmadıkça etkin kılınmazlar (bu konu, aşağıda --enable-mods-shared seçeneğinde daha ayrıntılı ele alınmıştır). Bu modülleri etkinleştirmek için aşağıdaki seçenekleri kullanabilirsiniz.

--enable-authn-anon
mod_authn_anon modülünün sağladığı anonim kullanıcı erişimi etkin kılınır.
--enable-authn-dbm
mod_authn_dbm modülü kullanıcı isimlerinin ve parolalarının DBM türü veritabanı dosyalarında saklandığı HTTP Temel Kimlik Kanıtlaması için destek sağlar. Bu seçeneği bu modülü etkin kılmak için kullanabilirsiniz.
--enable-authz-dbm
mod_authz_dbm modülü kullanıcı isimlerinin ve parolalarının DBM türü veritabanı dosyalarında saklandığı HTTP Temel Kimlik Kanıtlaması için destek sağlar. Bu seçeneği bu modülü etkin kılmak için kullanabilirsiniz.
--enable-auth-digest
mod_auth_digest modülü tarafından sağlanan RFC2617 Özet Kimlik Kanıtlaması etkin kılınır. Bu modül delilleri salt metin dosyalarda saklar.
--enable-authnz-ldap
mod_authnz_ldap modülü tarafından sağlanan LDAP’a Dayalı Kimlik Kanıtlaması etkin kılınır.
--enable-cache
mod_cache modülü tarafından sağlanan devingen dosya önbelleklemesi etkin kılınır. Bu deneysel modülün kullanımı, aşırı yüklü sunucularda ya da önbellekli vekillerde ilginç sonuçlar verebilir. Bunun yanında en azından bir saklama alanı yönetim modülü (örn, mod_disk_cache veya mod_mem_cache) gerekebilir.
--enable-cern-meta
mod_cern_meta modülü tarafından sağlanan CERN türü temel veri dosyalarına destek etkin kılınır.
--enable-charset-lite
mod_charset_lite modülü tarafından sağlanan karakter kümesi dönüşümleri etkin kılınır. Bu modül sadece EBCDIC sistemlerinde öntanımlı olarak etkindir. Diğer sistemlerde gerekirse alenen etkin kılınması gerekir.
--enable-dav
mod_dav modülü tarafından sağlanan WebDAV protokolü desteği etkin kılınır. Dosya sistemi özkaynaklarına destek için mod_dav_fs modülü de gerekir ve bu seçenekle o da etkin kılınır.
Dikkat: mod_dav sadece http protokolü modülü ile birlikte kullanılabilir.
--enable-dav-fs
mod_dav_fs modülü tarafından sağlanan WebDAV protokolünün dosya sistemi özkaynaklarına erişim desteği etkin kılınır. Bu modül mod_dav modülü için destek sağlar. Bu bakımdan, mod_dav modülünü de etkin kılmak için --enable-dav seçeneğini de kullanmalısınız.
--enable-dav-lock
mod_dav_lock modülü tarafından sağlanan geri destek modüllerine temel DAV kilitleme desteği etkin kılınır. Bu modülün işlevsel olabilmesi için en azından mod_dav modülünün etkin olması gerekir, dolayısıyla bu seçeneği --enable-dav ile birlikte kullanmalısınız.
--enable-deflate
mod_deflate modülü tarafından sağlanan sıkıştırılmış aktarım kodlaması etkin kılınır.
--enable-disk-cache
mod_disk_cache modülü tarafından sağlanan diskte önbellekleme etkin kılınır.
--enable-expires
mod_expires modülü tarafından sağlanan Expires başlığıyla denetim etkin kılınır.
--enable-ext-filter
mod_ext_filter modülü tarafından sağlanan harici süzgeç desteği etkin kılınır.
--enable-file-cache
mod_file_cache modülü tarafından sağlanan dosya önbelleklemesi etkin kılınır.
--enable-headers
mod_headers modülü tarafından sağlanan HTTP başlıkları denetimi etkin kılınır.
--enable-info
mod_info modülü tarafından sağlanan sunucu bilgileri etkin kılınır.
--enable-ldap
mod_ldap modülü tarafından sağlanan LDAP önbelleklemesi ve bağlantı havuzu hizmetleri etkin kılınır.
--enable-logio
mod_logio modülü tarafından sağlanan başlıklarda bulunan girdi ve çıktı bayt sayılarının günlüklenmesi etkin kılınır.
--enable-mem-cache
mod_mem_cache modülü tarafından sağlanan bellekte önbellekleme etkin kılınır.
--enable-mime-magic
mod_mime_magic modülü tarafından sağlanan MIME türlerinin kendiliğinden belirlenmesi desteği etkin kılınır.
--enable-isapi
mod_isapi modülü tarafından sağlanan isapi eklenti desteği etkin kılınır.
--enable-proxy
mod_proxy modülü tarafından sağlanan vekil/ağ-geçidi işlevselliği etkin kılınır. AJP13, CONNECT, FTP, HTTP ve dengeleyici vekil yetenekleri ayrı olarak mod_proxy_ajp, mod_proxy_connect, mod_proxy_ftp, mod_proxy_http ve mod_proxy_balancer modülleri tarafından sağlanır. Bu beş modül bu seçenekle kendiliğinden etkin olur.
--enable-proxy-ajp
mod_proxy_ajp modülü tarafından sağlanan AJP13 (Apache JServ Protokolü 1.3) için vekil desteği etkin kılınır. Bu modül mod_proxy modülünün bir eklentisidir, dolayısıyla bu seçeneği --enable-proxy seçeneği ile birlikte kullanmalısınız.
--enable-proxy-balancer
mod_proxy_balancer modülü tarafından sağlanan AJP13, FTP ve HTTP protokollerine yük dengeleme desteği etkin kılınır. Bu modül mod_proxy modülünün bir eklentisidir, dolayısıyla bu seçeneği --enable-proxy seçeneği ile birlikte kullanmalısınız.
--enable-proxy-connect
mod_proxy_connect modülü tarafından sağlanan CONNECT isteklerine vekil desteği etkin kılınır. Bu modül mod_proxy modülünün bir eklentisidir, dolayısıyla bu seçeneği --enable-proxy seçeneği ile birlikte kullanmalısınız.
--enable-proxy-ftp
mod_proxy_ftp modülü tarafından sağlanan FTP isteklerine vekil desteği etkin kılınır. Bu modül mod_proxy modülünün bir eklentisidir, dolayısıyla bu seçeneği --enable-proxy seçeneği ile birlikte kullanmalısınız.
--enable-proxy-http
mod_proxy_http modülü tarafından sağlanan HTTP isteklerine vekil desteği etkin kılınır. Bu modül mod_proxy modülünün bir eklentisidir, dolayısıyla bu seçeneği --enable-proxy seçeneği ile birlikte kullanmalısınız.
--enable-rewrite
mod_rewrite modülü tarafından sağlanan kurallara dayalı URL kurgulaması etkin kılınır.
--enable-so
mod_so modülü tarafından sağlanan DSO yeteneği etkin kılınır. --enable-mods-shared seçeneği bu seçeneği de etkin kılar.
--enable-speling
mod_speling modülü tarafından sağlanan URL yanlışlarını düzeltme desteği etkin kılınır.
--enable-ssl
mod_ssl modülü tarafından sağlanan SSL/TLS şifreleme desteği etkin kılınır.
--enable-unique-id
mod_unique_id modülü tarafından sağlanan her isteğe bir eşsiz kimlik atama desteği etkin kılınır.
--enable-usertrack
mod_usertrack modülü tarafından sağlanan kullanıcı oturumunu izleme desteği etkin kılınır.
--enable-vhost-alias
mod_vhost_alias modülü tarafından sağlanan kitlesel sanal barındırma desteği etkin kılınır.

Geliştiriciler için modüller

Aşağıdakiler geliştiricilerin yaptıklarını sınamalar için yararlı modülleri etkinleştiren seçeneklerdir. Bu seçenekler öntanımlı olarak etkin değildir. Bu modüllere ihtiyacınız olup olmadığı konusunda bir fikriniz yoksa bu bölümü atlayabilirsiniz.

--enable-bucketeer
mod_bucketeer modülü tarafından sağlanan veri kümelerine müdahale süzgeci etkin kılınır.
--enable-case-filter
mod_case_filter modülünün sağladığı çıktıda büyük harfe dönüşüm süzgeci örneği etkin kılınır.
--enable-case-filter-in
mod_case_filter_in modülünün sağladığı girdide büyük harfe dönüşüm süzgeci örneği etkin kılınır.
--enable-echo
mod_echo modülünün sağladığı ECHO sunucusu etkin kılınır.
--enable-example
Örnek ve demo modülü mod_example etkin kılınır.
--enable-optional-fn-export
mod_optional_fn_export modülünün sağladığı seçimlik işlev ihraç örneği etkin kılınır.
--enable-optional-fn-import
mod_optional_fn_import modülünün sağladığı seçimlik işlev ithal örneği etkin kılınır.
--enable-optional-hook-export
mod_optional_hook_export modülünün sağladığı seçimlik kanca işlev ihraç örneği etkin kılınır.
--enable-optional-hook-import
mod_optional_hook_import modülünün sağladığı seçimlik kanca işlev ithal örneği etkin kılınır.

MPM'ler ve üçüncü parti modüller

Gereken çok süreçlilik modüllerini ve üçüncü parti modülleri etkin kılmak için şu seçenekler kullanılır:

--with-module=modül-türü:modül-dosyası[,modül-türü:modül-dosyası]

Durağan ilintili modüller listesine belirtilen modülleri ekler. Modül kaynak dosyası modül-dosyası, önce Apache HTTP Sunucusu kaynak ağacı altında modules/modül-türü alt dizininde aranır. Modül orada değilse configure betiği modül-dosyası ile bir mutlak dosya yolu belirtildiği varsayımıyla kaynak dosyasını modül-türü alt dizinine kopyalamaya çalışır. Alt dizin mevcut değilse oluşturulur ve içine standart bir Makefile.in yerleştirilir.

Bu seçenek tek kaynak dosyasından oluşan küçük harici modülleri eklemek için yararlıdır. Daha karmaşık modüller için modül üreticisi tarafından sağlanan belgelere bakınız.

Bilginize

Durağan ilintili modüller yerine bir DSO modülü derlemek isterseniz apxs programını kullanınız.

--with-mpm=MPM
Sunucu süreç modeli seçilir. Bu seçenekte çok süreçlilik modüllerinden sadece biri belirtilebilir. Bu seçenek kullanılmadığı takdirde işletim sisteminiz için öntanımlı MPM etkin olur. Bu seçenekte belirtilebilecek MPM isimleri: beos, mpmt_os2, prefork ve worker.

Kümeleme seçenekleri ve diğerleri

--enable-maintainer-mode
Hata ayıklama iletileri ve derleme sırasındaki uyarıların gösterilmesi etkin kılınır.
--enable-mods-shared=modül-listesi

Etkinleştirilip devingen paylaşımlı modül olarak derlenecek modüllerin listesi belirtilir. Yani, bu modüller LoadModule yönergesi kullanılarak devingen olarak yüklenir.

modül-listesi tırnak içine alınmış boşluk ayraçlı modül isimleri listesidir. Modül isimleri önlerindeki mod_ öneki olmaksızın belirtilirler. Örnek:

--enable-mods-shared='headers rewrite dav'

modül-listesi yerine all ve most anahtar sözcükleri de belirtilebilir. Örneğin,

--enable-mods-shared=most

seçeneği ile çoğu modül DSO modülü olarak derlenecektir.

Yetersizlikler: --enable-mods-shared=all aslında bütün modüllerin derlenmesini sağlamaz. Tüm modülleri derlemek için şunu yapabilirsiniz:

./configure \
--with-ldap \
--enable-mods-shared="all ssl ldap cache proxy authn_alias mem_cache file_cache authnz_ldap charset_lite dav_lock disk_cache"

--enable-modules=modül-listesi
Bu seçenek modülleri devingen değil de durağan ilintilemek dışında --enable-mods-shared seçeneğine benzer. Yani bu modüller httpd çalıştırılır çalıştırılmaz etkin olurlar. Yüklenmeleri için LoadModule yönergesine ihtiyaçları yoktur.
--enable-v4-mapped
IPv6 soketlierinin IPv4 bağlantılar üzerinde kullanılması mümkün olur.
--with-port=port
Bu seçenek httpd'nin dinleyeceği portu belirler. Bu port httpd.conf yapılandırma dosyası üretilirken kullanılır. 80. port öntanımlıdır.
--with-program-name
Öntanımlı olan httpd yerine başka bir çalıştırabilir ismi tanımlar.

Seçimlik paketler

Buradaki seçenekler seçimlik paketleri tanımlamak için kullanılır.

Genel sözdizimi

Bir seçimlik paketi tanımlamak için genellikle şöyle bir sözdizimi kullanılır:

--with-paket[=değer]
paket paketi kullanılır. Öntanımlı değer yes’tir.
--without-paket
paket paketi kullanılmaz. Öntanımlı değer no’dur. Bu seçenek autoconf tarafından sağlanmıştır ve Apache HTTP Sunucusu için pek yararlı değildir.

Özel paketler

--with-apr=dizin|dosya
Apache Taşınabilir Arayüzü (APR) httpd kaynak paketinin bir parçası olup HTTP Sunucu ile birlikte derlenir. Eğer kendi kurulu APR’nizi kullanmak isterseniz bunu configure betiğine apr-config betiğinin yolunu belirterek ifade edebilirsiniz. Kurulu APR için bid dizin, dosya ismi veya mutlak dosya yolu belirtebilirsiniz. apr-config ya belirttiğiniz dizinde ya da bin alt dizininde bulunmalıdır.
--with-apr-util=dizin|dosya
Apache Taşınabilir Arayüzü Araçları (APU) httpd kaynak paketinin bir parçası olup HTTP Sunucu ile birlikte derlenir. Eğer kendi kurulu APU’nuzu kullanmak isterseniz bunu configure betiğine apu-config betiğinin yolunu belirterek ifade edebilirsiniz. Kurulu APR için bir dizin, dosya ismi veya mutlak dosya yolu belirtebilirsiniz. apr-config ya belirttiğiniz dizinde ya da bin alt dizininde bulunmalıdır.
--with-ssl=dizin
mod_ssl modülü etkinse configure betiği kurulu bir OpenSSL arayacaktır. Kendi SSL/TLS kurulumunuzun yolunu bu seçenekle belirtebilirsiniz.
--with-z=dizin
Yapılandırmanız gerektirdiği takdirde (örneğin, mod_deflate etkinse) configure betiği kurulu zlib kütüphanesinin yerini tespit etmeye çalışacaktır. Kendi sıkıştırma kütüphanenizin yerini bu seçenekle belirtebilirsiniz.

Apache HTTP Sunucusunun çeşitli bölümleri, mod_authn_dbm, mod_authz_dbm ve mod_rewrite modülünün RewriteMap yönergesi bilgilere erişimi hızlandırmak için basit anahtar/değer veritabanları kullanırlar. SDBM, APU içinde mevcut olduğundan bu veritabanı her zaman kullanılabilir durumdadır. Eğer başka veritabanı türleri kullanmak isterseniz aşağıdaki seçeneklerle bunları etkin kılabilirsiniz:

--with-gdbm[=dizin-yolu]
Bir dizin-yolu belirtilmemişse configure betiği GNU DBM kurulumunun kütüphanelerini ve başlık dosyalarını bulunması olası yerlerde arar. Bir dizin-yolu belirtilmişse configure betiği kurulumun kütüphanelerini dizin-yolu/lib altında, başlık dosyalarını ise dizin-yolu/include altında arayacaktır. Bundan başka, başlık ve kütüphane dosyalarının bulundukları yerler iki nokta imi ile ayrılarak dizin-yolu olarak belirtilebilir.
--with-ndbm[=dizin-yolu]
New DBM kurulumunu araştırması dışında --with-gdbm seçeneği gibidir.
--with-berkeley-db[=dizin-yolu]
Berkeley DB kurulumunu araştırması dışında --with-gdbm seçeneği gibidir.

Bilginize

DBM seçenekleri APU tarafından sağlanmış olup onun yapılandırma betiğine aktarılır. Bu seçenekler --with-apr-util seçeneği ile tanımlanmış bir kurulu APU varsa kullanışlı olur.

HTTP sunucunuz ile birlikte birden fazla DBM gerçeklenimi kullanabilirsiniz. Kullanılacak DBM türünü her zaman çalışma anı yapılandırmanızla yapılandırabilirsiniz.

Destek programları için seçenekler

--enable-static-support
Destek programlarını durağan ilintili olarak derler. Yani çalıştırılabilirin kullandığı bütün kütüphaneler kodla bütünleştirilir. Bu seçenek belirtilmedikçe destek programları daima devingen ilintili olarak derlenir.
--enable-suexec
Çatallanan sürecin kullanıcı ve grup kimliklerinin değiştirilebilmesini sağlayan suexec programının kullanımını etkinleştirir. Sunucunuz üzerinde suid biti etkinleştirilmiş bir program çalıştırmanın sistem güvenliğinde yaratacağı sorunlar hakkında bir fikriniz yoksa bu seçeneği etkinleştirmeyin. suexec yapılandırma seçenekleri aşağıda açıklanmıştır.

Tek bir destek programını aşağıdaki seçenekleri kullanarak bir durağan ilintili çalıştırılabilir olarak derleyebilirsiniz:

--enable-static-ab
ab programının durağan ilintili sürümü derlenir.
--enable-static-checkgid
checkgid programının durağan ilintili sürümü derlenir.
--enable-static-htdbm
htdbm programının durağan ilintili sürümü derlenir.
--enable-static-htdigest
htdigest programının durağan ilintili sürümü derlenir.
--enable-static-htpasswd
htpasswd programının durağan ilintili sürümü derlenir.
--enable-static-logresolve
logresolve programının durağan ilintili sürümü derlenir.
--enable-static-rotatelogs
rotatelogs programının durağan ilintili sürümü derlenir.

suexec yapılandırma seçenekleri

Aşağıdaki seçeneklerle suexec programının davranışı hassas bir şekilde ayarlanabilir. Daha ayrıntılı bilgi için suEXEC yapılandırması ve kurulumuna bakınız.

--with-suexec-bin
Bu seçenek ile suexec çalıştırılabilirinin yeri belirtilir. Öntanımlı olarak --sbindir ile belirtilen dizine kurulur (Kurulum dizinlerinde ince ayar konusuna bakınız).
--with-suexec-caller
Bu seçenek ile suexec’i çalıştırabilecek kullanıcı belirtilir. Normalde httpd programını çalıştıran kullanıcı olmalıdır.
--with-suexec-docroot
Bu seçenek ile suexec'e erişebilecek çalıştırılabilirlerin altında bulunacağı dizin belirtilir. --datadir/htdocs öntanımlıdır.
--with-suexec-gidmin
suexec için hedef kullanıcı olmasına izin verilen en küçük grup kimliğini tanımlamak için kullanılır. 100 öntanımlıdır.
--with-suexec-logfile
suexec günlük dosyasının ismi belirtilir. Öntanımlı olarak bu dosyanın ismi suexec_log olup --logfiledir seçeneği ile belirtilen dizin altında bulunur.
--with-suexec-safepath
suexec tarafından çalıştırılacak süreçlerin çalıştırılabilirlerinin bulunabileceği dizinleri PATH ortam değişkenine tanımlamak için kullanılır. /usr/local/bin:/usr/bin:/bin öntanımlıdır.
--with-suexec-userdir
Bu seçenek, kullanıcı dizinleri altında suexec tarafından çalıştırılacak süreçlerin çalıştırılabilirlerinin bulunabileceği alt dizini tanımlar. suexec programını (mod_userdir tarafından sağlanan) kullanıcıya özel dizinlerde kullanmak istediğinizde bu gereklidir. public_html alt dizini öntanımlıdır.
--with-suexec-uidmin
suexec için hedef kullanıcı olmasına izin verilen en küçük kullanıcı kimliğini tanımlamak için kullanılır. 100 öntanımlıdır.
--with-suexec-umask
suexec tarafından çalıştırılacak süreçler için umask tanımlar. Sisteminiz için geçerli ayarlar öntanımlıdır.

Ortam Değişkenleri

configure betiğinin yerleri ve isimleri standartlara uygun olmayan kütüphaneleri ve programları bulmasını yardımcı olan veya configure betiği tarafından yapılan bazı seçimleri değiştirmenizi sağlayacak bazı ortam değişkenleri vardır.

CC
Bu değişkenle derleme sırasında kullanılacak C derleyici komutu tanımlanır.
CFLAGS
Bu değişkenle derleme sırasında kullanılacak C derleyici seçenekleri tanımlanır.
CPP
Bu değişkenle derleme sırasında kullanılacak C önişlemci komutu tanımlanır.
CPPFLAGS
C/C++ önişlemci seçenekleri tanımlanır. Örneğin, eğer başlık dosyaları standart yerlerinde değil de includedir dizinindeyse bunu -Iincludedir seçeneği olarak belirtebilirsiniz.
LDFLAGS
İlintileyici seçenekleri tanımlanır. Örneğin, eğer kütüphane dosyalarınız standart yerlerinde değil de libdir dizinindeyse bunu -Llibdir seçeneği olarak belirtebilirsiniz.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


dbmmanage - DBM biçemli kullanıcı kimlik doğrulama dosyalarını yönetir - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

dbmmanage - DBM biçemli kullanıcı kimlik doğrulama dosyalarını yönetir

dbmmanage, mod_authn_dbm üzerinden HTTP kullanıcılarının temel kimlik doğrulaması için kullanıcı isimlerinin ve parolalarının saklanmasında kullanılacak DBM dosyalarını oluşturmak ve güncellemek için kullanılır. Apache HTTP sunucusunun mevcut özkaynaklarının kullanımı sadece dbmmanage tarafından oluşturulan dosyalarda listelenmiş kullanıcılara tahsis edilebilir. Bu program sadece, kullanıcı isimleri bir DBM dosyasında saklanmak istenirse işe yarar. Düz metin bir veritabanı kullanmak isterseniz htpasswd sayfasına bakınız.

Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler. Kullanıcı kimlik doğrulamasını httpd'de yapılandırmak için gerekli yönergelerle ilgili ayrıntılar için Apache dağıtımının bir parçası olan ve http://httpd.apache.org/ adresinde de bulunan Apache HTTP Sunucusu Belgelerine bakınız.

Ayrıca bakınız:

  • httpd
  • mod_authn_dbm
  • mod_authz_dbm

Kullanım

dbmmanage [ kodlama ] dosyaismi add|adduser|check|delete|update kullanıcı [ şifreli_parola [ grup[,grup...] [ açıklama ] ] ]

dbmmanage dosyaismi view [ kullanıcı ]

dbmmanage dosyaismi import

Seçenekler

dosyaismi
DBM dosyasının ismi. Genellikle, .db, .pag veya .dir eklentisi olmaksızın belirtilir.
kullanıcı
İşlemleri gerçekleştirecek kullanıcı ismi. kullanıcı ismi ikinokta imi (:) içeremez.
şifreli_parola
update ve add komutları için kullanılacak şifreli paroladır. Parolanın istenmesini sağlamak, fakat hemen ardından alanları doldurmak için bir tire imi (-) kullanabilirsiniz. Buna ek olarak, update komutunu kullanırken özgün parolaya dokunulmaması için bir nokta imi (.) kullanabilirsiniz.
grup
Kullanıcının üyesi olduğu grup. Grup ismi ikinokta imi (:) içeremez.Kullanıcıyı bir gruba atamadan açıklama alanını doldurmak istiyorsanız bir tire imi (-) kullanabilirsiniz. Buna ek olarak, update komutunu kullanırken özgün gruba dokunulmaması için bir nokta imi (.) kullanabilirsiniz.
açıklama
Adı ve soyadı, eposta adresi gibi kullanıcıyla ilgili bir takım bilgiler buraya yazılır. Sunucu bu alanı gözardı eder.

Kodlamalar

-d
CRYPT şifrelemesi (Win32 ve Netware hariç, öntanımlı)
-m
MD5 şifrelemesi (Win32 ve Netware için öntanımlı)
-s
SHA1 şifrelemesi
-p
düz metin (önerilmez)

Komutlar

add
şifreli_parola'yı kullanarak dosyaismi dosyasına kullanıcı için bir girdi ekler.

dbmmanage passwords.dat add rbowen foKntnEF3KSXA

adduser
Parola sorduktan sonra dosyaismi dosyasına kullanıcı için bir girdi ekler.

dbmmanage passwords.dat adduser krietz

check
Parola sorduktan sonra belirtilen kullanıcı, dosyaismi dosyasında var mı diye bakar; varsa belirtilen parolayı kullanıcınınkiyle eşleştirmeye çalışır.

dbmmanage passwords.dat check rbowen

delete
dosyaismi dosyasından kullanıcı girdisini siler.

dbmmanage passwords.dat delete rbowen

import
Standart girdiden kullanıcı:parola satırlarını (her satırda bir tane) okur ve bunları dosyaismi dosyasına ekler. Parola şifrelenmiş olmalıdır.
update
Belirtilen kullanıcı'nın dosyaismi dosyasında mevcut olması dışında adduser komutu gibidir.

dbmmanage passwords.dat update rbowen

view
Sadece, DBM dosyasının içeriğini gösterir. Bir kullanıcı belirtirseniz sadece o kaydı gösterir.

dbmmanage passwords.dat view

Hatalar

Birden fazla DBM dosya biçemi vardır ve büyük bir olasılıkla da sisteminizde bu birden fazla biçemle ilgili kütüphaneler vardır. SDBM, NDBM, GNU'nun GDBM projesi ve Berkeley DB 2 bunların başlıcalarıdır. Ne yazık ki, bu kütüphanelerin her birinin dosya biçimleri farklıdır. Bu bakımdan, dosyaismi dosyasında kullanılan dosya biçeminin dbmmanage tarafından kullanılanla aynı biçemde olduğundan emin olmalısınız. dbmmanage hangi tür DBM dosyasına baktığını saptayacak yeterliliğe sahip değildir. Yanlış biçemli bir dosya belirtirseniz hiçbir şey dönmeyebileceği gibi, başka isimde bir DBM dosyasının oluşturulması veya daha da kötüsü üzerine yazmaya çalışıyorsanız DBM dosyasının bozulması bile olasıdır.

dbmmanage programının başlangıcında @AnyDBM::ISA dizisi olarak tanımlanmış DBM biçem tercihlerinin bir listesi vardır. Berkeley DB 2 biçemini tercih ettiğimizden dbmmanage sistem kütüphanelerini şu sıraya göre arar: Berkeley DB 2, NDBM, GDBM ve SDBM. dbmmanage DBM dosyası hareketleri için bu sıralamaya göre bulduğu ilk kütüphaneyi kullanacaktır. Sıralama Perl'deki dbmopen() çağrısının kullandığından faklı olduğu gibi Perl'deki standart @AnyDBM::ISA sıralamasından da oldukça farklıdır. Bu bakımdan, DBM dosyalarınızı yönetmek için Perl ile yazılmış başka araçlar kullanıyorsanız, onların da bu tercih sırasını izlemesini sağlamalısınız. Benzer şekilde, bu dosyalara erişmek için diğer dillerde (C gibi) yazılmış programlar kullanıyorsanız bunlar için de aynı durum geçerlidir.

Unix sistemlerinde, kullanılan DBM dosyasının biçemini öğrenmek için file programı kullanılabilir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


htcacheclean - Disk arabelleğini temizler - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

htcacheclean - Disk arabelleğini temizler

htcacheclean, mod_disk_cache deposunun boyutlarını belli sınırlar içinde tutmak için kullanılır. Bu araç ya elle ya da bir artalan süreci olarak çalıştırılır. Artalan süreci olarak çalıştırıldığında, silinecek arabellek içeriğini tespit etmek için arabellek dizinlerine belli aralıklarla bakmak dışında uykuda olur. Artalan sürecini temiz olarak durdurmak için TERM veya INT sinyali göndermeniz yeterlidir.

Ayrıca bakınız:

  • mod_disk_cache

Kullanım

htcacheclean
    [ -D ]
    [ -v ]
    [ -t ]
    [ -r ]
    [ -n ]
    -pyol
    -lsınır

htcacheclean [ -n ] [ -t ] [ -i ] -dsüre -pyol -lsınır

Options

-d süre
Artalanda çalışarak süre dakikada bir arabelleği temizler. Bu seçenek -D, -v ve -r seçenekleri ile birlikte kullanılamaz. Artalan sürecini temiz olarak sonlandırmak için SIGTERM veya SIGINT göndermek yeterlidir.
-D
Kuru kuruya çalışıp, hiçbir şeyi silmez. -d seçeneği ile birlikte kullanılamaz.
-v
Çıktı daha ayrıntılı olur. -d seçeneği ile birlikte kullanılamaz.
-r
İyice temizlik yapılır. Bunun için Apache HTTP sunucusunun çalışmadığı varsayılır (aksi takdirde arabellek içeriği bozulabilir). -t seçeneğinin de uygulanmasını sağlar. -d seçeneği ile birlikte kullanılamaz.
-n
Nazik olur. Diğer süreçlerin yararına daha yavaş çalışır. (a) disk G/Ç işlemlerinde gecikmeler olursa ve (b) çekirdek bu arada başka bir süreci öne çekmişse htcacheclean uyumayı tercih edecektir.
-t
Tüm boş dizinleri siler. Öntanımlı olarak, sadece arabellek dosyaları silinirse de bazı yapılandırmalarda büyük miktarda dizin oluşturulması bu seçeneğin kullanılmasını gerektirebilir. Yapılandırmanız çok sayıda dizin gerektiriyorsa ve dosya düğümlerinin veya dosya ayırma tablolarının tükenmesi sözkonusu ise bu seçeneğin kullanılması önerilir.
-p yol
yol, disk arabelleğinin kök dizini olarak belirtilir. CacheRoot yönergesinde belirtilen dizin olmalıdır.
-l sınır
sınır, disk arabelleğinin toplam boyutu olarak belirtilir. Değerin öntanımlı olarak bayt cinsinden belirtileceği varsayılır. Değerin sonuna kilobayt için K, megabayt M, bayt için B harfi konulabilir.
-i
Akıllı olup sadece disk arabelleği değiştiği zaman çalışır. Bu seçenek -d seçeneği ile birlikte belirtilmek zorundadır.

Çıkış Durumu

htcacheclean, tüm işlemler başarıyla yerine getirildiğinde 0, aksi takdirde 1 döndürür.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


htdbm - DBM parola veritabanlarını yönetir - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

htdbm - DBM parola veritabanlarını yönetir

htdbm, mod_authn_dbm üzerinden HTTP kullanıcılarının temel kimlik doğrulaması için kullanıcı isimlerinin ve parolalarının saklanmasında kullanılacak DBM dosyalarını yönetmek için kullanılır. DBM dosyaları hakkında daha ayrıntılı bilgi edinmek için dbmmanage sayfasına bakınız.

Ayrıca bakınız:

  • httpd
  • dbmmanage
  • mod_authn_dbm

Kullanım

htdbm [ -TVTtürü ] [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] [ -x ] parola-dosyası kullanıcı

htdbm -b [ -TVTtürü ] [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] parola-dosyası kullanıcı parola

htdbm -n [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] kullanıcı

htdbm -nb [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] kullanıcı parola

htdbm -v [ -TVTtürü ] [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] parola-dosyası kullanıcı

htdbm -vb [ -TVTtürü ] [ -c ] [ -m | -d | -p | -s ] [ -t ] [ -v ] parola-dosyası kullanıcı parola

htdbm -x [ -TVTtürü ] [ -m | -d | -p | -s ] parola-dosyası kullanıcı

htdbm -l [ -TVTtürü ]

Seçenekler

-b
Betik kipi; parola için istek yapmak yerine parola komut satırından verilir. Parola komut satırında görünür olacağından çok dikkatli kullanmak gerekir.
-c
parola-dosyası oluşturur. Dosya mevcutsa, dosya silinip yeniden yazılır. Bu seçenek -n seçeneği ile birlikte kullanılamaz.
-n
Sonuçları veritabanında güncellemek yerine standart çıktıya gönderir. parola-dosyası belirtilmediğinden, bu seçenek komut satırı sözdizimini değiştirir. Bu seçenek -c seçeneği ile birlikte kullanılamaz.
-m
Parolalar için MD5 şifrelemesi kullanılır. Windows, Netware ve TPF için öntanımlıdır.
-d
Parolaları şifrelemek için crypt() kullanılır. Windows, Netware ve TPF dışında öntanımlıdır. htdbm tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve TPF üzerinde httpd sunucusu tarafından desteklenmez.
-s
Parolalar için SHA şifrelemesi kullanılır. LDAP Dizin değişim biçemini (ldif) kullanarak Netscape sunucularına/sunucularından göçü kolaylaştırır.
-p
Düz metin parolalar kullanılır. htdbm tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve TPF üzerinde httpd sunucusu tarafından sadece düz metin parolalar kabul edilir.
-l
Veritabanındaki kullanıcıları açıklamalarıyla birlikte standart çıktıya gönderir.
-t
Son değiştirgenin bir açıklama olarak yorumlanmasını sağlar. Bu seçenek kullanıldığında komut satırının sonuna fazladan bir dizge eklenebilir. Bu dizge, veritabanında belirtilen kullanıcının "Comment" alanında saklanır.
-v
Kullanıcı adını ve parolasını doğrular. Program belirtilen parolanın geçerli olup olmadığını belirten bir ileti basar. Eğer parola geçersizse program hata kodu 3 ile çıkar.
-x
Kullanıcıyı siler. Kullanıcı belirtilen DBM dosyasında mevcutsa silinir.
parola-dosyası
DBM dosyasının ismi. Genellikle, .db, .pag veya .dir eklentisi olmaksızın belirtilir. -c seçeneği ile birlikte verilmişse ve DBM dosyası mevcut değilse dosya oluşturulur, mevcutsa dosya güncellenir.
kullanıcı
parola-dosyası'nda oluşturulacak veya güncellenecek kullanıcı ismi. kullanıcı bu dosyada mevcut değilse yeni bir girdi eklenir. Girdi mevcutsa parolası değiştirilir.
parola
Şifrelenip DBM dosyasında saklanacak düz metin parola. Sadece -b seçeneği ile kullanılır.
-T VTtürü
DBM dosyasının türü; SDBM, GDBM, DB, veya "default" olabilir.

Hatalar

Birden fazla DBM dosya biçemi vardır ve büyük bir olasılıkla da sisteminizde bu birden fazla biçemle ilgili kütüphaneler vardır. SDBM, NDBM, GNU'nun GDBM projesi ve Berkeley/Sleepycat DB 2/3/4 bunların başlıcalarıdır. Ne yazık ki, bu kütüphanelerin her birinin dosya biçimleri farklıdır. Bu bakımdan, dosyaismi dosyasında kullanılan dosya biçeminin htdbm tarafından kullanılanla aynı biçemde olduğundan emin olmalısınız. htdbm hangi tür DBM dosyasına baktığını saptayacak yeterliliğe sahip değildir. Yanlış biçemli bir dosya belirtirseniz hiçbir şey dönmeyebileceği gibi, başka isimde bir DBM dosyasının oluşturulması veya daha da kötüsü üzerine yazmaya çalışıyorsanız DBM dosyasının bozulması bile olasıdır.

Unix sistemlerinde, kullanılan DBM dosyasının biçemini öğrenmek için file programı kullanılabilir.

Çıkış Durumu

htdbm, kullanıcı ismi ve parolasını DBM dosyasına başarıyla eklemiş veya güncellemişse 0, dosyalara erişirken bir sorun çıkmışsa 1, komut satırında bir sözdizimi hatası varsa 2, parola etkileşimli alınmış fakat girdi ile eşleşme sağlanamamışsa 3, işlem kesintiye uğramışsa 4, bir değer çok uzunsa 5 (kullanıcı, parola, dosya ismi veya açıklama), kullanıcı ismi kuraldışı karakter içeriyorsa (Kısıtlamalar bölümüne bakınız) 6 ve dosya geçerli bir DBM parola dosyası değilse 7 değeriyle döner.

Örnekler

htdbm /usr/local/etc/apache/.htdbm-users jsmith

jsmith kullanıcısı için parolayı ekler veya değiştirir. Parolayı vermesi için kullanıcıya parola isteği yapılır. Windows üzerinde çalıştırılırsa parola Apache MD5 algoritması ile şifrelenir, aksi takdirde sistemin crypt() yordamı kullanılır. Dosya mevcut değilse htdbm beklenen hiçbir işlemi yapmadan bir hata vererek çıkar.

htdbm -c /home/doe/public_html/.htdbm jane

Yeni bir dosya oluşturur ve kullanıcı jane için kaydı bir girdi olarak bu dosyaya yazar. Dosya mevcutsa fakat okunamıyor veya yazılamıyorsa dosyada bir değişiklik yapılmaz ve htdbm bir ileti gösterip bir hata durumu ile çıkar.

htdbm -mb /usr/web/.htdbm-all jones Pwd4Steve

Komut satırından verilen parolayı (Pwd4Steve) MD5 algoritmasıyla şifreler ve bunu belirtilen dosyada saklar.

Güvenlik Değerlendirmeleri

htdbm tarafından yönetilen parola dosyalarına sunucunun URI uzayından erişilememelidir; yani dosya bir tarayıcı ile okunabilecek bir yerde bulunmamalıdır.

Komut satırında parolanın şifrelenmemiş olarak görünmesi sebebiyle -b seçeneğinin kullanımından kaçınılmasını öneriyoruz.

Kısıtlamalar

Windows ve MPE platformlarında, htdbm ile şifrelenen parolalar 255 karakterden daha uzun olamaz. 255 karakterden sonrası kırpılır.

htdbm tarafından kullanılan MD5 algoritması Apache yazılımına özeldir; bu algoritma ile şifrelenen parolalar başka HTTP sunucularında kullanılamayabilir.

Kullanıcı isimleri 255 bayttan uzun olamaz ve iki nokta imi (:) içeremez.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


htdigest - Özet kimlik doğrulama dosyalarını yönetir - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

htdigest - Özet kimlik doğrulama dosyalarını yönetir

htdigest, HTTP kullanıcılarının digest türü kimlik doğrulaması için kullanıcı isimlerinin ve parolalarının saklanmasında kullanılacak düz metin dosyalarını oluşturmak ve güncellemek için kullanılır. Apache HTTP sunucusunun mevcut özkaynaklarının kullanımı sadece htdigest tarafından oluşturulan dosyalarda listelenmiş kullanıcılara tahsis edilebilir.

Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler. Kullanıcı kimlik doğrulamasını httpd'de yapılandırmak için gerekli yönergelerle ilgili ayrıntılar için Apache dağıtımının bir parçası olan ve http://httpd.apache.org/ adresinde de bulunan Apache HTTP Sunucusu Belgelerine bakınız.

Ayrıca bakınız:

  • httpd
  • mod_auth_digest

Kullanım

htdigest [ -c ] parola-dosyası bölge kullanıcı

Seçenekler

-c
parola-dosyası oluşturur. Dosya mevcutsa, dosya silinip yeniden yazılır.
parola-dosyası
Kullanıcı ismi, parola ve bölge bilgilerini içeren dosyanın ismi. -c seçeneği verilmişse ve dosya mevcut değilse oluşturulur, dosya mevcutsa silinip yeniden oluşturulur.
bölge
Kullanıcının mensup olduğu bölge ismi. Ayrıntılı bilgi için http://tools.ietf.org/html/rfc2617#section-3.2.1 adresine bakınız.
kullanıcı
parola-dosyası'nda oluşturulacak veya güncellenecek kullanıcı ismi. kullanıcı bu dosyada mevcut değilse yeni bir girdi eklenir. Girdi mevcutsa parolası değiştirilir.

Güvenlik Değerlendirmeleri

Bu program bir setuid çalıştırılabiliri olarak güvenilir olmadığından setuid yapılmamalıdır.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


htpasswd - Temel kimlik doğrulama dosyalarını yönetir - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

htpasswd - Temel kimlik doğrulama dosyalarını yönetir

htpasswd, HTTP kullanıcılarının temel kimlik doğrulaması için kullanıcı isimlerinin ve parolalarının saklanmasında kullanılacak düz metin dosyalarını oluşturmak ve güncellemek için kullanılır. htpasswd, güncelleme sırasında yazmak veya okumak için bir dosyaya erişemezse beklenen hiçbir işlemi yapmaz ve hata vererek çıkar.

Apache HTTP sunucusunun mevcut özkaynaklarının kullanımı sadece htpasswd tarafından oluşturulan dosyalarda listelenmiş kullanıcılara tahsis edilebilir. htpasswd sadece düz metin dosyalarda saklanmış kullanıcı isimlerini ve parolalarını yönetirse de, diğer veri saklama türleri için parolayı şifreleyip gösterebilir. Bir DBM veritabanı kullanmak isterseniz dbmmanage sayfasına bakınız.

htpasswd, parolaları şifrelemek için ya Apache'nin kendine özgü MD5 algoritmasını ya da sistemin crypt() yordamını kullanır. Bazı kullanıcılar MD5 şifreli parolalara, bazıları da crypt() ile şifrelenmiş parolalara sahip olabileceğinden htpasswd tarafından yönetilen dosyalar her iki tür parolayı da içerebilir.

Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler. Kullanıcı kimlik doğrulamasını httpd'de yapılandırmak için gerekli yönergelerle ilgili ayrıntılar için Apache dağıtımının bir parçası olan ve http://httpd.apache.org/ adresinde de bulunan Apache HTTP Sunucusu Belgelerine bakınız.

Ayrıca bakınız:

  • httpd
  • Kaynak paketinin support/SHA1 dizinindeki betikler.

Kullanım

htpasswd [ -c ] [ -m ] [ -D ] parola-dosyası kullanıcı

htpasswd -b [ -c ] [ -m | -d | -p | -s ] [ -D ] parola-dosyası kullanıcı parola

htpasswd -n [ -m | -d | -s | -p ] kullanıcı

htpasswd -nb [ -m | -d | -s | -p ] kullanıcı parola

Seçenekler

-b
Betik kipi; parola için istek yapmak yerine parola komut satırından verilir. Parola komut satırında görünür olacağından çok dikkatli kullanmak gerekir.
-c
parola-dosyası oluşturur. Dosya mevcutsa, dosya silinip yeniden yazılır. Bu seçenek -n seçeneği ile birlikte kullanılamaz.
-n
Sonuçları veritabanında güncellemek yerine standart çıktıya gönderir. Bu seçenek, Apache'nin metin veriler içermeyen veri depolarına dahil edilebilecek parolaları üretmekte yararlıdır. parola-dosyası belirtilmediğinden, bu seçenek komut satırı sözdizimini değiştirir. Bu seçenek -c seçeneği ile birlikte kullanılamaz.
-m
Parolalar için MD5 şifrelemesi kullanılır ve bu 2.2.18 sürümünden beri öntanımlıdır.
-d
Parolaları şifrelemek için crypt() kullanılır. Windows, Netware ve TPF üzerinde httpd sunucusu tarafından desteklenmez. Bu algoritma parola uzuluğunu 8 karakterle sınırlar. Bugünün standatlarında bu algoritma güvenilmez kabul edilmektedir. 2.2.17 sürümüne kadar öntanımlı algoritma olarak kullanılmıştır.
-s
Parolalar için SHA şifrelemesi kullanılır. LDAP Dizin değişim biçemini (ldif) kullanarak Netscape sunucularına/sunucularından göçü kolaylaştırır.
-p
Düz metin parolalar kullanılır. htpasswd tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve TPF üzerinde httpd sunucusu tarafından sadece düz metin parolalar kabul edilir.
-D
Kullanıcıyı siler. Kullanıcı belirtilen dosyada mevcutsa silinir.
parola-dosyası
Kullanıcı ismini ve parolasını içeren dosyanın ismi. -c seçeneği verilmişse ve dosya mevcut değilse oluşturulur, dosya mevcutsa silinip yeniden oluşturulur.
kullanıcı
parola-dosyası'nda oluşturulacak veya güncellenecek kullanıcı ismi. kullanıcı bu dosyada mevcut değilse yeni bir girdi eklenir. Girdi mevcutsa parolası değiştirilir.
parola
Şifrelenip dosyada saklanacak düz metin parola. Sadece -b seçeneği ile kullanılır.

Çıkış Durumu

htpasswd, kullanıcı ismi ve parolasını DBM dosyasına başarıyla eklemiş veya güncellemişse 0, dosyalara erişirken bir sorun çıkmışsa 1, komut satırında bir sözdizimi hatası varsa 2, parola etkileşimli alınmış fakat girdi ile eşleşme sağlanamamışsa 3, işlem kesintiye uğramışsa 4, bir değer çok uzunsa 5 (kullanıcı, parola, dosya ismi veya açıklama), kullanıcı ismi kuraldışı karakter içeriyorsa (Kısıtlamalar bölümüne bakınız) 6 ve dosya geçerli bir DBM parola dosyası değilse 7 değeriyle döner.

Örnekler

htpasswd /usr/local/etc/apache/.htpasswd-users jsmith

jsmith kullanıcısı için parolayı ekler veya değiştirir. Parolayı vermesi için kullanıcıya parola isteği yapılır. Parola Apache MD5 algoritması ile şifrelenir. Dosya mevcut değilse htpasswd beklenen hiçbir işlemi yapmadan bir hata vererek çıkar.

htpasswd -c /home/doe/public_html/.htpasswd jane

Yeni bir dosya oluşturur ve kullanıcı jane için kaydı bir girdi olarak bu dosyaya yazar. Dosya mevcutsa fakat okunamıyor veya yazılamıyorsa dosyada bir değişiklik yapılmaz ve htpasswd bir ileti gösterip bir hata durumu ile çıkar.

htpasswd -db /usr/web/.htpasswd-all jones Pwd4Steve

Komut satırından verilen parolayı (Pwd4Steve) crypt() algoritmasıyla şifreler ve bunu belirtilen dosyada saklar.

Güvenlik Değerlendirmeleri

htpasswd tarafından yönetilen parola dosyalarına sunucunun URI uzayından erişilememelidir; yani dosya bir tarayıcı ile okunabilecek bir yerde bulunmamalıdır.

Bu program bir setuid çalıştırılabiliri olarak güvenilir olmadığından setuid yapılmamalıdır.

Komut satırında parolanın şifrelenmemiş olarak görünmesi sebebiyle -b seçeneğinin kullanımından kaçınılmasını öneriyoruz.

crypt() algoritması kullanılırken, parolayı şekillendirmek için parolanın ilk 8 baytının kullanılacağına dikkat ediniz. Eğer parola 8 bayttan uzunsa kalanlar bir uyarı verilmeksizin iptal edilir.

SHA şifreleme biçeminde tuz kullanılmaz; yani, bir parolanın sadece bir şifreli gösterimi olabilir. crypt() ve MD5 biçemleri parolanın önüne rasgele üretilmiş bir tuz dizgesi eklediklerinden sözlük saldırılarına karşı daha dayanıklıdırlar.

Kısıtlamalar

Windows ve MPE platformlarında, htpasswd ile şifrelenen parolalar 255 karakterden daha uzun olamaz. 255 karakterden sonrası kırpılır.

htpasswd tarafından kullanılan MD5 algoritması Apache yazılımına özeldir; bu algoritma ile şifrelenen parolalar başka HTTP sunucularında kullanılamayabilir.

Kullanıcı isimleri 255 bayttan uzun olamaz ve iki nokta imi (:) içeremez.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


httxt2dbm - RewriteMap ile kullanmak için DBM dosyaları üretir - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

httxt2dbm - RewriteMap ile kullanmak için DBM dosyaları üretir

httxt2dbm, RewriteMap ile kullanmak için düz metin dosyalardan DBM dosyaları üretir.

Ayrıca bakınız:

  • httpd
  • mod_rewrite

Kullanım

httxt2dbm [ -v ] [ -f DBM_türü ] -i kaynak_metin -o çıktı_DBM

Seçenekler

-v
Çıktı daha ayrıntılı olur.
-f DBM_türü
Çıktı için kullanılacak DBM türü belirtilir. Belirtilmediği takdirde APR öntanımlısı kullanılır. Belirtilebilecek DBM türleri: GDBM dosyalar için GDBM SDBM dosyalar için SDBM Berkeley DB dosyalar için DB NDBM dosyalar için NDBM öntanımlı DBM türü için default
-i kaynak_metin
DBM dosyasının üretiminde kullanılacak girdi dosyası belirtilir. Bu dosya, her satırda bir kayıt bulunmak üzere her satırı şöyle biçemlenmiş olmalıdır: anahtar değer. Bu dosyanın biçemi ve manası ile ilgili ayrıntılar için RewriteMap yönergesinin açıklamasına bakınız.
-o çıktı_DBM
Çıktılanacak DBM dosyasının ismi belirtilir.

Örnekler

httxt2dbm -i rewritemap.txt -o rewritemap.dbm
httxt2dbm -f SDBM -i rewritemap.txt -o rewritemap.dbm

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


logresolve - Apache günlük dosyalarındaki IP adreslerini konak isimlerine dönüştürür - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

logresolve - Apache günlük dosyalarındaki IP adreslerini konak isimlerine dönüştürür

logresolve, Apache'nin erişim günlüklerindeki IP adreslerini çözümlemek için bir ardıl işlem uygulamasıdır. İsim sunucunuza bindirdiği yükü en aza indirmek için logresolve kendi arabelleğinde oluşturduğu eşleme tablosunu kullanır.

Apache günlük dosyasını standart girdisinden okur. IP adresleri günlük dosyası satırlarında ilk bileşen olmalı ve sonraki bileşenlerden bir boşluk ile ayrılmalıdır.

Kullanım

logresolve [ -s dosyaismi ] [ -c ] < günlük_dosyası > yeni_günlük_dosyası

Seçenekler

-s dosyaismi
İstatistiklerin kaydedileceği dosyanın ismi belirtilir.
-c
logresolve uygulamasının bazı DNS sorguları yapmasına sebep olur: IP adresine karşılık olan konak ismini bulduktan sonra özgün adresle karşılaştırmak için bu konak ismine karşılık gelen IP adresini sorgular.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


rotatelogs - Apache günlüklerini döndürmek için borulu günlük kayıt programı - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

rotatelogs - Apache günlüklerini döndürmek için borulu günlük kayıt programı

rotatelogs, Apache'nin borulu günlük dosyaları özelliği ile birlikte kullanmak için tasarlanmış basit bir programdır. Günlük dosyasının azami boyutuna göre veya belli aralıklarla günlük dosyalarını döndürür.

Kullanım

rotatelogs [ -l ] [ -f ] dosyaismi süre|boyutM [ saat_farkı ]

Seçenekler

-l
GMT yerine yerel zamanın kullanılmasını sağlar. Zaman dilimi değişik olan ortamlarda (BST, DST gibi) bu seçeneğin kullanımı beklenmedik sonuçlar verebilir!
-f
İlk günlük giridisinin okunmasını beklemeden rotatelogs başlar başlamaz günlük dosyasının açılmasını sağlar. Çok meşgul sitelerde, sunucu başlatılıp ilk istek sunuluncaya kadar geçen zamanda günlük dosyasının yokluğu özdevinimli işlemler yapan bazı günlükleme araçlarında sorunlara yol açabilir. Bu seçenek bu gibi durumlarda yararlıdır. 2.2.9 ve sonrası için geçerlidir.
dosyaismi

Günlük dosyasının ismi yoluyla birlikte belirtilir. dosyaismi '%' karakterleri içeriyorsa bunlar strftime(3) biçem belirteçleri olarak ele alınır. Aksi takdirde, özdevinimli olarak .nnnnnnnnnn uzantısı üretilir. Uzantı saniye cinsindendir ve her iki durumda da bu değer, mevcut döngü diliminin başlangıcına göre hesaplanır. Örneğin, döndürmenin 86400 saniyede bir yapılacağı belirtilmişse, strftime(3) biçeminde oluşturulan saat, dakika ve saniye alanları, 24 saatlik sürenin başlangıcını (geceyarısı) göstermek üzere sıfırlarla doldurulur.

strftime(3) dosya ismi biçimlemesini kullanırken, günlük dosyası biçiminin günlüğün her döndürülüşünde farklı bir dosya ismi üretecek ayrıntılara sahip olmasın sağlamalısınız. Aksi takdirde, döndürme işlemi sonucunda günlük yeni bir dosya yerine aynı dosyanın üzerine yazılacaktır. Örneğin, dosyaismi olarak /var/logs/errorlog.%Y-%m-%d belirtilmişse, günlük dosyası da 5 megabayta ulaşıyorsa, günlük döndürme ile aynı dosya ismi üretilir ve günlük aynı dosyaya yazılmaya devam ederek bu boyut ikiye katlanır.

süre
Günlük dosyasının yenisinin kaç saniyede bir açılacağı belirtilir. Örneğin, bu süre 3600 saniye ise günlük dosyası her saat başında yenilenir; 86400 saniye ise her geceyarısı yenilenir. (Bu süre zarfında günlüğe kaydedilecek bir olay gerçekleşmemişse dosya oluşturulmaz.)
boyutM
Boyuta göre döndürme için azami dosya boyutu. Belirtilenin bir süre değil de bir boyut değeri olarak ele alınması için değerin sonuna M (megabayt) harfi konmalıdır.

Süre ve boyut birlikte belirtilmişse boyut süreden sonra belirtilmelidir. Dosya yenilemesi, bunlardan hangisi daha önce aşılırsa o zaman gerçekleşir.

saat_farkı
Koordinatlı evrensel zamana göre "dakika" farkı. Belirtilmezse, sıfır öntanımlıdır. Örneğin, -5 saatlik bir zaman diliminde bulunuyorsanız bu değer -300 olmalıdır. Çoğu durumda, bunun yerine -l seçeneğini kullanmak gerekir.

Örnekler

CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common

nnnn, günlük kaydının başladığı sistem zamanı olmak üzere /var/logs/logfile.nnnn dosyası oluşturulur. Bu zaman, daima döngü süresinin katları olacağından bunu cron betiklerinizi eşzamanlamakta kullanabilirsiniz. Her döngü süresinin sonunda (burada 24 saat sonra) yeni bir günlük dosyası açılır.

CustomLog "|bin/rotatelogs -l /var/logs/logfile.%Y.%m.%d 86400" common

yyyy, yıl; mm, ay; dd, ayın gününü belirtmek üzere /var/logs/logfile.yyyy.mm.dd dosyası oluşturulur. Her gün yerel zamanla geceyarısı yeni bir günlük dosyasına geçilecektir.

CustomLog "|bin/rotatelogs /var/logs/logfile 5M" common

Günlük dosyası 5 megabaytlık olunca yenisinin oluşturulmasını sağlar.

ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M"

Hata günlüğünün 5 megabaytta bir errorlog.YYYY-mm-dd-HH_MM_SS biçemli bir isimle oluşturulmasını sağlar.

Taşınabilirlik

Aşağıdaki günlük dosyası biçem belirteçlerinin tüm strftime(3) gerçeklenimlerince desteklenmesi gerekir. Kullandığınız kütüphaneye özgü belirteçler için sisteminizdeki strftime(3) kılavuz sayfasına bakınız.

%A | tam gün ismi (yerelleştirilmiş)
%a | 3 harflik gün ismi (yerelleştirilmiş)
%B | tam ay ismi (yerelleştirilmiş)
%b | 3 harflik ay ismi (yerelleştirilmiş)
%c | tarih ve saat (yerelleştirilmiş)
%d | 2 haneli ay günü numarası
%H | 2 haneli saat (24 saatlik)
%I | 2 haneli saat (12 saatlik)
%j | 3 hanelik yıl günü numarası
%M | 2 haneli dakika
%m | 2 haneli ay
%p | 12 saatlik kip için öö/ös (yerelleştirilmiş)
%S | 2 haneli saniye
%U | 2 haneli yılın hafta numarası (Haftanın ilk gününün Pazar olduğu varsayımıyla)
%W | 2 haneli yılın hafta numarası (Haftanın ilk gününün Pazartesi olduğu varsayımıyla)
%w | 1 hanelik haftanın gün numarası (Haftanın ilk gününün Pazar olduğu varsayımıyla)
%X | saat (yerelleştirilmiş)
%x | tarih (yerelleştirilmiş)
%Y | 4 hanelik yıl
%y | 2 hanelik yıl
%Z | zaman dilimi ismi
%% | `%' iminin kendisi

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


suexec - harici programları çalıştırmadan önce kullanıcıyı değiştirir - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

suexec - harici programları çalıştırmadan önce kullanıcıyı değiştirir

suexec, CGI programlarını çalıştırmadan önce Apache HTTP Sunucusu tarafından kullanıcı değiştirmek için kullanılır. Bunu yapabilmek için sunucunun root tarafından çalıştırılmış olması gerekir. HTTP artalan süreci normalde root aidiyetinde çalışmadığından suexec'in çalıştırılabilir dosyasının sahibi root olmalı, setuid biti etkin (u+s) olmalı ve dosyaya root dışında hiç kimse yazamamalıdır.

suexec güvenlik modeli ve kavramlar hakkında bilgi edinmek için suexec belgesine (http://httpd.apache.org/docs/2.2/suexec.html) bakınız.

Kullanım

suexec -V

Seçenekler

-V
root iseniz, bu seçenek suexec derleme seçeneklerini gösterir. Güvenlik sebebiyle tüm yapılandırma seçenekleri sadece derleme sırasında değiştirilebilir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Diğer Programlar - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Programlar

Diğer Programlar

Aşağıdaki programlar Apache HTTP Sunucusu ile gelen basit destek programları olup kendilerine ait kılavuz sayfaları yoktur. Bunlar özdevinimli olarak kurulmazlar. Derleme işleminden sonra bunları support/ dizininde bulabilirsiniz.

log_server_status

Bu perl betiği cron gibi bir şeyleri belli aralıklarla çalıştırmak için tasarlanmıştır. Sunucuya bağlanıp durum bilgisini indirdikten sonra bunları tek bir satır haline getirip bir günlük dosyasına kaydeder. Sonuçların kaydedileceği günlük dosyasını betiğin başlangıcındaki değişkenlerde değişiklik yaparak belirtebilirsiniz.

split-logfile

Bu perl betiği sanal konaklı bir birleşik günlük dosyasını girdi olarak alır ve içeriğini ayrı dosyalara böler. Günlük dosyaları isimlendirilirken sanal konak isimlerinin sonlarına .log uzantısı getirilir. Günlük dosyasındaki her kaydın ilk bileşeninin, LogFormat yönergesinde "%v" belirteci ile ifade edilen sanal konak adı olduğu varsayılır.

Birleşik günlük dosyası standart girdiden okunur. Kayıtlar okundukça her biri kendi günlük dosyasına kaydedilir.

split-logfile < access_log

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Çeşitli Belgeler - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Çeşitli Belgeler

Aşağıda listelenen belgeler de Apache HTTP sunucusu geliştirme projesi kapsamındadır.

Uyarı

Aşağıdaki belgeler, Apache HTTP Sunucusunun 2.1 sürümünde yapılmış değişikliklere göre tam olarak güncellenmemiştir. Hala güncel kalmış bazı bilgiler olabilir, fakat siz yine de bu belgeleri kullanırken dikkatli olun.

Başarım Arttırma İpuçları - Apache’ye İnce Ayar Çekilmesi

Yüksek başarım elde etmek için Apache yapılandırmasında (çalışma anında ve derleme sırasında) yapılacaklar ile ilgili bazı bilgiler yanında Apache’de bazı şeylerin (bir şeyleri hızlandıran ve yavaşlatan şeylerin) yapılma ve yapılmama sebepleri açıklanmıştır.

Güvenlik İpuçları

Apache HTTP sitenizi güvenli kılmak için yapılacaklar ve yapılmayacaklar.

URL Yeniden Yazma Rehberi

Bu belge mod_rewrite modülünün başvuru belgesi yerine geçer. Site yöneticilerinin sıkça karşılaştıkları belli başlı URL temelli sorunları çözümlemek için Apache’nin mod_rewrite modülünün nasıl kullanılacağını açıklar.

İlgili Standartlar

Bu belge Apache’nin uyacağı standartların bir çoğuna atıfta bulunmak amacıyla hazırlanmıştır.

Parola Şifreleme Biçimleri

Belgede, kimlik doğrulama amacıyla Apache tarafından desteklenen çeşitli şifreleme tekniklerinden bahsedilmiştir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Apache’de Başarımın Arttırılması - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Çeşitli Belgeler

Apache’de Başarımın Arttırılması

Apache 2.x, esneklik, taşınabilirlik ve başarım arasında bir denge sağlamak üzere tasarlanmış genel amaçlı bir HTTP sunucusudur. Başka sunucularla kıyaslama denemelerinde öne geçmek üzere tasarlanmamış olsa da Apache 2.x gerçek yaşamda karşılaşılan pek çok durumda oldukça yüksek bir başarıma ulaşacak yetenektedir.

Apache 1.3 ile karşılaştırıldığında 2.x sürümleri toplam veri hızını ve ölçeklenebilirliği arttırmak için pek çok en iyileme seçeneği içerir. Bu iyileştirmelerin pek çoğu zaten öntanımlı olarak etkin olmakla birlikte derleme ve kullanım sırasında başarımı önemli ölçüde etkileyebilen yapılandırma seçenekleri de mevcuttur. Bu belgede, bir Apache 2.x kurulumunda sunucu yöneticisinin sunucunun başarımını arttırmak amacıyla yapılandırma sırasında neler yapabileceğinden bahsedilmiştir. Bu yapılandırma seçeneklerinden bazıları, httpd’nin donanımın ve işletim sisteminin olanaklarından daha iyi yararlanabilmesini sağlarken bir kısmı da daha hızlı bir sunum için yöneticinin işlevsellikten ödün verebilmesini olanaklı kılar.

Donanım ve İşletim Sistemi ile İlgili Konular

HTTP sunucusunun başarımını etkileyen en önemli donanım bellektir (RAM). Bir HTTP sunucusu asla takaslama yapmamalıdır. Çünkü takaslama, kullanıcının "yeterince hız" umduğu noktada sunumun gecikmesine sebep olur. Böyle bir durumda kullanıcılar yüklemeyi durdurup tekrar başlatma eğilimindedirler; sonuçta yük daha da artar. MaxClients yönergesinin değerini değiştirerek takaslamaya sebep olabilecek kadar çok çocuk süreç oluşturulmasını engelleyebilirsiniz ve böyle bir durumda bunu mutlaka yapmalısınız. Bunun için yapacağınız işlem basittir: top benzeri bir araç üzerinden çalışan süreçlerinizin bir listesini alıp Apache süreçlerinizin ortalama büyüklüğünü saptayıp, mevcut bellekten bir kısmını diğer süreçler için ayırdıktan sonra kalan miktarı bu değere bölerseniz yönergeye atayacağınız değeri bulmuş olursunuz.

Donanımın diğer unsurları için kararı siz verin: Daha hızlı işlemci, daha hızlı ağ kartı, daha hızlı disk; daha hızlının ne kadar hızlı olacağını deneyimlerinize bağlı olarak tamamen sizin ihtiyaçlarınız belirler.

İşletim sistemi seçimi büyük oranda yerel ilgi konusudur. Fakat yine de, genelde yararlılığı kanıtlanmış bazı kurallar bu seçimde size yardımcı olabilir:

  • Seçtiğiniz işletim sisteminin (çekirdeğin) en son kararlı sürümünü çalıştırın. Bir çok işletim sistemi, son yıllarda TCP yığıtları ve evre kütüphaneleri ile ilgili belirgin iyileştirmeler yapmışlar ve yapmaktadırlar.

  • İşletim sisteminiz sendfile(2) sistem çağrısını destekliyorsa bunun etkinleştirilebildiği sürümün kurulu olması önemlidir. (Örneğin, Linux için bu, Linux 2.4 ve sonraki sürümler anlamına gelirken, Solaris için Solaris 8’den önceki sürümlerin yamanması gerektirdiği anlamına gelmektedir.) sendfile işlevinin desteklendiği sistemlerde Apache 2 duruk içeriği daha hızlı teslim etmek ve işlemci kullanımını düşürmek amacıyla bu işlevselliği kullanacaktır.

Çalışma Anı Yapılandırması ile İlgili Konular

İlgili Modüller İlgili Yönergeler
  • mod_dir
  • mpm_common
  • mod_status
  • AllowOverride
  • DirectoryIndex
  • HostnameLookups
  • EnableMMAP
  • EnableSendfile
  • KeepAliveTimeout
  • MaxSpareServers
  • MinSpareServers
  • Options
  • StartServers

HostnameLookups ve DNS ile ilgili diğer konular

Apache 1.3 öncesinde, HostnameLookups yönergesinin öntanımlı değeri On idi. İstek yerine getirilmeden önce bir DNS sorgusu yapılmasını gerektirmesi sebebiyle bu ayarlama her istekte bir miktar gecikmeye sebep olurdu. Apache 1.3’ten itibaren yönergenin öntanımlı değeri Off yapılmıştır. Eğer günlük dosyalarınızda konak isimlerinin bulunmasını isterseniz, Apache ile birlikte gelen logresolve programını kullanabileceğiniz gibi günlük raporlarını çözümleyen Apache ile gelmeyen programlardan herhangi birini de kullanabilirsiniz.

Günlük dosyaları üzerindeki bu işlemi sunucu makinesi dışında günlük dosyasının bir kopyası üzerinde yapmanızı öneririz. Aksi takdirde sunucunuzun başarımı önemli ölçüde etkilenebilir.

Allow veya Deny yönergelerinde IP adresi yerine bir konak veya alan ismi belirtirseniz, iki DNS sorguluk bir bedel ödersiniz (biri normal, diğeri IP taklidine karşı ters DNS sorgusu). Başarımı en iyilemek için bu yönergelerde mümkün olduğunca isim yerine IP adreslerini kullanınız.

HostnameLookups yönergelerinin <Location /server-status> gibi bölüm yönergelerinin içinde de yer alabileceğini unutmayın. Bu gibi durumlarda DNS sorguları sadece istek kuralla eşleştiği takdirde yapılacaktır. Aşağıdaki örnekte .html ve .cgi dosyalarına yapılan istekler hariç DNS sorguları iptal edilmektedir:

HostnameLookups off
<Files ~ "\.(html|cgi)$">
HostnameLookups on
 </Files>

Yine de bazı CGI’lerin DNS isimlerine ihtiyacı olursa bu CGI’lerin bu ihtiyaçlarına yönelik olarak gethostbyname çağrıları yapabileceğini gözardı etmeyiniz.

FollowSymLinks ve SymLinksIfOwnerMatch

URL uzayınızda geçerli olmak üzere bir Options FollowSymLinks yoksa veya Options SymLinksIfOwnerMatch yönergeleri varsa, Apache her sembolik bağın üzerinde bazı sınamalar yapmak için ek bir sistem çağrısından başka istenen her dosya için de ayrı bir çağrı yapacaktır.

Örnek:

DocumentRoot /siteler/htdocs
<Directory />
Options SymLinksIfOwnerMatch
 </Directory>

Bu durumda /index.html için bir istek yapıldığında Apache, /siteler, /siteler/htdocs ve
/siteler/htdocs/index.html üzerinde lstat(2) çağrıları yapacaktır. lstat sonuçları önbelleğe kaydedilmediğinden bu işlem her istekte yinelenecektir. Amacınız gerçekten sembolik bağları güvenlik açısından sınamaksa bunu şöyle yapabilirsiniz:

DocumentRoot /siteler/htdocs
<Directory />
Options FollowSymLinks
 </Directory>

<Directory /sitem/htdocs>
Options -FollowSymLinks +SymLinksIfOwnerMatch
 </Directory>

Böylece DocumentRoot altındaki dosyalar için fazladan bir çağrı yapılmasını engellemiş olursunuz. Eğer bazı bölümlerde Alias, RewriteRule gibi yönergeler üzerinden belge kök dizininizin dışında kalan dosya yollarına sahipseniz benzer işlemleri onlar için de yapmalısınız. Sembolik bağ koruması yapmamak suretiyle başarımı arttırmak isterseniz, FollowSymLinks seçeneğini her yerde etkin kılın ve SymLinksIfOwnerMatch seçeneğini asla etkinleştirmeyin.

AllowOverride

Genellikle .htaccess dosyaları üzerinden yapıldığı gibi URL uzayınızda geçersizleştirmelere izin veriyorsanız, Apache her dosya bileşeni için bu .htaccess dosyalarını açmaya çalışacaktır.

Örnek:

DocumentRoot /siteler/htdocs
<Directory />
AllowOverride all
 </Directory>

Bu durumda /index.html sayfasına yapılan bir istek için Apache, /.htaccess, /siteler/.htaccess ve /siteler/htdocs/.htaccess dosyalarını açmaya çalışacaktır. Çözüm Options FollowSymLinks durumunun benzeridir; başarımı arttırmak için dosya sisteminizin her yerinde AllowOverride None olsun.

Dil Uzlaşımı

Başarımı son kırıntısına kadar arttırmak istiyorsanız, mümkünse içerik dili uzlaşımı da yapmayın. Dil uzlaşımından yararlanmak isterken büyük başarım kayıplarına uğrayabilirsiniz. Böyle bir durumda sunucunun başarımını arttırmanın tek bir yolu vardır.

DirectoryIndex index

Yukarıdaki gibi bir dosya ismi kalıbı kullanmak yerine, aşağıdaki gibi seçenekleri tam bir liste halinde belirtin:

DirectoryIndex index.cgi index.pl index.shtml index.html

Buradaki sıralama öncelik sırasını belirler; yani, öncelikli olmasını istediğiniz seçeneği listenin başına yazmalısınız.

İstenen dosya için MultiViews kullanarak dizini taratmak yerine, gerekli bilgiyi tek bir dosyadan okutmak suretiyle başarımı arttırabilirsiniz. Bu amaçla türeşlem (type-map) dosyaları kullanmanız yeterli olacaktır.

Sitenizde içerik dili uzlaşımına gerek varsa, bunu Options MultiViews yönergesi üzerinden değil, türeşlem dosyaları kullanarak yapmayı deneyin. İçerik dili uzlaşımı ve türeşlem dosyalarının oluşturulması hakkında daha ayrıntılı bilgi edinmek için İçerik Uzlaşımı belgesine bakınız.

Bellek Eşlemleri

Apache’nin SSI sayfalarında olduğu gibi teslim edilecek dosyanın içeriğine bakma gereği duyduğu durumlarda, eğer işletim sistemi mmap(2) ve benzerlerini destekliyorsa çekirdek normal olarak dosyayı belleğe kopyalayacaktır.

Bazı platformlarda bu belleğe eşleme işlemi başarımı arttırsa da başarımın veya httpd kararlılığının zora girdiği durumlar olabilmektedir:

  • Bazı işletim sistemlerinde işlemci sayısı artışına bağlı olarak, mmap işlevi read(2) kadar iyi ölçeklenmemiştir. Örneğin, çok işlemcili Solaris sunucularda mmap iptal edildiği takdirde içeriği sunucu tarafından işlenen dosyalar üzerinde bazen daha hızlı işlem yapılabilmektedir.

  • Belleğe kopyalanacak dosya NFS üzerinden bağlanan bir dosya sistemindeyse ve dosya başka bir NFS istemcisi makine tarafından silinmiş veya dosyanın boyutu değiştirilmişse sunucunuz dosyaya tekrar erişmeye çalıştığında bir hata alabilecektir.

Böyle durumların olasılık dahilinde olduğu kurulumlarda içeriği sunucu tarafından işlenecek dosyaların belleğe kopyalanmaması için yapılandırmanıza EnableMMAP off satırını ekleyiniz. (Dikkat: Bu yönerge dizin seviyesinde geçersizleştirilebilen yönergelerdendir.)

sendfile

Apache’nin duruk dosyalarda olduğu gibi teslim edilecek dosyanın içeriğine bakmadığı durumlarda, eğer işletim sistemi sendfile(2) desteğine sahipse çekirdek normal olarak bu desteği kullanacaktır.

Bazı platformlarda sendfile kullanımı, okuma ve yazma işlemlerinin ayrı ayrı yapılmamasını sağlasa da sendfile kullanımının httpd kararlılığını bozduğu bazı durumlar sözkonusudur:

  • Bazı platformlar derleme sisteminin saptayamadığı bozuk bir sendfile desteğine sahip olabilir. Özellikle derleme işleminin başka bir platformda yapılıp sendfile desteği bozuk bir makineye kurulum yapıldığı durumlarda bu desteğin bozuk olduğu saptanamayacaktır.

  • Çekirdek, NFS üzerinden erişilen ağ dosyalarını kendi önbelleği üzerinden gerektiği gibi sunamayabilir.

Böyle durumların olasılık dahilinde olduğu kurulumlarda içeriğin sendfile desteğiyle teslim edilmemesi için yapılandırmanıza EnableSendfile off satırını ekleyiniz. (Dikkat: Bu yönerge dizin seviyesinde geçersizleştirilebilen yönergelerdendir.)

Süreç Oluşturma

Apache 1.3 öncesinde MinSpareServers, MaxSpareServers ve StartServers ayarları, başka sunucularla kıyaslama denemelerinde olağanüstü kötü sonuçlar alınmasına sebep olmaktaydı. Özellikle uygulanan yükü karşılamaya yetecek sayıda çocuk süreç oluşturulması aşamasında Apache’nin elde ettiği ivme bunlardan biriydi. Başlangıçta StartServers yönergesiyle belli sayıda süreç oluşturulduktan sonra her saniyede bir tane olmak üzere MinSpareServers sayıda çocuk süreç oluşturulmaktaydı. Örneğin, aynı anda 100 isteğe yanıt vermek için StartServers yönergesinin öntanımlı değeri olarak başta 5 süreç oluşturulduğundan kalan süreçler için 95 saniye geçmesi gerekirdi. Sık sık yeniden başlatılmadıklarından dolayı gerçek hayatta sunucuların başına gelen de buydu. Başka sunucularla kıyaslama denemelerinde ise işlem sadece on dakika sürmekte ve içler acısı sonuçlar alınmaktaydı.

Saniyede bir kuralı, sunucunun yeni çocukları oluşturması sırasında sistemin aşırı meşgul duruma düşmemesi için alınmış bir önlemdi. Makine çocuk süreç oluşturmakla meşgul edildiği sürece isteklere yanıt veremeyecektir. Böylesi bir durum Apache’nin başarımını kötüleştirmekten başka işe yaramayacaktır. Apache 1.3’te saniyede bir kuralı biraz esnetildi. Yeni gerçeklenimde artık bir süreç oluşturduktan bir saniye sonra iki süreç, bir saniye sonra dört süreç oluşturulmakta ve işlem, saniyede 32 çocuk süreç oluşturulur duruma gelene kadar böyle ivmelenmektedir. Çocuk süreç oluşturma işlemi MinSpareServers değerine ulaşılınca durmaktadır.

Bu, MinSpareServers, MaxSpareServers ve StartServers ayarlarıyla oynamayı neredeyse gereksiz kılacak kadar iyi sonuçlar verecek gibi görünmektedir. Saniyede 4 çocuktan fazlası oluşturulmaya başlandığında hata günlüğüne bazı iletiler düşmeye başlar. Bu iletilerin sayısı çok artarsa bu ayarlarla oynama vakti gelmiş demektir. Bunun için mod_status çıktısını bir kılavuz olarak kullanabilirsiniz.

Süreç oluşturmayla ilgili olarak süreç ölümü MaxRequestsPerChild değeri ile sağlanır. Bu değer öntanımlı olarak 0 olup, çocuk süreç başına istek sayısının sınırsız olduğu anlamına gelir. Eğer yapılandırmanızda bu değeri 30 gibi çok düşük bir değere ayarlarsanız bunu hemen kaldırmak zorunda kalabilirsiniz. Sunucunuzu SunOS veya Solaris’in eski bir sürümü üzerinde çalıştırıyorsanız bellek kaçaklarına sebep olmamak için bu değeri 10000 ile sınırlayınız.

Kalıcı bağlantı özelliğini kullanıyorsanız, çocuk süreçler zaten açık bağlantılardan istek beklemekte olacaklardır. KeepAliveTimeout yönergesinin öntanımlı değeri 5 saniye olup bu etkiyi en aza indirmeye yönelik süredir. Burada ağ band genişliği ile sunucu kaynaklarının kullanımı arasında bir seçim yapmak söz konusudur. Hiçbir şey umurunuzda değilse çoğu ayrıcalığın yitirilmesi pahasına bu değeri rahatça 60 saniyenin üzerine çıkarabilirsiniz.

Derleme Sırasında Yapılandırma ile İlgili Konular

MPM Seçimi

Apache 2.x, Çok Süreçlilik Modülleri (MPM) adı verilen eklemlenebilir çok görevlilik modellerini destekler. Apache’yi derlerken bu MPM’lerden birini seçmeniz gerekir. MPM’lerden bazıları platformlara özeldir: beos, mpm_netware, mpmt_os2 ve mpm_winnt. Unix benzeri sistemler için ise seçebileceğiniz modül sayısı birden fazladır. MPM seçiminin httpd’nin hızında ve ölçeklenebilirliğinde bazı etkileri olabilir:

  • worker modülü her biri çok evreli çok sayıda çocuk süreç kullanımını destekler. Her evre aynı anda tek bir bağlantıya hizmet sunar. Aynı hizmeti daha az bellek harcayarak vermesi nedeniyle yüksek trafiğe sahip sunucularda prefork modülüne göre daha iyi bir seçimdir.
  • prefork modülü her biri tek bir evreye sahip çok sayıda çocuk süreç kullanımını destekler. Her süreç aynı anda tek bir bağlantıya hizmet sunar. Çoğu sistemde daha hızlı olması nedeniyle worker modülüne göre daha iyi bir seçim olarak görünürse de bunu daha fazla bellek kullanarak sağlar. prefork modülünün evresiz tasarımının worker modülüne göre bazı yararlı tarafları vardır: Çok evreli sistemlerde güvenilir olmayan üçüncü parti modülleri kullanabilir ve evrelerde hata ayıklamanın yetersiz kaldığı platformlarda hatalarını ayıklamak daha kolaydır.

Bu modüller ve diğerleri hakkında daha ayrıntılı bilgi edinmek için Çok Süreçlilik Modülleri belgesine bakınız.

Modüller

Bellek kullanımı başarım konusunda önemli olduğundan gerçekte kullanmadığınız modülleri elemeye çalışmalısınız. Modülleri birer DSO olarak derlediyseniz LoadModule yönergesinin bulunduğu satırı açıklama haline getirmeniz modülden kurtulmanız için yeterli olacaktır. Modülleri bu şekilde kaldırarak onların yokluğunda sitenizin hala işlevlerini yerine getirdiğini görme şansına da kavuşmuş olursunuz.

Ancak, eğer modülleri Apache çalıştırılabilirinin içine gömmüşseniz istenmeyen modülleri kaldırmak için Apache'yi yeniden derlemeniz gerekir.

Bu noktada bir soru akla gelebilir: Hangi modüller gerekli, hangileri değil? Bu sorunun yanıtı şüphesiz siteden siteye değişir. Ancak, olmazsa olmaz moüller olarak mod_mime, mod_dir ve mod_log_config modüllerini sayabiliriz. Bunlardan mod_log_config olmadan da bir sitenin çalışabileceğinden hareketle bu modülün varlığı isteğe bağlı olsa da bu modülü kaldırmanızı önermiyoruz.

Atomik İşlemler

Worker MPM'nin en son geliştirme sürümleri ve mod_cache gibi bazı modüller APR'nin atomik API'sini kullanırlar. Bu API, düşük ayarlı evre eşzamanlamasında atomik işlemler yapar.

Öntanımlı olarak, APR bu işlemleri hedef işletim sistemi/işlemci platformunda kullanılabilecek en verimli mekanizmayı kullanarak gerçekleştirir. Günümüz işlemcilerinin çoğu, örneğin, bir atomik karşılaştırma ve takas (CAS) işlemini donanımda gerçekleştirmektedir. Bazı platformlarda APR'nin atomik işlemler için öntanımlı olarak daha yavaş olan mutekslere dayalı gerçeklenimi kullanmasının sebebi eski işlemcilerde bu tür makine kodlarının yokluğudur. Apache'yi bu tür platformalarda günümüz işlemcileriyde çalıştırmayı düşünüyorsanız Apache'yi derlemek için yapılandırırken en hızlı atomik işlemin seçilebilmesi için --enable-nonportable-atomics seçeneğini kullanın:

./buildconf
./configure --with-mpm=worker --enable-nonportable-atomics=yes

--enable-nonportable-atomics seçeneği şu platformlar için uygundur:

  • SPARC üzerinde Solaris
    APR öntanımlı olarak, SPARC/Solaris üzerinde mutekslere dayalı atomik işlemleri kullanır. Ancak, --enable-nonportable-atomics yapılandırmasını kullanırsanız, donanım üzerinde hızlı karşılaştırma ve takas için uygun SPARC v8plus kodunu kullanacak şekilde kod üretilir. Apache'yi bu seçenekle yapılandırırsanız atomik işlemler daha verimli olacak fakat derlenen Apache çalıştırılabiliri sadece UltraSPARC kırmığı üzerinde çalışacaktır.
  • x86 üzerinde Linux
    APR öntanımlı olarak, Linux üzerinde mutekslere dayalı atomik işlemleri kullanır. Ancak, --enable-nonportable-atomics yapılandırmasını kullanırsanız, donanım üzerinde hızlı karşılaştırma ve takas için uygun 486 kodunu kullanacak şekilde kod üretilir. Apache'yi bu seçenekle yapılandırırsanız atomik işlemler daha verimli olacak fakat derlenen Apache çalıştırılabiliri (386 üzerinde değil) sadece 486 ve sonrası kırmıklarda çalışacaktır.

mod_status ve ExtendedStatus On

mod_status modülünü derlemiş ve Apache'yi yapılandırır ve çalıştırırken ExtendedStatus On satırını da kullanmışsanız Apache her istek üzerinde gettimeofday(2) (veya işletim sistemine bağlı olarak time(2)) çağrısından başka (1.3 öncesinde) fazladan defalarca time(2) çağrıları yapacaktır. Bu çağrılarla durum raporununun zamanlama bilgilerini içermesi sağlanır. Başarımı arttırmak için ExtendedStatus off yapın (zaten öntanımlı böyledir).

accept dizgilemesi ve çok soketli işlem

Uyarı:

Bu bölüm, Apache HTTP sunucusunun 2.x sürümlerinde yapılan değişikliklere göre tamamen güncellenmemiştir. Bazı bilgiler hala geçerliyse de lütfen dikkatli kullanınız.

Burada Unix soket arayüzü gerçeklenirken ihmal edilen bir durumdan bahsedeceğiz. HTTP sunucunuzun çok sayıda adresten çok sayıda portu dinlemek için çok sayıda Listen yönergesi kullanmakta olduğunu varsayalım. Her soketi çalıştığını görmek için denerken Apache bağlantı için select(2) kullanacaktır. select(2) çağrısı bu soketin üzerinde sıfır veya en azından bir bağlantının beklemekte olduğu anlamına gelir. Apache'nin modeli çok sayıda çocuk süreç içerir ve boşta olanların tümünde aynı anda yeni bağlantılar denenebilir. Gerçekte çalışan kod bu olmasa da meramımızı anlatmak için kodun şöyle bir şey olduğunu varsayabiliriz:

for (;;) {
for (;;) {
fd_set accept_fds;

FD_ZERO (&accept_fds);
for (i = first_socket; i <= last_socket; ++i) {
FD_SET (i, &accept_fds);
 }
rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
if (rc < 1) continue;
new_connection = -1;
for (i = first_socket; i <= last_socket; ++i) {
if (FD_ISSET (i, &accept_fds)) {
new_connection = accept (i, NULL, NULL);
if (new_connection != -1) break;
 }
 }
if (new_connection != -1) break;
 }
process the new_connection;
 }

Bu özet gerçeklenim bir takım açlık sorunlarına sebep olur. Bu döngünün çalışması sırasında aynı anda çok sayıda çocuk süreç yeniden çağrılır ve istekler arasında kalan çoğu çocuk da select ile engellenir. Engellenen tüm bu çocuklar soketlerden herhangi biri üzerinde tek bir istek göründüğünde select tarafından uyandırılıp işleme sokulmak üzere döndürülürler (uyandırılan çocuk sayısı işletim sistemine ve zamanlama ayarlarına göre değişiklik gösterir). Bunların hepsi döngüye katılıp bağlantı kabul etmeye (accept) çalışırlar. Fakat içlerinden yalnız biri (sadece bir bağlantı isteğinin mevcut olduğu varsayımıyla) bunu başarabilir. Kalanının bağlantı kabul etmesi (accept) engellenir. Bu durum, bu çocukları istekleri başka başka soketlerden değil mecburen tek bir soketten kabul etmeye kilitler ve bu soket üzerinde yeni bir istek belirip uyandırılana kadar bu durumda kalırlar. Bu açlık sorunu ilk olarak PR#467 sayılı raporla belgelenmiştir. Bu sorunun en az iki çözümü vardır.

Çözümün biri engellenmeyen soket kullanımıdır. Bu durumda accept çocukları engellemeyecek ve yapılan bir bağlantının ardından diğer çocuklar durumları değişmeksizin bağlantı beklemeye devam edeceklerdir. Fakat bu durum işlemci zamanının boşa harcanmasına sebep olur. Seçilmiş (select) boşta on çocuğun olduğunu ve bir bağlantı geldiğini varsayalım. Kalan dokuz çocuk işine devam edip bağlantı kabul etmeyi (accept) deneyecek, başarızsız olacak, dönecek başa, tekrar seçilecek (select) ve böyle hiçbir iş yapmadan dönüp duracaktır. Bu arada hizmet sunmakta olanlar da işlerini bitirdikten sonra bu döngüdeki yerlerini alacaklardır. Aynı kutunun içinde boşta bir sürü işlemciniz (çok işlemcili sistemler) yoksa bu çözüm pek verimli olmayacaktır.

Diğer çözüm ise Apache tarafından kullanılan çözüm olup, girdiyi bir iç döngüde sıraya sokmaktır. Döngü aşağıda örneklenmiştir (farklar vurgulanmıştır):

for (;;) {
accept_mutex_on ();
for (;;) {
fd_set accept_fds;

FD_ZERO (&accept_fds);
for (i = first_socket; i <= last_socket; ++i) {
FD_SET (i, &accept_fds);
 }
rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
if (rc < 1) continue;
new_connection = -1;
for (i = first_socket; i <= last_socket; ++i) {
if (FD_ISSET (i, &accept_fds)) {
new_connection = accept (i, NULL, NULL);
if (new_connection != -1) break;
 }
 }
if (new_connection != -1) break;
 }
accept_mutex_off ();
process the new_connection;
 }

accept_mutex_on ve accept_mutex_off işlevleri bir karşılıklı red semoforu oluştururlar. Mutekse aynı anda sadece bir çocuk sahip olabilir. Bu muteksleri gerçeklemek için çeşitli seçenekler vardır. Seçim, src/conf.h (1.3 öncesi) veya src/include/ap_config.h (1.3 ve sonrası) dosyasında tanımlanmıştır. Bazı mimariler bir kilitleme seçeneğine sahip değildir. Böyle mimarilerde çok sayıda Listen yönergesi kullanmak güvenilir olmayacaktır.

AcceptMutex yönergesi, seçilen muteks gerçeklenimini çalışma anında değiştirmek için kullanılabilir.

AcceptMutex flock

Bu yöntem, bir kilit dosyasını kilitlemek için flock(2) sistem çağrısını kullanır (Kilit dosyasının yeri LockFile yönergesiyle belirtilir).

AcceptMutex fcntl

Bu yöntem, bir kilit dosyasını kilitlemek için fcntl(2) sistem çağrısını kullanır (Kilit dosyasının yeri LockFile yönergesiyle belirtilir).

AcceptMutex sysvsem

(1.3 ve sonrası) Bu yöntem muteksi gerçeklemek için SysV tarzı semaforları kullanır. Maalesef, SysV tarzı semaforların bazı yan etkileri vardır. Bunlardan biri Apache'nin semaforu temizlemeden ölme ihtimalidir (ipcs(8) kılavuz sayfasına bakınız). Diğer biri, CGI'lerin sunucu ile aynı kullanıcı kimliğini kullanmaları nedeniyle semafor arayüzünün hizmet reddi saldırılarına açık olmasıdır (suexec veya cgiwrapper gibi bir şeyler kullanmadıkça bütün CGI'ler için söz konusudur). Bu sebeple bu yöntem IRIX haricinde hiçbir mimaride kullanılmaz (önceki ikisi çoğu IRIX makine için elde edilmesi imkansız derecede pahalı olduğundan).

AcceptMutex pthread

(1.3 ve sonrası) Bu yöntem POSIX mutekslerini kullanır ve POSIX evreleri belirtiminin tamamen gerçeklendiği mimarilerde çalışması gerekirse de sadece Solaris (2.5 ve sonrası) üzerinde ve sadece belli yapılandırmalarla çalışmakta gibi görünmektedir. Bunu denemişseniz sunucunuzun çöktüğünü ve yanıt vermediğini görmüşsünüzdür. Sadece duruk içerikli sunucular iyi çalışmaktadır.

AcceptMutex posixsem

(2.0 ve sonrası) Bu yöntem POSIX semaforlarını kullanır. Eğer işlem sırasında bir evre muteks kaynaklı parçalama arızalarıyla karşı karşıya kalırsa HTTP sunucusunun çökmesiyle semaforun sahibi kurtarılamaz.

Eğer sisteminiz yukarıda bahsedilenler dışında başka bir dizgileme yöntemi kullanıyorsa bununla ilgili kodun APR'ye eklenmesi girilen zahmete değecektir.

Başka bir çözüm daha vardır ancak döngü kısmen dizgilenmeyeceğinden (yani belli sayıda sürece izin verilemeyeceğinden) asla gerçeklenmemiştir. Bu sadece, aynı anda çok sayıda çocuk sürecin çalışabileceği ve dolayısıyla band genişliğinin tüm yönleriyle kullanılabileceği çok işlemcili sistemlerde ilginç olabilirdi. Bu gelecekte incelenmeye değer bir konu olmakla beraber çok sayıda HTTP sunucusunun aynı anda aynı amaca hizmet edecek şekilde çalışması standart olarak pek mümkün görülmediğinden bu olasılık çok düşüktür.

En yüksek başarımı elde etmek için ideal olanı sunucuları çalıştırırken çok sayıda Listen yönergesi kullanmamaktır. Fakat siz yine de okumaya devam edin.

accept dizgilemesi - tek soket

Çok soketli sunucular için yukarıda açıklananlar iyi güzel de tek soketli sunucularda durum ne? Kuramsal olarak, bunların hiçbiriyle bir sorunları olmaması gerekir. Çünkü yeni bir bağlantı gelene kadar tüm çocuklar accept(2) ile engellenirler dolayısıyla hiçbir açlık sorununun ortaya çıkmaması gerekir. Uygulamada ise son kullanıcıdan gizli olarak, yukarıda engellenmeyen çocuklar çözümünde bahsedilenle hemen hemen aynı "boşa dönüp durma" davranışı mevcuttur. Çoğu TCP yığıtı bu yolu gerçeklemiştir. Çekirdek, yeni bir bağlantı ortaya çıktığında accept ile engellenen tüm süreçleri uyandırır. Bu süreçlerden bağlantıyı alan kullanıcı bölgesine geçerken çekirdek içinde döngüde olan diğerleri de yeni bağlantı keşfedilene kadar uykularına geri dönerler. Bu çekirdek içi döngü, kullanıcı bölgesindeki kodlara görünür değildir ama bu olmadıkları anlamına gelmez. Bu durum, çok soketli engellenmeyen çocuklar çözümündeki boşa döngünün sebep olduğu gereksiz işlemci yükü sorununu içinde barındırır.

Bununla birlikte, tek soketli durumda bile bundan daha verimli bir davranış sergileyen bir çok mimari bulduk. Bu aslında hemen hemen her durumda öntanımlı olarak böyledir. Linux altında yapılan üstünkörü denemelerde (128MB bellekli çift Pentium pro 166 işlemcili makinede Linux 2.0.30) tek sokette dizgilemenin dizgilenmemiş duruma göre saniyede %3 daha az istekle sonuçlandığı gösterilmiştir. Fakat dizgilenmemiş tek soket durumunda her istekte 100ms'lik ek bir gecikme olduğu görülmüştür. Bu gecikmenin sebebi muhtemelen uzun mesafeli hatlar olup sadece yerel ağlarda söz konusudur. Tek soketli dizgilemeyi geçersiz kılmak için SINGLE_LISTEN_UNSERIALIZED_ACCEPT tanımlarsanız tek soketli sunucularda artık dizgileme yapılmayacaktır.

Kapatmayı zamana yaymak

draft-ietf-http-connection-00.txt taslağının 8. bölümünde bahsedildiği gibi, bir HTTP sunucusunun protokolü güvenilir şekilde gerçeklemesi için her iki yöndeki iletişimi birbirinden bağımsız olarak (iki yönlü bir TCP bağlantısının her yarısını diğerinden bağımsız olarak) kapatması gerekir. Bu olgu başka sunucular tarafından çoğunlukla dikkate alınmaz fakat Apache'nin 1.2 sürümünden beri gerektiği gibi gerçeklenmektedir.

Bu özellik Apache'ye eklendiğinde Unix'in çeşitli sürümlerinde uzgörüsüzlükten dolayı bir takım geçici telaş sorunlarına sebep oldu. TCP belirtimi FIN_WAIT_2 durumunda bir zaman aşımından bahsetmez ama yasaklamaz da. Zaman aşımı olmayan sistemlerde, Apache 1.2 çoğu soketin sonsuza kadar FIN_WAIT_2 durumunda takılıp kalmasına sebep olur. Çoğu durumda, satıcıdan sağlanan en son TCP/IP yamalarını uygulanarak bu önlenebilir. Satıcının hiçbir yeni yama dağıtmadığı durumlarda (örneğin, SunOS4 -- bir kaynak lisansı ile insanlar bunu kendileri yamayabilirse de) bu özelliği devre dışı bırakmaya karar verdik.

Bunun üstesinden gelmenin iki yolu vardır. Bunlardan biri SO_LINGER soket seçeneğidir. Bu işin kaderi buymuş gibi görünürse de çoğu TCP/IP yığıtında bu gerektiği gibi gerçeklenmemiştir. Bu yığıtlar üzerinde, bu yöntemin, doğru bir gerçeklenimle bile (örneğin, Linux 2.0.31) sonraki çözümden daha pahalı olduğu ortaya çıkmıştır.

Çoğunlukla, Apache bunu (http_main.c içindeki) lingering_close adında bir işlevle gerçekler. Bu işlev kabaca şöyle görünür:

void lingering_close (int s)
{
char junk_buffer[2048];

/* gönderen tarafı kapat */
shutdown (s, 1);

signal (SIGALRM, lingering_death);
alarm (30);

for (;;) {
/* s'i okumak için, 2 saniyelik zaman aşımı ile seç */
select (s for reading, 2 second timeout);
/* Hata oluşmuşsa döngüden çık */
if (error) break;
/* s okumak için hazırsa */
if (s is ready for reading) {
if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
break;
 }
/* geri kalan herşey burada */
 }
 }

close (s);
 }

Bağlantı sonunda bu doğal olarak biraz daha masrafa yol açar, fakat güvenilir bir gerçeklenim için bu gereklidir. HTTP/1.1'in daha yaygın kullanılmaya başlanması ve tüm bağlantıların kalıcı hale gelmesiyle bu gerçeklenim daha fazla istek üzerinden kendi masrafını karşılayacaktır. Ateşle oynamak ve bu özelliği devre dışı bırakmak isterseniz NO_LINGCLOSE'u tanımlayabilirsiniz, fakat bu asla önerilmez. Özellikle, HTTP/1.1'den itibaren boruhatlı kalıcı bağlantıların lingering_close kullanmaya başlaması mutlak bir gerekliliktir (ve boruhatlı bağlantıların daha hızlı olması nedeniyle bu bağlantıları desteklemek isteyebilirsiniz).

Çetele Dosyası

Apache'nin ana ve alt süreçleri birbirleriyle çetele denen birşey üzerinden haberleşirler. Bunun en mükemmel şekilde paylaşımlı bellekte gerçeklenmesi gerekir. Eriştiğimiz veya portlarını ayrıntılı olarak belirttiğimiz işletim sistemleri için bu, genellikle paylaşımlı bellek kullanılarak gerçeklenir. Geri kalanlar, öntanımlı olarak bunu bir disk dosyası kullanarak gerçekler. Bir disk dosyaı yavaş olmanın yanı sıra güvenilir de değildir (ve daha az özelliğe sahiptir). Mimarinizin src/main/conf.h dosyasını inceleyin ve USE_MMAP_SCOREBOARD veya USE_SHMGET_SCOREBOARD'a bakın. Bu ikisinden birinin (ve yanı sıra sırasıyla HAVE_MMAP veya HAVE_SHMGET'in) tanımlanmış olması, sağlanan paylaşımlı bellek kodunu etkinleştirir. Eğer sisteminiz diğer türdeki paylaşımlı belleğe sahipse, src/main/http_main.c dosyasını açıp, Apache'de bu belleği kullanması gereken kanca işlevleri ekleyin (Bize de bir yama yollayın, lütfen).

Tarihsel bilgi: Apache'nin Linux uyarlaması, Apache'nin 1.2 sürümüne kadar paylaşımlı belleği kullanmaya başlamamıştı. Bu kusur, Apache'nin Linux üzerindeki erken dönem sürümlerinin davranışlarının zayıf ve güvenilmez olmasına yol açmıştı.

DYNAMIC_MODULE_LIMIT

Devingen olarak yüklenen modülleri kullanmamak niyetindeyseniz (burayı okuyan ve sunucunuzun başarımını son kırıntısına kadar arttırmakla ilgilenen biriyseniz bunu düşünmezsiniz), sunucunuzu derlerken seçenekler arasına -DDYNAMIC_MODULE_LIMIT=0 seçeneğini de ekleyin. Bu suretle, sadece, devingen olarak yüklenen modüller için ayrılacak belleği kazanmış olacaksınız.

Ek: Bir çağrı izlemesinin ayrıntılı çözümlemesi

Burada, Solaris 8 üzerinde worker MPM'li Apache 2.0.38'in bir sistem çağrısı izlenmektedir. Bu izleme şu komutla elde edilmiştir:

truss -l -p httpd_çocuk_pidi.

-l seçeneği, truss'a hafif bir sürecin yaptığı her sistem çağrısını (hafif süreç -- HS -- Solaris'in bir çekirdek seviyesi evreleme biçimi) günlüğe yazmasını söyler.

Diğer sistemlerin sistem çağrılarını izleyen farklı araçları vardır (strace, ktrace, par gibi). Bunlar da benzer çıktılar üretirler.

Bu izleme sırasında, bir istemci httpd'den 10 KB'lık duruk bir dosya talebinde bulunmuştur. Duruk olmayan veya içerik uzlaşımlı isteklerin izleme kayıtları vahşice (bazı durumlarda epey çirkince) farklı görünür.

/67: accept(3, 0x00200BEC, 0x00200C0C, 1) (uykuda...)
/67: accept(3, 0x00200BEC, 0x00200C0C, 1) = 9

Bu izlemede, dinleyen evre HS #67 içinde çalışmaktadır.

accept(2) dizgelemesinin olmayışına dikkat edin. Özellikle bu platformda worker MPM, çok sayıda portu dinlemedikçe, öntanımlı olarak dizgeleştirilmemiş bir accept çağrısı kullanır.

/65: lwp_park(0x00000000, 0) = 0
/67: lwp_unpark(65, 1) = 0

Bağlantının kabul edilmesiyle, dinleyici evre isteği yerine getirmek üzere bir worker evresini uyandırır. Bu izlemede, isteği yerine getiren worker evresi HS #65'e aittir.

/65: getsockname(9, 0x00200BA4, 0x00200BC4, 1) = 0

Sanal konakların gerçeklenimi sırasında, Apache'nin, bağlantıları kabul etmek için kullanılan yerel soket adreslerini bilmesi gerekir. Çoğu durumda bu çağrıyı bertaraf etmek mümkündür (hiç sanal konağın olmadığı veya Listen yönergelerinin mutlak adreslerle kullanıldığı durumlarda). Fakat bu en iyilemeleri yapmak için henüz bir çaba harcanmamıştır.

/65: brk(0x002170E8) = 0
/65: brk(0x002190E8) = 0

brk(2) çağrıları devingen bellekten bellek ayırır. httpd çoğu isteği yerine getirirken özel bellek ayırıcılar (apr_pool ve apr_bucket_alloc) kullandığından bunlar bir sistem çağrısı izlemesinde nadiren görünür. Bu izlemede, httpd henüz yeni başlatıldığından, özel bellek ayırıcıları oluşturmak için ham bellek bloklarını ayırmak amacıyla malloc(3) çağrıları yapması gerekir.

/65: fcntl(9, F_GETFL, 0x00000000) = 2
/65: fstat64(9, 0xFAF7B818) = 0
/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0
/65: fstat64(9, 0xFAF7B818) = 0
/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0
/65: setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0
/65: fcntl(9, F_SETFL, 0x00000082) = 0

Ardından, worker evresi istemciye (dosya tanıtıcısı 9) engellenmeyen kipte bir bağlantı açar. setsockopt(2) ve getsockopt(2) çağrıları, Solaris libc'sinin soketler üzerindeki fcntl(2) çağrısı yanında birer yan etkiden ibarettirler.

/65: read(9, " G E T / 1 0 k . h t m".., 8000) = 97

Worker evresi istemciden isteği okur.

/65: stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0
/65: open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10

Bu httpd Options FollowSymLinks ve AllowOverride None ile yapılandırılmıştır. Bu bakımdan, ne istenen dosya ile sonuçlanan yol üzerindeki her dizinde lstat(2) çağrısına ne de .htaccess dosyalarına bakılmasına gerek vardır. stat(2) çağrısı basitçe dosya için şunları doğrulamak amacıyla yapılır: 1) dosya mevcuttur ve 2) bir dizin değil normal bir dosyadır.

/65: sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C) = 10269

Bu örnekte, httpd, istenen dosyayı ve HTTP yanıt başlığını tek bir sendfilev(2) sistem çağrısı ile göndermektedir. Dosya gönderim işleminin anlamı sistemden sisteme değişiklik gösterir. Bazı sistemlerde, sendfile(2) çağrısından önce başlıkları göndermek için write(2) veya writev(2) çağrısı yapmak gerekir.

/65: write(4, " 1 2 7 . 0 . 0 . 1 - ".., 78) = 78

Bu write(2) çağrısı isteği erişim günlüğüne kaydeder. Bu izlemede eksik olan tek şey, time(2) çağrısıdır. Apache 1.3'ün aksine, Apache 2.x zamana bakmak için gettimeofday(3) çağırısını kullanır. Linux ve Solaris gibi bazı işletim sistemleri, gettimeofday işlevinin, sıradan bir sistem çağrısından daha fazla götürüsü olmayan en iyilenmiş bir gerçeklenimine sahiptir.

/65: shutdown(9, 1, 1) = 0
/65: poll(0xFAF7B980, 1, 2000) = 1
/65: read(9, 0xFAF7BC20, 512) = 0
/65: close(9) = 0

Burada worker evresi bağlantıyı zamana yaymaktadır.

/65: close(10) = 0
/65: lwp_park(0x00000000, 0) (uykuda...)

Son olarak, worker evresi teslim edilen dosyayı kapattıktan sonra dinleyici evre tarafından başka bir bağlantı atanıncaya kadar beklemeye alınır.

/67: accept(3, 0x001FEB74, 0x001FEB94, 1) (uykuda...)

Bu arada, dinleyici evre bağlantıyı bir worker evresine atar atamaz başka bir bağlantıyı beklemeye başlar (Mevcut tüm evreler meşgulse dinleyici evreyi baskılayan worker MPM'nin akış denetim şemasına konu olur). Bu izlemede görünmüyor olsa da sonraki accept(2) çağrısı, yeni bağlantı kabul eden worker evresine paralel olarak yapılabilir (aşırı yük durumlarında normal olarak, bu yapılır).

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Güvenlik İpuçları - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Çeşitli Belgeler

Güvenlik İpuçları

Bir HTTP Sunucusunu ayarlarken dikkat edilmesi gerekenler ve bazı ipuçları. Öneriler kısmen Apache’ye özel kısmen de genel olacaktır.

Güncel Tutma

Apache HTTP Sunucusu iyi bir güvenlik sicilinin yanında güvenlik konularıyla oldukça ilgili bir geliştirici topluluğuna sahiptir. Fakat, bir yazılımın dağıtılmasının ardından küçük ya da büyük bazı sorunların keşfedilmesi kaçınılmazdır. Bu sebeple, yazılım güncellemelerinden haberdar olmak oldukça önem kazanır. HTTP sunucunuzu doğrudan Apache’den temin ediyorsanız yeni sürümler ve güvenlik güncellemeleri ile ilgili bilgileri tam zamanında alabilmek için Apache HTTP Sunucusu Duyuru Listesine mutlaka üye olmanızı öneririz. Apache yazılımının üçüncü parti dağıtımlarını yapanların da buna benzer hizmetleri vardır.

Şüphesiz, bir HTTP sunucusu, sunucu kodunda bir sorun olmasa da tehlike altındadır. Eklenti kodları, CGI betikleri hatta işletim sisteminden kaynaklanan sorunlar nedeniyle bu ortaya çıkabilir. Bu bakımdan, sisteminizdeki tüm yazılımların sorunları ve güncellemeleri hakkında bilgi sahibi olmalısınız.

ServerRoot Dizinlerinin İzinleri

Normalde, Apache root kullanıcı tarafından başlatılır ve hizmetleri sunarken User yönergesi tarafından tanımlanan kullanıcının aidiyetinde çalışır. Root tarafından çalıştırılan komutlarda olduğu gibi, root olmayan kullanıcıların yapacakları değişikliklerden korunmak konusunda da dikkatli olmalısınız. Dosyaların sadece root tarafından yazılabilir olmasını sağlamak yeterli değildir, bu dizinler ve üst dizinler için de yapılmalıdır. Örneğin, sunucu kök dizininin /usr/local/apache olmasına karar verdiyseniz, bu dizini root olarak şöyle oluşturmanız önerilir:

mkdir /usr/local/apache
cd /usr/local/apache
mkdir bin conf logs
chown 0 . bin conf logs
chgrp 0 . bin conf logs
chmod 755 . bin conf logs

/, /usr, /usr/local dizinlerinde sadece root tarafından değişiklik yapılabileceği kabul edilir. httpd çalıştırılabilirini kurarken de benzer bir önlemin alındığından emin olmalısınız:

cp httpd /usr/local/apache/bin
chown 0 /usr/local/apache/bin/httpd
chgrp 0 /usr/local/apache/bin/httpd
chmod 511 /usr/local/apache/bin/httpd

Diğer kullanıcıların değişiklik yapabileceği bir dizin olarak bir htdocs dizini oluşturabilirsiniz. Bu dizine root tarafından çalıştırılabilecek dosyalar konulmamalı ve burada root tarafından hiçbir dosya oluşturulmamalıdır.

Diğer kullanıcılara root tarafından yazılabilen ve çalıştırılabilen dosyalarda değişiklik yapma hakkını tanırsanız, onlara root kullanıcısını ele geçirilebilme hakkını da tanımış olursunuz. Örneğin, biri httpd çalıştırılabilirini zararlı bir programla değiştirebilir ve o programı tekrar çalıştırdığınız sırada program yapacağını yapmış olur. Günlükleri kaydettiğiniz dizin herkes tarafından yazılabilen bir dizin olduğu takdirde, birileri bir günlük dosyasını bir sistem dosyasına sembolik bağ haline getirerek root kullanıcısının bu dosyaya ilgisiz şeyler yazmasına sebep olabilir. Günlüklerin dosyaları herkes tarafından yazılabilir olduğu takdirde ise birileri dosyaya yanıltıcı veriler girebilir.

Sunucu Taraflı İçerik Yerleştirme

SSI sayfaları bir sunucu yöneticisi açısından çeşitli olası risklere kaynaklık edebilir.

İlk risk, sunucu yükündeki artış olasılığıdır. Tüm SSI sayfaları, SSI kodu içersin içermesin Apache tarafından çözümlenir. Bu küçük bir artış gibi görünürse de bir paylaşımlı sunucu ortamında önemli bir yük haline gelebilir.

SSI sayfaları, CGI betikleriyle ilgili riskleri de taşır. exec cmd elemanı kullanılarak bir SSI sayfasından herhangi bir CGI betiğini veya bir sistem programını Apache’nin aidiyetinde olduğu kullanıcının yetkisiyle çalıştırmak mümkündür.

SSI sayfalarının yararlı özelliklerinden yararlanırken güvenliğini de arttırmanın bazı yolları vardır.

Sunucu yöneticisi, bir başıbozuk SSI sayfasının sebep olabileceği zararları bertaraf etmek için CGI Genelinde bölümünde açıklandığı gibi suexec’i etkin kılabilir.

SSI sayfalarını .html veya .htm uzantılarıyla etkinleştirmek tehlikeli olabilir. Bu özellikle paylaşımlı ve yüksek trafikli bir sunucu ortamında önemlidir. SSI sayfalarını normal sayfalardan farklı olarak .shtml gibi bildik bir uzantıyla etkinleştirmek gerekir. Bu, sunucu yükünü asgari düzeyde tutmaya ve risk yönetimini kolaylaştırmaya yarar.

Diğer bir çözüm de SSI sayfalarından betik ve program çalıştırmayı iptal etmektir. Bu, Options yönergesine değer olarak Includes yerine IncludesNOEXEC vererek sağlanır. Ancak, eğer betiklerin bulunduğu dizinde ScriptAlias yönergesiyle CGI betiklerinin çalışması mümkün kılınmışsa, kullanıcıların <--#include virtual="..." --> ile bu betikleri çalıştırabileceklerine dikkat ediniz.

CGI Genelinde

Herşeyden önce ya CGI betiğini/programını yazanlara ya da kendinizin CGI'deki güvenlik açıklarını (ister kasıtlı olsun ister tesadüfi) yakalama becerinize güvenmek zorundasınız. CGI betikleri esasen sisteminizdeki komutları site kullanıcılarının izinleriyle çalıştırırlar. Bu bakımdan dikkatle denenmedikleri takdirde oldukça tehlikeli olabilirler.

CGI betiklerinin hepsi aynı kullanıcının aidiyetinde çalışırsa diğer betiklerle aralarında çelişkilerin ortaya çıkması ister istemez kaçınılmazdır. Örneğin A kullanıcısının B kullanıcısına garezi varsa bir betik yazıp B’nin CGI veritabanını silebilir. Bu gibi durumların ortaya çıkmaması için betiklerin farklı kullanıcıların aidiyetlerinde çalışmasını sağlayan ve 1.2 sürümünden beri Apache ile dağıtılan suEXEC diye bir program vardır. Başka bir yol da CGIWrap kullanmaktır.

ScriptAlias’sız CGI

Kullanıcıların sitenin her yerinde CGI betiklerini çalıştırmalarına izin vermek ancak şu koşullarda mümkün olabilir:

  • Kullanıcılarınızın kasıtlı ya da kasıtsız sistemi saldırıya açık hale getirecek betikler yazmayacaklarına tam güveniniz vardır.
  • Sitenizin güvenliği zaten o kadar kötüdür ki, bir delik daha açılmasının mahzuru yoktur.
  • Sitenizin sizden başka kullanıcısı yoktur ve sunucunuzu sizden başka hiç kimsenin ziyaret etmesi mümkün değildir.

ScriptAlias’lı CGI

CGI’yi belli dizinlerle sınırlamak yöneticiye bu dizinlerde daha iyi denetim imkanı sağlar. Bu kaçınılmaz olarak ScriptAlias’sız CGI’den çok daha güvenlidir, ancak bu dizinlere yazma hakkı olan kullanıcılarınız güvenilir kişiler olması ve site yöneticisinin de olası güvenlik açıklarına karşı CGI betiklerini ve programlarını denemeye istekli olması şartıyla.

Çoğu site yöneticisi ScriptAlias’sız CGI yerine bu yaklaşımı seçer.

Devingen içerikli kaynaklar

Sunucunun bir parçası gibi çalışan, mod_php, mod_perl, mod_tcl ve mod_python gibi gömülü betik çalıştırma seçenekleri sunucuyu çalıştıran kullanıcının aidiyetinde çalışırlar (User yönergesine bakınız). Bu bakımdan bu betik yorumlayıcılar tarafından çalıştırılan betikler, sunucu kullanıcısının eriştiği herşeye erişebilirler. Bazı betik yorumlayıcıların getirdiği bazı sınırlamalar varsa da bunlara pek güvenmemek, gerekli sınamaları yine de yapmak gerekir.

Sistem Ayarlarının Korunması

Güvenliği gerçekten sıkı tutmak istiyorsanız, kullanıcılarınızın yapılandırmanızdaki güvenlik ayarlarını geçersiz kılmak için .htaccess dosyalarını kullanabilmelerinin de önüne geçmelisiniz. Bunu yapmanın tek bir yolu vardır.

Sunucu yapılandırma dosyanıza şunu yerleştirin:

<Directory /> AllowOverride None </Directory>

Böylece, belli dizinlerde özellikle etkinleştirilmedikçe bütün dizinlerde .htaccess dosyalarının kullanımını engellemiş olursunuz.

Sunucu dosyalarının öntanımlı olarak korunması

Apache’nin ister istemez yanlış anlaşılan yönlerinden biri öntanımlı erişim özelliğidir. Yani siz aksine bir şeyler yapmadıkça, sunucu normal URL eşleme kurallarını kullanarak bir dosyayı bulabildiği sürece onu istemciye sunacaktır.

Örneğin, aşağıdaki durumu ele alalım:

# cd /; ln -s / public_html

Ve, tarayıcınıza http://localhost/~root/ yazın.

Böylece, istemcilerin tüm dosya sisteminizi gezmelerine izin vermiş olursunuz. Bu işlemin sonuçlarının önünü almak için sunucu yapılandırma dosyanıza şunları yazın:

<Directory /> Order Deny,Allow
Deny from all </Directory>

Bu suretle, dosya sisteminize öntanımlı erişimi yasaklamış olursunuz. Erişime izin vermek istediğiniz dizinler için uygun Directory bölümleri eklemeniz yeterli olacaktır. Örnek:

<Directory /usr/users/*/public_html> Order Deny,Allow
Allow from all </Directory>
<Directory /usr/local/httpd> Order Deny,Allow
Allow from all </Directory>

Location ve Directory yönergelerinin etkileşimine de özellikle önem vermelisiniz; örneğin <Directory /> erişimi yasaklarken bir <Location /> yönergesi bunu ortadan kaldırabilir.

UserDir yönergesi de size buna benzer bir oyun oynayabilir; yönergeye ./ atamasını yaparsanız, root kullanıcısı söz konusu olduğunda yukarıda ilk örnekteki durumla karşılaşırız. Apache 1.3 veya üstünü kullanıyorsanız, sunucu yapılandırma dosyanızda aşağıdaki satırın mutlaka bulunmasını öneririz:

UserDir disabled root

Günlüklerin İzlenmesi

Sunucunuzda olup biteni günü gününe bilmek istiyorsanız günlük dosyalarına bakmalısınız. Günlük dosyaları sadece olup biteni raporlamakla kalmaz, sunucunuza ne tür saldırılar yapıldığını ve güvenlik seviyenizin yeterli olup olmadığını anlamanızı da sağlarlar.

Bazı örnekler:

grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_log
grep "client denied" error_log | tail -n 10

İlk örnek, Apache Tomcat Source.JSP Bozuk İstek Bilgilerini İfşa Açığını istismar etmeyi deneyen saldırıların sayısını verirken ikinci örnek, reddedilen son on istemciyi listeler; örnek:

[Thu Jul 11 17:18:39 2002] [error] [client falan.filan.dom] client denied by server configuration: /usr/local/apache/htdocs/.htpasswd

Gördüğünüz gibi günlük dosyaları sadece ne olup bittiğini raporlar, bu bakımdan eğer istemci .htpasswd dosyasına erişebiliyorsa erişim günlüğünüzde şuna benzer bir kayıt görürsünüz:

falan.filan.dom - - [12/Jul/2002:01:59:13 +0200] "GET /.htpasswd HTTP/1.1"

Bu, sunucu yapılandırma dosyanızda aşağıdaki yapılandırmayı iptal ettiğiniz anlamına gelir:

<Files ~ "^\.ht"> Order allow,deny
Deny from all </Files>

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Relevant Standards - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Miscellaneous Documentation

Relevant Standards

This page documents all the relevant standards that the Apache HTTP Server follows, along with brief descriptions.

In addition to the information listed below, the following resources should be consulted:

  • http://purl.org/NET/http-errata - HTTP/1.1 Specification Errata
  • http://www.rfc-editor.org/errata.php - RFC Errata
  • http://ftp.ics.uci.edu/pub/ietf/http/#RFC - A pre-compiled list of HTTP related RFCs

Notice

This document is not yet complete.

HTTP Recommendations

Regardless of what modules are compiled and used, Apache as a basic web server complies with the following IETF recommendations:

RFC 1945 (Informational)
The Hypertext Transfer Protocol (HTTP) is an application-level protocol with the lightness and speed necessary for distributed, collaborative, hypermedia information systems. This documents HTTP/1.0.
RFC 2616 (Standards Track)
The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. This documents HTTP/1.1.
RFC 2396 (Standards Track)
A Uniform Resource Identifier (URI) is a compact string of characters for identifying an abstract or physical resource.

HTML Recommendations

Regarding the Hypertext Markup Language, Apache complies with the following IETF and W3C recommendations:

RFC 2854 (Informational)
This document summarizes the history of HTML development, and defines the "text/html" MIME type by pointing to the relevant W3C recommendations.
HTML 4.01 Specification (Errata)
This specification defines the HyperText Markup Language (HTML), the publishing language of the World Wide Web. This specification defines HTML 4.01, which is a subversion of HTML 4.
HTML 3.2 Reference Specification
The HyperText Markup Language (HTML) is a simple markup language used to create hypertext documents that are portable from one platform to another. HTML documents are SGML documents.
XHTML 1.1 - Module-based XHTML (Errata)
This Recommendation defines a new XHTML document type that is based upon the module framework and modules defined in Modularization of XHTML.
XHTML 1.0 The Extensible HyperText Markup Language (Second Edition) (Errata)
This specification defines the Second Edition of XHTML 1.0, a reformulation of HTML 4 as an XML 1.0 application, and three DTDs corresponding to the ones defined by HTML 4.

Authentication

Concerning the different methods of authentication, Apache follows the following IETF recommendations:

RFC 2617 (Draft standard)
"HTTP/1.0", includes the specification for a Basic Access Authentication scheme.

Language/Country Codes

The following links document ISO and other language and country code information:

ISO 639-2
ISO 639 provides two sets of language codes, one as a two-letter code set (639-1) and another as a three-letter code set (this part of ISO 639) for the representation of names of languages.
ISO 3166-1
These pages document the country names (official short names in English) in alphabetical order as given in ISO 3166-1 and the corresponding ISO 3166-1-alpha-2 code elements.
BCP 47 (Best Current Practice), RFC 3066
This document describes a language tag for use in cases where it is desired to indicate the language used in an information object, how to register values for use in this language tag, and a construct for matching such language tags.
RFC 3282 (Standards Track)
This document defines a "Content-language:" header, for use in cases where one desires to indicate the language of something that has RFC 822-like headers, like MIME body parts or Web documents, and an "Accept-Language:" header for use in cases where one wishes to indicate one's preferences with regard to language.


Password Formats - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Miscellaneous Documentation

Password Formats

Notes about the password encryption formats generated and understood by Apache.

Basic Authentication

There are four formats that Apache recognizes for basic-authentication passwords. Note that not all formats work on every platform:

PLAIN TEXT (i.e. unencrypted)
Windows, BEOS, & Netware only.
CRYPT
Unix only. Uses the traditional Unix crypt(3) function with a randomly-generated 32-bit salt (only 12 bits used) and the first 8 characters of the password.
SHA1
"{SHA}" + Base64-encoded SHA-1 digest of the password.
MD5
"$apr1$" + the result of an Apache-specific algorithm using an iterated (1,000 times) MD5 digest of various combinations of a random 32-bit salt and the password. See the APR source file apr_md5.c for the details of the algorithm.

Generating values with htpasswd

MD5

$ htpasswd -nbm myName myPassword
myName:$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/

SHA1

$ htpasswd -nbs myName myPassword
myName:{SHA}VBPuJHI7uixaa6LQGWx4s+5GKNE=

CRYPT

$ htpasswd -nbd myName myPassword
myName:rqXexS6ZhobKA

Generating CRYPT and MD5 values with the OpenSSL command-line program

OpenSSL knows the Apache-specific MD5 algorithm.

MD5

$ openssl passwd -apr1 myPassword
$apr1$qHDFfhPC$nITSVHgYbDAK1Y0acGRnY0

CRYPT

openssl passwd -crypt myPassword
qQ5vTYO3c8dsU

Validating CRYPT or MD5 passwords with the OpenSSL command line program

The salt for a CRYPT password is the first two characters (converted to a binary value). To validate myPassword against rqXexS6ZhobKA

CRYPT

$ openssl passwd -crypt -salt rq myPassword
Warning: truncating password to 8 characters
rqXexS6ZhobKA

Note that using myPasswo instead of myPassword will produce the same result because only the first 8 characters of CRYPT passwords are considered.

The salt for an MD5 password is between $apr1$ and the following $ (as a Base64-encoded binary value - max 8 chars). To validate myPassword against $apr1$r31.....$HqJZimcKQFAMYayBlzkrA/

MD5

$ openssl passwd -apr1 -salt r31..... myPassword
$apr1$r31.....$HqJZimcKQFAMYayBlzkrA/

Database password fields for mod_dbd

The SHA1 variant is probably the most useful format for DBD authentication. Since the SHA1 and Base64 functions are commonly available, other software can populate a database with encrypted passwords that are usable by Apache basic authentication.

To create Apache SHA1-variant basic-authentication passwords in various languages:

PHP

'{SHA}' . base64_encode(sha1($password, TRUE))

Java

"{SHA}" + new sun.misc.BASE64Encoder().encode(java.security.MessageDigest.getInstance("SHA1").digest(password.getBytes()))

ColdFusion

"{SHA}" & ToBase64(BinaryDecode(Hash(password, "SHA1"), "Hex"))

Ruby

require 'digest/sha1'
require 'base64'
'{SHA}' + Base64.encode64(Digest::SHA1.digest(password))

C or C++

Use the APR function: apr_sha1_base64

PostgreSQL (with the contrib/pgcrypto functions installed)

'{SHA}'||encode(digest(password,'sha1'),'base64')

Digest Authentication

Apache recognizes one format for digest-authentication passwords - the MD5 hash of the string user:realm:password as a 32-character string of hexadecimal digits. realm is the Authorization Realm argument to the AuthName directive in httpd.conf.

Database password fields for mod_dbd

Since the MD5 function is commonly available, other software can populate a database with encrypted passwords that are usable by Apache digest authentication.

To create Apache digest-authentication passwords in various languages:

PHP

md5($user . ':' . $realm . ':' .$password)

Java

      byte b[] = java.security.MessageDigest.getInstance("MD5").digest( (user + ":" + realm + ":" + password ).getBytes());
java.math.BigInteger bi = new java.math.BigInteger(1, b);
String s = bi.toString(16);
while (s.length() < 32)
s = "0" + s;

      // String s is the encrypted password

ColdFusion

LCase(Hash( (user & ":" & realm & ":" & password) , "MD5"))

Ruby

require 'digest/md5'
Digest::MD5.hexdigest(user + ':' + realm + ':' + password)

PostgreSQL (with the contrib/pgcrypto functions installed)

encode(digest( user || ':' || realm || ':' || password , 'md5'), 'hex')


Modülleri Tanımlamakta Kullanılan Terimler - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Modülleri Tanımlamakta Kullanılan Terimler

Bu belgede Apache modüllerini tanımlarken kullanılan terimler açıklanmıştır.

Açıklama

Modülün kullanım amacının kısa bir açıklaması.

Durum

Modülün Apache HTTP sunucusuna ne kadar sıkı bağlı olduğunu belirtir. Başka bir deyişle, modüle ve işlevselliğine erişim kazanmak için sunucuyu yeniden derlemek gerekip gerekmediği ile ilgili durumu belirtir. Bu özniteliğin olası değerleri şunlardır:

MPM
“MPM” durumlu bir modül bir Çok Süreçlilik Modülüdür. Diğer modül türlerinin aksine, sunucunun kullandığı MPM modülü sayısı birden fazla olamaz. Bu modül türü temelde sunucuya gelen isteklerin ele alınmasından ve öldürülmesinden sorumludur.
Temel
“Temel” durumuyla etiketlenmiş bir modül öntanımlı olarak olarak derlenir ve sunucuya öntanımlı olarak yüklenir. Bu bakımdan derleme öncesi paket yapılandırması sırasında modülün derlenmemesi özellikle istenmedikçe bu modül derlenecek ve sunucuya yüklenecektir.
Eklenti
“Eklenti” durumundaki bir modül normal olarak derlenmez ve sunucuya yüklenmez. Modülü ve işlevselliğini etkin kılmak için sunucunun derleme öncesi paket yapılandırması sırasında modülün derleneceğini açıkça belirttikten sonra gerekirse yeniden derlemeniz gerekir.
Deneysel
“Deneysel” durumu modülün Apache sunucusunun bir parçası olarak kabul edildiğini ancak modülü denemenin tamamen sizin insiyatifinize bırakıldığı anlamına gelir. Böyle bir modül her şeyiyle belgelenmiştir fakat gerektiği gibi desteklenmemiştir.
Harici
“Harici” durumu temel Apache dağıtımında bulunmayan (“üçüncü parti”) modüller için kullanılır. Böyle modüller için sorumluluk kabul etmediğimiz gibi bunları desteklemiyoruz.

Kaynak Dosyası

Karşısına modül kodunu içeren kaynak dosyasının ismi yazılır. Bu isim ayrıca <IfModule> yönergesi tarafından da kullanılır.

Modül Betimleyici

Modüller devingen olarak yüklenirken LoadModule yönergesinde kullanmak için modülü betimleyen dizgedir. Aslında, kaynak dosyasında module türündeki harici değişkenin ismidir.

Uyumluluk

Eğer modül Apache’nin 2. sürüm dağıtımının özgün parçası değilse söz konusu sürüm burada belirtilir. Ayrıca, modülün kullanımı belli platformlarla sınırlıysa bunun ayrıntıları da burada belirtilir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Yönergeleri Tanımlamakta Kullanılan Terimler - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Yönergeleri Tanımlamakta Kullanılan Terimler

Bu belgede Apache yapılandırma yönergelerini tanımlamakta kullanılan terimler açıklanmıştır.

Ayrıca bakınız:

  • Yapılandırma dosyaları

Açıklama

Yönergenin kullanım amacının kısa bir açıklaması.

Sözdizimi

Yönergenin bir yapılandırma dosyasında hangi söz dizimiyle görünebileceği belirtilir. Bu sözdizimi yönergeye özeldir ve ayrıntıları yönerge tanımında açıklanır. Genelde yönerge ismini aralarında boşluklar bırakılmış bir dizi argüman izler. Eğer argümanlardan biri kendi içinde boşluk içeriyorsa çift tırnak içine alınır. İsteğe bağlı argümanlar sözdiziminde köşeli ayraçların arasında gösterilmiştir. Birden fazla olası değeri olan argümanlarda değerler aralarına | karakteri konarak ayrılmıştır. Değerin yerine ismi belirtilen argümanlarda bu isimler eğik yazılırken, kendisi değer olan dizgeler öntanımlı yazıtipi ile gösterilmiştir. Değişik sayıda argüman alan yönergelerde bu durum son argümanı takibeden “...” ile belirtilmiştir.

Yönergelerde kullanılan argüman türleri çok çeşitlidir. Çok kullanılanlardan bazıları aşağıda tanımlanmıştır.

URL
http://www.mesela.dom/yol/yordam/dosya.html örneğindeki gibi protokol şeması ve konak ismini isteğe bağlı bir dosya yolunun izlediği, açılımı “Uniform Resource Locator” olan ve Türkçe’ye “Tektip Özkaynak Konumlayıcı” şeklinde çevrilebilecek adresleri betimler.
URL-yolu
/yol/yordam/dosya.html örneğindeki gibi bir url’nin parçası olarak protokol şeması ve konak ismini izleyen bir yol dizgesini betimler. url-yolu, bir dosya sisteminin kök dizinine göre değil, DocumentRoot ile belirtilen dizine göre bir dosya yolu betimler.
dosya-yolu
/usr/local/apache/htdocs/yol/yordam/dosya.html örneğindeki gibi yerel dosya sisteminin kök dizini ile başlayan bir dosya yolunu betimler. Aksi belirtilmedikçe, bir / ile başlamayan bir dosya-yolu ServerRoot ile belirtilen dizine göre ele alınır.
dizin-yolu
/usr/local/apache/htdocs/yol/yordam/ örneğindeki gibi kök dizin ile başlayan, yerel dosya sistemindeki bir dizin yolunu betimler.
dosya-ismi
dosya.html örneğindeki gibi dizin yolu içermeyen bir dosya ismini betimler.
düzifd
Bir Perl uyumlu düzenli ifade betimler. Yönerge tanımında düzifd ile eşleşenler argüman olarak ele alınır.
uzantı
Bu genelde, dosya-ismi’nin bir parçası olarak son noktadan sonraki kısmı betimler. Bununla birlikte, Apache çok sayıda nokta içeren dosya isimlerinde ilk noktadan sonrasını uzantı kabul eden çoklu dosya ismi uzantılarını da tanır. Örneğin, dosya-ismi olarak dosya.html.tr değeri iki uzantı içerir: .html ve .tr. Apache yönergelerinde uzantı’ları başında noktası olmaksızın da belirtebilirsiniz. Ayrıca, uzantı’lar harf büyüklüğüne de duyarlı değildir.
MIME-türü
Dosya biçiminin, text/html örneğindeki gibi aralarına bir / konulmuş asıl ve alt biçimler şeklinde açıklandığı yönteme göre belirtileceğini betimler.
ortam-değişkeni
Apache yapılandırma sürecinde tanımlanmış bir ortam değişkeninin ismini betimler. Daha ayrıntılı bilgi için ortam değişkenleri belgesine bakınız.

Öntanımlı

Eğer yönerge öntanımlı bir değere sahipse o burada belirtilir (öntanımlı değer, yönergede kullanıcı tarafından belirtilmediği halde Apache tarafından belirtildiği varsayılarak işlem yapılan değerdir). Eğer öntanımlı bir değer yoksa bu bölümde bu durum “Yok” şeklinde belirtilir. Burada belirtilen öntanımlı değerin sunucu ile dağıtılan öntanımlı httpd.conf içindeki yönergede kullanılan değerle aynı olmasının gerekmediğine dikkat ediniz.

Bağlam

Yönergenin sunucunun yapılandırma dosyalarının nerelerinde meşru kabul edildiği aşağıdaki değerlerin virgül ayraçlı bir listesi halinde burada belirtilir.

sunucu geneli
Yönergenin sunucunun (httpd.conf gibi) yapılandırma dosyalarında <VirtualHost> ve <Directory> bölümleri dışında her yerde kullanılabileceğini belirtir. Ayrıca, .htaccess dosyalarında bulunmasına da izin verilmez.
sanal konak
Yönergenin sunucunun yapılandırma dosyalarının sadece <VirtualHost> bölümlerinde kullanıldığında geçerli kabul edileceğini belirtir.
dizin
Yönergenin sunucunun yapılandırma dosyalarında sadece <Directory>, <Location>, <Files> ve <Proxy> bölümlerinde kullanıldığında geçerli kabul edileceğini belirtir. Bu bağlama konu sınırlamaların çerçevesi Yapılandırma Bölümleri içinde çizilmiştir.
.htaccess
Bu bağlamda geçerli olacağı kabul edilen bir yönerge sadece dizin içi .htaccess dosyalarında görüldüğü zaman işleme sokulur. Üzerinde bir geçersizleştirme etkin kılınmışsa yönerge her şeye rağmen işleme sokulmayabilir.

Yönergeye sadece tasarlandığı bağlam içinde izin verilir; başka bir yerde kullanmayı denerseniz ya sunucunun bu bağlamı doğru şekilde işlemesine engel olan ya da sunucunun tamamen işlevsiz kalmasına sebep olan -- sunucu hiç başlatılamayabilir -- bir yapılandırma hatası alırsınız.

Yönergenin geçerli olacağı konumlar, aslında, listelenen bağlamların tamamına mantıksal VEYA uygulanarak bulunur. Başka bir deyişle, bir yönergenin geçerli olacağı yerler "sunucu geneli, .htaccess" şeklinde belirtilmişse yönerge httpd.conf dosyasında ve .htaccess dosyalarında, <Directory> veya <VirtualHost> bölümleri haricinde her yerde kullanılabilir.

Geçersizleştirme

Bir .htaccess dosyasında göründüğü takdirde yönerge işlenirken hangi yapılandırma geçersizleşirmesinin etkin olacağı burada belirtilir. Eğer yönerge bağlamının .htaccess dosyalarında görünmesine izin verilmiyorsa hiçbir bağlam listelenmez.

Geçersizleştirmeler AllowOverride yönergesi tarafından etkinleştirilir ve belli bir bağlama ve alt seviyelerde başka AllowOverride yönergeleri ile değiştirilmedikçe tüm çocuklarına uygulanır. Yönergenin belgesinde ayrıca kullanılabilecek tüm olası geçersizleştirme isimleri belirtilir.

Durum

Yönergenin Apache HTTP sunucusuna ne kadar sıkı bağlı olduğunu belirtir. Başka bir deyişle, yönergeye ve işlevselliğine erişim kazanmak için sunucuyu belli bir modül kümesiyle yeniden derlemek gerekip gerekmediği ile ilgili durumu belirtir. Bu özniteliğin olası değerleri şunlardır:

Çekirdek
Eğer bir yönerge “Çekirdek” durumuna sahip olarak listelenmişse bu, yönergenin Apache HTTP sunucusunun en iç kısımlarının bir parçası olduğu ve daima kullanılabilir olacağı anlamına gelir.
MPM
“MPM” durumuna sahip bir yönerge Çok Süreklilik Modülü tarafından sağlanır. Bu yönerge türü sadece ve sadece yönerge tanımının Modül satırında listelenmiş MPM’lerden birini kullanıyorsanız mevcut olacaktır.
Temel
“Temel” durumuna sahip bir yönerge, sunucuda öntanımlı derlenmiş standart Apache modüllerinden biri tarafından destekleniyor demektir. Bu nedenle sunucuyu derlemek için yapılandırırken yönergeyi içeren modülü yapılandırmadan özellikle kaldırmazsanız yönerge normal olarak kullanılabilir olacaktır.
Eklenti
“Eklenti” durumuna sahip bir yönerge, Apache sunucu kitinde bulunan ancak normalde sunucuyla birlikte derlenmeyen modüllerden biri tarafından sağlanır. Yönergeyi ve işlevselliğini etkin kılmak için sunucunun derleme öncesi paket yapılandırması sırasında modülün derleneceğini açıkça belirttikten sonra gerekirse sunucuyu yeniden derlemeniz gerekir.
Deneysel
“Deneysel” durumuna sahip bir yönerge, Apache sunucu kitinde bulunan modüllerden biri tarafından sağlanır ve modülün denenmesi tamamen sizin insiyatifinize bırakılır. Böyle bir yönerge her şeyiyle belgelenmiştir fakat gerektiği gibi desteklenmemiştir. Yönergeyi içeren modül öntanımlı olarak sunucuyla birlikte derlenebileceği gibi derlenmeyebilir de; bunun için yönergenin açıklandığı sayfanın başına ve kullanılabilirliği hakkında bilgi edinmek için yönergeyi içeren modüle bakın.

Modül

Burada sadece yönergeyi tanımlayan kaynak modülün ismi yazılır.

Uyumluluk

Eğer yönerge Apache’nin 2. sürüm dağıtımının özgün parçası değilse söz konusu sürüm burada belirtilir. Ayrıca, yönergenin kullanımı belli platformlarla sınırlıysa bunun ayrıntıları da burada belirtilir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


core - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Temel Özellikleri

Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.
Açıklama: | Apache HTTP Sunucusunda daima mevcut olan çekirdek özellikler
Durum: | Çekirdek

AcceptFilter Yönergesi

Açıklama: | Bir protokolün dinleyici soketleri için en iyilemeleri ayarlar
Sözdizimi: | AcceptFilter protocol kabul_süzgeci
Bağlam: | sunucu geneli
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache 2.1.5 ve sonrasında mevcuttur.

Bu yönerge protokol türüne göre bir dinleme soketinin işletim sistemine özgü en iyilemelerini etkin kılar. İşletim sistemi çekirdeği için temel önerme veri alınıncaya kadar veya HTTP isteğinin tamamı tamponlanana kadar sunucu sürecine bir soket tahsis etmemektir. Şimdilik sadece FreeBSD’nin Kabul Süzgeçleri ve Linux’un soket seçeneklerinden TCP_DEFER_ACCEPT desteklenmektedir.

FreeBSD için öntanımlı değerler:

AcceptFilter http httpready
AcceptFilter https dataready

httpready kabul süzgeci HTTP isteklerinin tamamını işletim sistemi çekirdeği seviyesinde tamponlar. Çekirdek isteğin tamamını alır almaz sunucuya gönderir. Ayrıntılar için accf_http(9) kılavuz sayfasına bakınız. HTTPS istekleri şifrelenmiş olduğundan sadece accf_data(9) süzgeci kullanılır.

Linux’taki ön tanımlı değerler:

AcceptFilter http data
AcceptFilter https data

Linux’un TCP_DEFER_ACCEPT soket seçeneği HTTP isteklerinin tamponlanmasını desteklemez. none dahil her değer dinleyici üzerinde TCP_DEFER_ACCEPT seçeneğini etkin kılar. Daha ayrıntılı bilgi edinmek için Linux tcp(7) kılavuz sayfasına bakınız.

Argüman olarak none kullanımı o protokol için kabul süzgeçlerini iptal edecektir. Bu, nntp gibi, sunucunun baştan bir veri göndermesinin gerekli olduğu protokoller için kullanışlıdır:

AcceptFilter nntp none

Ayrıca bakınız:

  • Protocol

AcceptPathInfo Yönergesi

Açıklama: | Dosya isminden sonra belirtilen yol verisini kabul veya reddeder.
Sözdizimi: | AcceptPathInfo On|Off|Default
Öntanımlı: | AcceptPathInfo Default
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache 2.0.30 ve sonrasında mevcuttur.

Bu yönerge, istekte dosya isminden sonra (dizinde belirtilen dosya bulunmayabilir) belirtilen yol verisinin kabul edilip edilmeyeceğini denetler. Dosya isminden sonra belirtilen yol verisi PATH_INFO ortam değişkeninde betiklerin kullanımına sunulabilir.

Örneğin, içinde sadece here.html dosyası bulunan bir /test/ dizinimiz olsun. /test/here.html/more ve /test/nothere.html/more isteklerinin her ikisi de PATH_INFO değişkenine /more verisinin atanmasını sağlar.

AcceptPathInfo yönergesine atanabilecek argüman sayısı üçtür:

Off
Sadece dosya isminden sonra yol verisi bulunmayan istekler kabul edilir. Yukarıdaki örnekteki gibi /test/here.html/more şeklindeki istekler bir 404 (Nesne bulunamadı) hatasıyla sonuçlanır.
On
Mevcut bir dosyaya ait bir dosya isminden sonra bir yol verisinin de belirtildiği istekler kabul edilir. Yukarıdaki örnekteki gibi /test/here.html/more şeklindeki istekler, /test/here.html geçerli bir dosya olduğu takdirde kabul edilir.
Default
Dosya isminden sonra yol verisi belirtilen isteklerin nasıl ele alınacağı istekten sorumlu eylemci tarafından saptanır. Normal dosyalar için çekirdek eylemci öntanımlı olarak PATH_INFO isteklerini reddeder. cgi-script ve isapi-handler gibi betiklere hizmet eden eylemciler ise genellikle PATH_INFO isteklerini öntanımlı olarak kabul ederler.

AcceptPathInfo yönergesinin birincil amacı eylemcinin PATH_INFO istekleri hakkında verdiği kabul veya red kararını geçersiz kılabilmenizi sağlamaktır. Örneğin, PATH_INFO’ya dayalı olarak içerik üretmek için INCLUDES gibi bir süzgeç kullandığınız takdirde bu geçersizleştirme zorunlu olur. Normal dosyalar için çekirdek eylemci normal olarak isteği reddederdi, böyle bir durumda bir betiği etkin kılmak için aşağıdaki gibi bir yapılandırma kullanabilirsiniz:

<Files "mypaths.shtml">
Options +Includes
SetOutputFilter INCLUDES
AcceptPathInfo On
 </Files>

AccessFileName Yönergesi

Açıklama: | Dağıtık yapılandırma dosyasının ismi belirtilir.
Sözdizimi: | AccessFileName filename [filename] ...
Öntanımlı: | AccessFileName .htaccess
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

Belge yolu üzerindeki dizinlerde dağıtık yapılandırma dosyalarının bulunmasına izin verilmişse sunucu bir isteği işlerken önce bu dizinlerde bu yönergede belirtilmiş yapılandırma dosyasını arar. Örnek:

AccessFileName .acl

Sunucu, /usr/local/web/index.html belgesini döndürmeden önce,

<Directory />
AllowOverride None
 </Directory>

şeklinde bir yapılandırma ile iptal edilmiş olmadıkça yönergeler için /.acl, /usr/.acl, /usr/local/.acl ve /usr/local/web/.acl dosyalarını okur.

Ayrıca bakınız:

  • AllowOverride
  • Yapılandırma Dosyaları
  • .htaccess Dosyaları

AddDefaultCharset Yönergesi

Açıklama: | Bir yanıtın içerik türü text/plain veya text/html olduğunda eklenecek öntanımlı karakter kümesi parametresini belirler.
Sözdizimi: | AddDefaultCharset On|Off|karküm
Öntanımlı: | AddDefaultCharset Off
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core

Bu yönerge, yanıtın içerik türü text/plain veya text/html olmak şartıyla yanıta eklenecek karakter kümesini (karakter kodlamasınının ismini) belirler. Bu, asıl davranış çoğunlukla kullanıcının istemci yapılandırmasına bağlı olmakla birlikte, yanıtın gövdesinde META elemanı vasıtasıyla belirtilmiş karakter kümesini geçersiz kılar. AddDefaultCharset Off şeklinde bir atama bu işlevselliği iptal eder. AddDefaultCharset On ile bu işlevsellik etkin kılınmaktan başka iso-8859-1 karakter kümesini öntanımlı olarak yanıta eklenir. Yönergede karküm olarak belirtilecek değerler, MIME ortam türlerinde kullanmak üzere IANA’da kayıtlı karakter kümesi değerlerinden biri olmalıdır. Örnek:

AddDefaultCharset utf-8

AddDefaultCharset yönergesi sadece, metin kaynaklarının hepsinin aynı karakter kümesine sahip olduğu bilindiği takdirde ve her birinde ayrı ayrı karakter kümesi belirtmek çok külfetli olacaksa kullanılmalıdır. Buna bir örnek, CGI betikleri tarafından üretilmiş içeriğe sahip kaynaklara karakter kümesinin eklenmesidir; böyle kaynaklar çıktıda kullanıcı tarafından sağlanmış veri içermeleri nedeniyle karşı siteden kaynaklanan betikli saldırılardan zarar görebilir. Bununla birlikte, bir öntanımlı karakter kümesi belirtmek, tarayıcılarında “karakter kodlamasını kendiliğinden sapta” özelliğini etkin kılmış kullanıcıları korumayacağından daha iyi bir çözüm bu betikleri bu tür saldırılara karşı düzeltmek veya en iyisi silmektir.

Ayrıca bakınız:

  • AddCharset

AddOutputFilterByType Yönergesi

Açıklama: | Belli bir MIME türüne bir çıktı süzgeci atar.
Sözdizimi: | AddOutputFilterByType süzgeç[;süzgeç...] MIME-türü [MIME-türü] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | 2.0.33 ve sonrasında mevcuttur; Apache 2.1 ve sonrasında kullanımı önerilmemektedir.

Bu yönerge yanıtın MIME türüne bağlı olarak bir istek için belli bir çıktı süzgecini etkin kılar. Aşağıda açıklanan belli başlı sorunlardan dolayı bu yönergenin kullanımı önerilmemektedir. Aynı işlevsellik mod_filter kullanarak sağlanabilmektedir.

Aşağıdaki örnekte mod_deflate modülünce sağlanan DEFLATE süzgeci kullanılmıştır. Bu süzgeç, text/html veya text/plain olarak yaftalanmış tüm çıktıyı (ister durağan ister devingen olsun) istemciye göndermeden önce sıkıştırır.

AddOutputFilterByType DEFLATE text/html text/plain

İçeriğin birden fazla süzgeç tarafından işlenmesini isterseniz süzgeç isimlerini noktalı virgüllerle ayırarak belirtebilirsiniz. Ayrıca, bu süzgeçlerin her biri için ayrı bir AddOutputFilterByType yönergesi belirtmek de mümkündür.

Aşağıdaki yapılandırma text/html olarak yaftalanmış tüm betik çıktılarının önce INCLUDES sonra da DEFLATE süzgecinden geçirilmesine sebep olur.

<Location /cgi-bin/>
Options Includes
AddOutputFilterByType INCLUDES;DEFLATE text/html
 </Location>

Ek Bilgi

Süzgeçlerin AddOutputFilterByType ile etkin kılınması bazı durumlarda kısmen bazılarında da tamamen başarısızlığa uğrayabilir. Örneğin, MIME türü saptanamadığı takdirde hiçbir süzgeç uygulanmaz ve DefaultType aynı olsa bile son çare olarak DefaultType ayarlarına geri dönülür.

Bununla birlikte, süzgeçlerin uygulanacağına emin olmak isterseniz, bir kaynağa içerik türünü örneğin, AddType veya ForceType ile açıkça atayabilirsiniz. Ayrıca, içerik türünü (bir nph-olmayan) CGI betiği içinde ayarlamak da bu güvenceyi sağlar.

Ayrıca bakınız:

  • AddOutputFilter
  • SetOutputFilter
  • Süzgeçler

AllowEncodedSlashes Yönergesi

Açıklama: | Kodlanmış dosya yolu ayracı içeren URL’lere izin verilip verilmeyeceğini belirler.
Sözdizimi: | AllowEncodedSlashes On|Off|NoDecode
Öntanımlı: | AllowEncodedSlashes Off
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache 2.0.46 ve sonrasında mevcuttur. NoDecode seçeneği 2.2.18 ve sonrasında kullanılabilir.

AllowEncodedSlashes yönergesi PATH_INFO içinde kodlanmış dosya yolu ayracı içeren URL’lere izin verir (/ yerine %2F ve ek olarak \ için ilgili sistemlerde %5C kullanılmış URL’ler).

Off öntanımlı değeri ile böyle URL'ler bir 404 (bulunamadı) hatasıyla reddedilir.

On değeri ile böyle URL'ler kabul edilir ve kodlanmış bölü çizgileri diğer kodlanmış karakterler gibi çözümlenir.

NoDecode değeri ile böyle URL'ler kabul edilir fakat kodlanmış bölü çizgileri çözümlenmeden bırakılır.

AllowEncodedSlashes On, çoğunlukla PATH_INFO ile bir arada kullanıldığı zaman kullanışlıdır.

Ek Bilgi

PATH_INFO içinde kodlanmış bölü çizgilerini kullanmaktan başka çare yoksa bir güvenlik ölçütü olarak NoDecode kullanmanız şiddetle tavsiye edilir. Bölü çizgilerinin çözümlenmeye çalışılması yanlış yol çözümlemesi gibi güvenilmez bir olasılığa yol açabilir.

Ayrıca bakınız:

  • AcceptPathInfo

AllowOverride Yönergesi

Açıklama: | .htaccess dosyalarında bulunmasına izin verilen yönerge türleri belirtilir.
Sözdizimi: | AllowOverride All|None|yönerge-türü [yönerge-türü] ...
Öntanımlı: | AllowOverride All
Bağlam: | dizin
Durum: | Çekirdek
Modül: | core

Sunucu AccessFileName yönergesi ile belirtildiği şekilde bir .htaccess dosyasına rastlarsa önceki yapılandırma yönergelerinin hangilerinin geçersiz kılınmak üzere bildirildiğini bilmek ister.

Sadece <Directory> bölümlerinde geçerli

AllowOverride yönergesi, <Location>, <DirectoryMatch> veya <Files> bölümlerinde değil, sadece düzenli ifade içermeyen <Directory> bölümlerinde geçerlidir.

Yönergeye değer olarak None belirtilirse .htaccess dosyaları tamamen yok sayılır. Bu durumda, sunucu dosya sisteminde rastladığı .htaccess dosyalarını okumaya dahi çalışmayacaktır.

Bu yönergeye All değeri atanırsa, .htaccess bağlamında kullanılabilecek her yönergeye .htaccess dosyalarında izin verilir.

yönerge-türü olarak aşağıdaki yönerge grup isimlerinden biri belirtilebilir:

AuthConfig
AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require ve benzeri yetkilendirme yönergelerinin kullanımını izin verilir.
FileInfo
Belge türünü denetleyen mod_mime Add* ve Remove* yönergeleri, DefaultType, ErrorDocument, ForceType, LanguagePriority, SetHandler, SetInputFilter, SetOutputFilter yönergeleri ve benzerleri ile Header, RequestHeader, SetEnvIf, SetEnvIfNoCase, BrowserMatch, CookieExpires, CookieDomain, CookieStyle, CookieTracking, CookieName belge meta veri yönergelerinin, mod_rewrite modülündeki RewriteEngine, RewriteOptions, RewriteBase, RewriteCond, RewriteRule yönergelerinin, mod_alias modülündeki Redirect, RedirectTemp, RedirectPermanent, RedirectMatch) ve mod_actions modülündeki Action yönergesinin kullanımına izin verilir.
Indexes
Dizin içeriğinin listelenmesini denetleyen AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName yönergelerinin ve benzerlerinin kullanımına izin verilir.
Limit
Konak erişimini denetleyen Allow, Deny ve Order yönergelerinin kullanımına izin verilir.
Options[=seçenek,...]
Dizinlere özgü özellikleri denetleyen Options ve XBitHack yönergelerinin kullanımına izin verilir. Options komutunda belirtilecek seçenekler bir eşit işaretinden sonra aralarına sadece virgül konarak (boşluksuz) belirtilebilir.

Seçeneklerin örtük iptali

.htaccess dosyalarında kullanılabilecek seçenekler bu yönergeyle sınırlanabileceği gibi miras alınmış bir seçenek olarak, bağıntısız sözdizimi kullanılarak iptal edilebilen herhangi bir seçenek de Options yönergesi ile dolaylı olarak iptal edilmiş olacaktır. Başka bir deyişle, bu mekanizma evvelce etkisiz kılınmış bir seçeneğin etkin kılınmasını sağlamayacaktır.

Örnek:

AllowOverride AuthConfig Indexes

Bu örnekte AuthConfig ve Indexes grubundaki yönergeler bir dahili sunucu hatasına yol açmayacaktır.

Güvenlik ve başarımı arttırmak için <Directory /> bloğu içinde AllowOverride yönergesine None dışında bir değer atamayın. Böyle yapmak yerine bir .htaccess dosyası yerleştirmeyi düşündüğünüz dizine ait bir <Directory> bloğu olması daha iyidir.

Ayrıca bakınız:

  • AccessFileName
  • Yapılandırma Dosyaları
  • .htaccess Dosyaları

AuthName Yönergesi

Açıklama: | HTTP kimlik doğrulamasında kullanmak için yetki alanı ismi
Sözdizimi: | AuthName yetki-alanı
Bağlam: | dizin, .htaccess
Geçersizleştirme: | AuthConfig
Durum: | Çekirdek
Modül: | core

Bu yönerge bir dizin için yetki alanı ismi belirler. Bu alan istemciye bildirilerek kullanıcının hangi kullanıcı ismini ve parolasını kullanacağını bilmesi sağlanır. AuthName tek bir argüman alır. Bu bakımdan eğer alan ismi boşluk karakterleri içeriyorsa ismin tırnak içine alınması gerekir. Çalışması için AuthUserFile ve AuthGroupFile gibi yönergelerden başka AuthType ve Require yönergelerinin kendine eşlik etmesini gerektirir.

Örnek:

AuthName "Top Secret"

AuthName için belirtilen dizge çoğu tarayıcı tarafından parola diyaloğunda gösterilir.

Ayrıca bakınız:

  • Kimlik Doğrulama, Yetkilendirme ve Erişim Denetimi

AuthType Yönergesi

Açıklama: | Kullanıcı kimlik doğrulaması türü
Sözdizimi: | AuthType Basic|Digest
Bağlam: | dizin, .htaccess
Geçersizleştirme: | AuthConfig
Durum: | Çekirdek
Modül: | core

Bu yönerge bir dizin için kullanıcı kimlik doğrulaması türünü belirler. Olası kimlik doğrulama türleri Basic (mod_auth_basic modülüyle sağlanır) ve Digest’tir (mod_auth_digest modülüyle sağlanır).

Kimlik doğrulamasının gerçekleşmesi için AuthName ve Require yönergelerini de kullanmalısınız. Bunlara ek olarak sunucunun mod_authn_file gibi bir kimlik doğrulayıcı modülüne ve mod_authz_user gibi bir yetkilendirme modülüne ihtiyacı vardır.

Ayrıca bakınız:

  • Kimlik Doğrulama ve Yetkilendirme
  • Erişim Denetimi

CGIMapExtension Yönergesi

Açıklama: | CGI betik yorumlayıcısını saptama tekniğini belirler.
Sözdizimi: | CGIMapExtension cgi-yolu .uzantı
Bağlam: | dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Sadece NetWare’de geçerlidir.

Bu yönerge Apache’inin CGI bekitlerini çalıştırmak için kullanacağı yorumlayıcıyı nasıl bulacağını denetlemek için kullanılır. Örneğin, CGIMapExtension sys:\foo.nlm .foo satırı .foo uzantılı CGI betik dosyalarının FOO yorumlayıcıya aktarılmasını sağlar.

ContentDigest Yönergesi

Açıklama: | Content-MD5 HTTP yanıt başlıklarının üretimini etkin kılar.
Sözdizimi: | ContentDigest On|Off
Öntanımlı: | ContentDigest Off
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Options
Durum: | Çekirdek
Modül: | core

Bu yönerge RFC2616 ve RFC1864’te tanımlandığı gibi Content-MD5 üretimini etkin kılar.

MD5, verideki herhangi bir değişikliğin ileti özetinin değişmesi olarak yansıması nedeniyle yüksek derecede itimat sağlayan keyfi uzunlukta bir "ileti özeti" (bazen "parmakizi" dendiği de olur) hesaplama algoritmasıdır.

Content-MD5 başlığı öğe gövdesinin iki uç arasında ileti bütünlük sınamasının yapılabilmesini sağlar. Bir istemci veya vekil aktarılan öğe gövdesinde rastlantısal bir değişiklik olup olmadığını saptamak için bu başlığın doğruluğunu sınayabilir. Başlık örneği:

Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA==

Her istekte ileti özeti hesaplanacağından (değerler saklanmaz), bu yönergenin sunucunuzda başarım sorunlarına yol açacağına dikkat ediniz.

Content-MD5, herhangi bir modül değil, sadece core modülü tarafından sunulan belgeler için gönderilir. Örneğin, SSI belgeleri CGI betikleri tarafından çıktılanırlar ve bayt seviyesinden çıktılar bu başlığa sahip olmazlar.

DefaultType Yönergesi

Açıklama: | Sunucunun MIME türünü saptayamadığı durumda göndereceği MIME içerik türünü belirler.
Sözdizimi: | DefaultType MIME-türü|none
Öntanımlı: | DefaultType text/plain
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | none değeri Apache 2.2.7 ve sonrasında mevcuttur.

Sunucudan zaman zaman kendi MIME türü ile uyuşmayan bir belge sunması istenir.

Sunucu, belgenin içerik türünü istemciye bildirmek zorundadır. Eğer sunucu bunu normal yollardan saptayamazsa içerik türü olarak DefaultType ile belirtilen değeri gönderir. Örneğin, GIF dosyaları bulunan bir dizinde .gif uzantısına sahip olmayan dosyaların da bulunması durumunda, bu dizin için,

DefaultType image/gif

belirtilmesi uygun olurdu.

İçerik türünün ne sunucu ne de yönetici (örneğin, vekil) tarafından saptanabildiği durumlarda MIME türünün yanlış belirtilmesindense tür belirtmemek tercih edilebilir. Bu, şöyle yapılabilir:

DefaultType None

DefaultType None sadece httpd-2.2.7 ve sonrasında mevcuttur.

Bu yönergenin sadece öntanımlı MIME-türünü sağlaması nedeniyle ForceType yönergesinden farklı olduğuna dikkat ediniz. Dosya ismi uzantıları dahil, tüm diğer MIME-türü tanımları ortam türünü tanımladığı noktada bu öntanımlı türü sunulan veri için geçersiz kılacaktır.

<Directory> Yönergesi

Açıklama: | Sadece ismi belirtilen dosya sistemi dizinine ve bunun altdizinleri ile içeriklerine uygulanacak bir yönerge grubunu sarmalar.
Sözdizimi: | <Directory dizin-yolu> ... </Directory>
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

<Directory> ve </Directory> sadece ismi belirtilen dosya sistemi dizini ve bunun altdizinleri ile bu dizinlerin içeriklerine uygulanacak bir yönerge grubunu sarmalamakta kullanılır. Bir dizin bağlamında kullanılabilecek her yönergeye izin verilir. dizin-yolu bir dizinin tam yolu olabileceği gibi Unix kabuk tarzı bir dosya ismi eşleştirme kalıbı da olabilir. Kalıp dizgesinde, ? herhangi bir tek karakterle, * herhangi bir karakter dizisiyle eşleşir. Ayrıca [] karakter aralıkları da kullanılabilir. ‘/’ karakteri ile hiçbir kalıp karakteri eşleşmez, bu bakımdan <Directory /*/public_html> ile /home/user/public_html değil, ama <Directory /home/*/public_html> eşleşecektir. Örnek:

<Directory /usr/local/httpd/htdocs>
Options Indexes FollowSymLinks
 </Directory>

dizin-yolu argümanlarını belirtirken dikkatli olmalısınız: Apache’nin dosyalara erişmekte kullandığı dosya sistemi yolu ile bire bir eşleşmelidir. Belli bir <Directory> dizinine uygulanan yönergeler, aynı dizine farklı bir yoldan, örneğin başka bir sembolik bağ üzerinden erişilen dosyalara uygulanmayacaktır.

~ karakterine ek olarak düzenli ifadeler de kullanılabilir. Örnek:

<Directory ~ "^/www/[0-9]{3}">

yönergesi /www/ içindeki üç rakamdan oluşan dizinlerle eşleşecektir.

Eğer çok sayıda (düzenli ifade olmayan) <Directory> bölümü, bir dosyayı içeren bir dizinle veya üst dizinlerinden biri ile eşleşiyorsa, uygulama en kısa eşleşmedeki yönergelerden başlayarak .htaccess dosyalarındaki yönergelere kadar genişletilir. Örneğin,

<Directory />
AllowOverride None
 </Directory>

<Directory /home>
AllowOverride FileInfo
 </Directory>

bölümleri ile /home/web/dir/doc.html belgesine erişirken şu aşamalardan geçilir:

  • AllowOverride None yönergesi uygulanır (.htaccess dosyaları iptal edilir).
  • AllowOverride FileInfo yönergesi uygulanır (/home dizini için).
  • Sırayla /home/.htaccess, /home/web/.htaccess ve /home/web/dir/.htaccess dosyaları içindeki FileInfo yönergeleri uygulanır.

Normal bölümlerin tamamı uygulanıncaya kadar düzenli ifadeler değerlendirilmez. Düzenli ifadelerin tamamı yapılandırma dosyasında görüldükleri sıraya göre sınanırlar. Örneğin,

<Directory ~ "public_html/.*">
# ... yönergeler burada ...
 </Directory>

düzenli ifadeli bölümü, tüm normal <Directory> bölümleri ve .htaccess dosyaları uygulanıncaya kadar değerlendirilmeyecektir. Düzenli ifadeleri değerlendirmeye sıra gelince düzenli ifade /home/abc/public_html/abc ile eşleştirilecek ve buna ilişkin <Directory> uygulanacaktır.

<Directory /> için öntanımlı Apache erişiminin Allow from All oluşuna dikkat ediniz. Bunu şöyle bir blokla değiştirmeniz,

<Directory />
Order Deny,Allow
Deny from All
 </Directory>

ve erişilebilir olmasını istediğiniz dizinleri ayrıca belirtmeniz önerilir. Daha ayrıntılı bilgi edinmek için Güvenlik İpuçları belgesine bakınız.

Dizin bölümleri httpd.conf dosyasında yer alır. <Directory> yönergeleri iç içe olamazlar ve bir <Limit> veya <LimitExcept> bölümü içinde bulunamazlar.

Ayrıca bakınız:

  • Bir istek alındığında farklı yapılandırma bölümlerinin nasıl bir arada ele alındığının anlatıldığı <Directory>, <Location> ve <Files> bölümleri nasıl çalışır? belgesine de bakınız.

<DirectoryMatch> Yönergesi

Açıklama: | Bir düzenli ifade ile eşleşen dosya sistemi dizininde ve bunun altdizinlerinde uygulanacak bir yönerge grubunu sarmalar.
Sözdizimi: | <DirectoryMatch düzifd> ... </DirectoryMatch>
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

<DirectoryMatch> and </DirectoryMatch> yönergeleri <Directory> gibi sadece ismi belirtilen dosya sistemi dizinine ve bunun altdizinleri ile bunların içerdiği dosyalara uygulanacak bir yönerge grubunu sarmalamakta kullanılır. Tek farkla argüman olarak bir düzenli ifade alır. Örnek:

<DirectoryMatch "^/www/(.+/)?[0-9]{3}">

yönergesi /www/ içindeki üç rakamdan oluşan dizinlerle eşleşecektir.

Satırsonu karakteri

Satırsonu karakteri ($) bu yönerge ile eşleşemez.

Ayrıca bakınız:

  • Normal <Directory> bölümlerindeki yönergelerle düzenli ifadelerin nasıl karıştırıldığının bir açıklaması için <Directory> yönergesine bakınız.
  • Bir istek alındığında farklı yapılandırma bölümlerinin nasıl bir arada ele alındığının açıklaması için <Directory>, <Location> ve <Files> bölümleri nasıl çalışır? belgesine bakınız.

DocumentRoot Yönergesi

Açıklama: | İstemciye görünür olan ana belge ağacının kök dizinini belirler.
Sözdizimi: | DocumentRoot dizin-yolu
Öntanımlı: | DocumentRoot /usr/local/apache/htdocs
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

Bu yönerge httpd tarafından dosyalarının sunulacağı dizini belirler. Alias benzeri bir yönerge ile eşleşmedikçe, sunucu istenen URL’deki yolu, belge yolu haline getirmek için belge kök dizinine ekler. Örnek:

DocumentRoot /usr/web

yapılandırması ile http://www.my.host.com/index.html isteği /usr/web/index.html ile eşleştirilir. dizin-yolu ile göreli dosya yolu belirtildiği takdirde belge kök dizininin ServerRoot ile belirtilen sunucu kök dizinine göre belirtildiği varsayılır.

DocumentRoot ile belirtilen dizin bir bölü çizgisi ile bitirilmemelidir.

Ayrıca bakınız:

  • URL’lerin Dosya Sistemi ile Eşlenmesi

EnableMMAP Yönergesi

Açıklama: | Teslimat sırasında okunacak dosyalar için bellek eşlemeyi etkin kılar.
Sözdizimi: | EnableMMAP On|Off
Öntanımlı: | EnableMMAP On
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core

Bu yönerge, sunucunun teslimat sırasında gerektiği takdirde bir dosya içeriğinin okunması için bellek eşleme kullanıp kullanmayacağını belirler. Öntanımlı olarak, bir isteğin yerine getirilmesi, mod_include kullanarak sunucu tarafından çözümlenen bir dosyanın teslimatı sırasında olduğu gibi, bir dosya içindeki veriye erişilmesini gerektirdiğinde Apache, işletim sistemi tarafından desteklendiği takdirde dosyayı belleğe eşler.

Böyle bellek eşleme kimi zaman başarım artışını beraberinde getirirse de bazen sorunlardan kaçınmak için bellek eşlemeyi kapatmak daha iyi sonuç verir:

  • Bazı çok işlemcili sistemlerde bellek eşleme httpd’nin başarımını düşürebilmektedir.
  • httpd bellek eşlemli çalışırken bir dosyanın silinmesi veya boyutunun küçültülmesi httpd'nin parçalama arızası vererek çökmesine yol açabilir.

Bu tür sorunlardan dolayı zarar görülebilecek sunucu yapılandırmalarında dosya teslimatında bellek eşlemlerinin kullanımını şu şekilde iptal etmeniz gerekir:

EnableMMAP Off

Bu özellik, sadece NFS dosya sistemi üzerinde sunulan dosyaları kapsamak üzere şu şekilde kolayca kapatılabilir:

<Directory "/nfs-dosya-yolu"> EnableMMAP Off </Directory>

EnableSendfile Yönergesi

Açıklama: | Dosyaların istemciye tesliminde çekirdeğin dosya gönderme desteğinin kullanımını etkin kılar.
Sözdizimi: | EnableSendfile On|Off
Öntanımlı: | EnableSendfile On
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | 2.0.44 ve sonrasında mevcuttur.

Bu yönerge, dosya içeriğinin istemciye teslimi için httpd’nin çekirdeğin dosya gönderme desteğini kullanıp kullanmayacağını belirler. Öntanımlı olarak, bir isteğin yerine getirilmesi, bir durağan dosyanın teslimatı sırasında olduğu gibi, bir dosya içindeki veriye erişilmesini gerektirmediği takdirde Apache, işletim sistemi tarafından destekleniyorsa dosyayı istemciye teslim etmek için çekirdeğin dosya gönderme özelliğini kullanır.

Çekirdeğin dosya gönderme mekanizması, okuma, gönderme ve tampon ayırma işlemlerini ayrı ayrı yapmaktan kaçınır. Fakat bazı platformlarda veya bazı dosya sistemlerinde aşağıda belirtilen işlemsel sorunlardan kaçınmak için bu özelliği iptal etmek daha iyidir:

  • Bazı platformlar, derleme sistemince saptanamayan bozuk bir dosya gönderme desteğine sahiptir; özellikle eğer derleme işlemi dosya gönderme desteğinde sorun olmayan bir makinede yapılıp çalıştırılabilir dosyaların sorunlu makineye kurulduğu durumda bu saptama yapılamayacaktır.
  • Linux’ta IPv6 kullanırken dosya gönderme desteği bazı ağ kartlarındaki TCP toplama sağlaması aktarım hatasını tetikler.
  • Itanium üzerinde çalışan Linux’ta dosya gönderme desteği 2GB’tan büyük dosyalarla çalışamamaktadır.
  • DocumentRoot ağ dosya sistemi (NFS veya SMB gibi) üzerinde olduğu durumda çekirdek ağ dosyalarını kendi arabelleği üzerinden sunamayabilir.

Bu sorunlardan muzdarip sunucu yapılandırmaları için bu özelliği şöyle iptal edebilirsiniz:

EnableSendfile Off

Bu özellik, sadece bir NFS veya SMB dosya sistemi üzerinde sunulan dosyaları kapsamak üzere şu şekilde kolayca kapatılabilir:

<Directory "/path-to-nfs-files"> EnableSendfile Off </Directory>

EnableSendfile yönergesinin .htaccess ve diziniçi yapılandırmalarının mod_disk_cache tarafından desteklenmediğini lütfen aklınızdan çıkarmayın. EnableSendfile yönergesinin sadece küresel tanımları hesaba katılır.

ErrorDocument Yönergesi

Açıklama: | Bir hata durumunda sunucunun istemciye ne döndüreceğini belirler.
Sözdizimi: | ErrorDocument hata-kodu belge
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Metin iletilerini tırnak içine alma sözdizimi Apache 2.0’da farklıdır.

Bir sorun çıktığında veya hata oluştuğunda Apache şu dört işlemden birini yapacak şekilde yapılandırılabilir:

  1. Yerleşik bir hata iletisi çıktılanır.
  2. Özel bir ileti çıktılanır.
  3. Sorunu/hatayı işleyecek yerel bir URL-yoluna dahili bir yönlendirme yapılır.
  4. Sorunu/hatayı işleyecek harici bir URL-yoluna yönlendirme yapılır.

İlk seçenek öntanımlıdır. Diğer üç seçenek ErrorDocument yönergesinin argümanları (hata kodundan sonra bir URL veya hata iletisi) ile belirtilir. Apache bazı durumlarda sorun/hata ile ilgili ek bilgi verecektir.

URL’ler yerel yollarda (DocumentRoot’a göre) bir bölü çizgisi (/) ile başlatılabileceği gibi istemci tarafından çözümlenecek tam bir URL şeklinde de belirtilebilir. Bunlar yerine, tarayıcıda gösterilmek üzere bir ileti de belirtilebilir. Örnekler:

ErrorDocument 500 http://hata.meselae.dom/cgi-bin/dnmci
ErrorDocument 404 /cgi-bin/bad_urls.pl
ErrorDocument 401 /subscription_info.html
ErrorDocument 403 "Kusura bakmayın, bugün hizmet veremiyoruz."

Bunlardan başka, Apache’nin kendi hata iletilerinin kullanılacağı özel default değeri ile belirtilebilir. Normal şartlar altında gerekmese de, bir şey belirtilmediği takdirde mevcut bir ErrorDocument yönergesini miras alan yapılandırmalarda Apache’nin kendi hata iletilerinin kullanımı default değeri açıkça belirtilerek örnekteki gibi zorlanabilir:

ErrorDocument 404 /cgi-bin/bad_urls.pl

<Directory /web/docs>
ErrorDocument 404 default
 </Directory>

ErrorDocument yönergesinde bir uzak URL (önünde http bulunan bir yol) belirtildiğinde, belge aynı sunucuda olsa bile, Apache’nin istemciye belgeyi bulacağı yer için bir yönlendirme göndereceğine dikkat ediniz. Bunun bazı istenmeyen etkileri vardır; en önemlilerinden biri istemcinin hata kodu yerine bir yönlendirme durum kodu alacak olmasıdır. Bu, bir URL’nin geçerliliğini durum koduna göre saptayan istemciler veya robotlar için yanıltıcı olacaktır. Buna ek olarak, ErrorDocument 401 için bir uzak URL belirttiğiniz durumda istemci 401 durum kodunu almayacağı için kullanıcıdan parola isteğinde bulunamayacaktır. Bu bakımdan, ihtiyaç duyduğunuz takdirde, ErrorDocument 401 yönergesine yerel bir belge belirtmelisiniz.

Sunucunun ürettiği hata iletileri "çok kısa" olduğu takdirde, Microsoft Internet Explorer (MSIE) öntanımlı olarak bu hata iletilerini yoksayar ve bunun yerine kendi "kullanıcı dostu" hata iletilerini kullanır. "Çok kısa" eşiği duruma göre değişmekle birlikte, genellikle, hata iletileriniz 512 bayttan büyük olduğu takdirde MSIE kendi hata iletileri yerine sunucunun ürettiği hata iletilerini gösterecektir. Bu konuda daha fazla bilgiyi Q294807 kodlu Microsoft Knowledge Base makalesinde bulabilirsiniz.

Çoğu yerleşik hata iletisi özel iletilerle değiştirilebilse de bazı durumlarda ErrorDocument ile ne belirtildiğine bakılmaksızın yerleşik hata iletileri kullanılır. Özellikle, bozuk bir istek saptandığında normal istek işleme hemen devre dışı bırakılır ve yerleşik hata iletisi döndürülür. Bu, hatalı istekler yaparak güvenlik sorunlarına yol açılmak istenmesi durumlarında gereklidir.

mod_proxy kullanıyorsanız, gerekirse vekili olunan sunucu yararına özel hata iletileri üretmenizi sağlayabilen ProxyErrorOverride yönergesini etkin kılabilirsiniz. Bu yönergeyi etkinleştirmezseniz Apache vekaleten sunulan içerik için özel hata sayfaları üretmeyecektir.

2.0 öncesi sürümlerde iletiler bir çift çift-tırnak içine alınmayıp, tek bir çift-tırnak ile başlatılması yeterli olurdu.

Ayrıca bakınız:

  • Özel Hata Yanıtları

ErrorLog Yönergesi

Açıklama: | Sunucunun hata günlüğünü tutacağı yeri belirler.
Sözdizimi: | ErrorLog dosya-yolu|syslog[:oluşum]
Öntanımlı: | ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows ve OS/2)
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

ErrorLog yönergesi sunucunun saptadığı hataları kaydedeceği dosyanın ismini belirtmek için kullanılır. dosya-yolu ile göreli dosya yolu belirtildiği takdirde dizininin ServerRoot ile belirtilen sunucu kök dizinine göre belirtildiği varsayılır.

Örnek

ErrorLog /var/log/httpd/error_log

dosya-yolu bir boru imi "|" ile başlatıldığı takdirde hata iletilerinin hata günlüğünü işleme sokacak komuta borulanacağı varsayılır.

Örnek

ErrorLog "|/usr/local/bin/httpd_errors"

Daha fazla bilgi edinmek için borulu günlükler ile ilgili ek bilgilere bakınız.

Dosya adı yerine syslog kullanılırsa, sistem desteklediği takdirde günlük kaydı syslogd(8) üzerinden yürütülür. Öntanımlı olarak local7 syslog oluşumu kullanılır. Bunu syslog:oluşum sözdizimini kullanarak değiştirebilirsiniz. Buradaki oluşum syslog.conf(5) kılavuz sayfasında belirtilen oluşum isimlerinden biri olabilir.

Örnek

ErrorLog syslog:user

GÜVENLİK: Günlük dosyalarının saklandığı dizin, sunucuyu başlatan kullanıcı dışındakiler tarafından yazılabilir olduğu takdirde güvenliğinizin nasıl tehlikeye gireceği güvenlik ipuçları belgesinde ayrıntılı olarak açıklanmıştır.

Ek Bilgi

Unix-dışı platformlarda dosya yolunu girerken, platform ters bölü çizgilerini desteklese bile normal bölü çizgileri kullanmaya özen göstermelisiniz. Genel olarak, dosya yollarını belirtirken yapılandırma dosyası boyunca normal bölü çizgisi kullanmak her zaman daha iyidir.

Ayrıca bakınız:

  • LogLevel
  • Apache Günlük Dosyaları

FileETag Yönergesi

Açıklama: | ETagDuruk dosyalar için HTTP yanıt başlığını oluşturmakta kullanılacak dosya özniteliklerini belirler.
Sözdizimi: | FileETag bileşen ...
Öntanımlı: | FileETag INode MTime Size
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core

FileETag yönergesi, belge bir duruk dosyaya dayandığı takdirde ETag (Entity Tag - öğe etiketi kısaltması) yanıt başlığı alanını oluşturmakta kullanılacak dosya özniteliklerini yapılandırır. (ETag değeri, ağ band genişliğinden kazanmak için arabellek yönetiminde kullanılır.) Apache 1.3.22 ve öncesinde ETag değeri daima dosyanın düğümü, boyutu ve son değişiklik zamanından (mtime) oluşurdu. FileETag yönergesi ne kullanılması gerektiğini belirleyebilmenizi sağlar. Değer olarak belirtilebilecek anahtar sözcükler şunlardır:

INode
Dosyanın düğüm numarası hesaba katılır.
MTime
Dosyanın son değişiklik tarih ve saati dahil edilir.
Size
Dosyanın bayt cinsinden uzunluğu dahil edilir.
All
Olası tüm alanlar kullanılır. Bu şuna eşdeğerdir:

FileETag INode MTime Size

None
Bir belge dosyasıyla sunulsa bile yanıta hiçbir ETag alanı dahil edilmez.

Öntanımlı ayarları miras alıp bunların kapsamını genişletmek/daraltmak için INode, MTime ve Size anahtar sözcüklerinin önüne + veya - imi konabilir. Bu imlerin bulunmadığı bir anahtar sözcüğün varlığı halinde hiçbir değer miras alınmaz.

Eğer bir dizinin yapılandırması FileETag INode MTime Size ve alt dizini FileETag -INode içeriyorsa bu alt dizinin (ve bir geçersizleştirme olmadığı takdirde onun alt dizinlerinin) ayarları FileETag MTime Size yapılandırmasına eşdeğer olacaktır.

Uyarı

WebDAV’ın etkin olduğu yerlerde veya dizinlerde saklama alanı sağlayıcı olarak mod_dav_fs kullanılıyorsa öntanımlı ayarları değiştirmeyiniz. mod_dav_fs, koşullu isteklerde ETag karşılaştırmaları yapabilmek için INode MTime Size yapılandırmasını kullanır. Eğer ETag ayarı FileETag yönergesi kullanılarak değiştirilirse koşullu istekler gerektiği gibi yerine getirilemez.

Sunucu Taraflı İçerik (SSI)

mod_include tarafından çözümlenen yanıtlar için bie ETag üretilmez. Bunun sebebi, gömülü SSI yönergeleri ile duruk dosyanın boyutunda, değişiklik zamanında ve dosya düğümünde bir değişiklik olmaksızın yanıt öğesinin değişebilmesidir.

<Files> Yönergesi

Açıklama: | Dosya isimleriyle eşleşme halinde uygulanacak yönergeleri içerir.
Sözdizimi: | <Files dosya-adı> ... </Files>
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

<Files> yönergesi, içerdiği yönergelerin etki alanını dosya isimlerine göre sınırlandırır. <Directory> ve <Location> bölümleri ile karşılaştırılabilir. Bir </Files> yönergesi ile sonlandırılması gerekir. Bu bölüm içinde belirtilen yönergeler, <Files> yönergesinde belirtilen dosya-adı’nın son bileşeniyle (dizinler atıldıktan sonda kalan dosya ismi) eşleşen nesnelere uygulanır. <Files> bölümleri yapılandırma dosyasında, <Directory> bölümleri ve .htaccess dosyaları okunduktan sonra fakat <Location> yönergelerinden önce göründükleri sıraya göre işleme sokulurlar. <Files> bölümlerinin <Directory> bölümlerinin içinde uygulama alanını sınırlamak amacıyla kullanılabileceğine dikkat ediniz.

dosya-adı argümanının bir dosya ismi veya bir dosya ismi kalıbı içermesi gerekir. Bir dosya ismi kalıbındaki her ? imi bir karakterle eşleştirilirken * imi karakter dizileri ile eşleştirilir:

<Files "cat.html">
    # cat.html dosyasına uygulanacaklar buraya.
</Files>

<Files "?at.*">
    # cat.html, bat.html, hat.php ve benzerlerine uygulanacaklar buraya.
</Files>

~ imine ek olarak düzenli ifadeler de kullanılabilir. Örneğin

<Files ~ "\.(gif|jpe?g|png)$">

satırı en bilinen resim dosyası biçimleriyle eşleşecektir. Bunun yerine <FilesMatch> yönergesi de tercih edilebilirdi.

<Directory> ve <Location> bölümlerinin aksine, <Files> bölümleri .htaccess dosyaları içinde kullanılabilir. Bu sayede kullanıcıların kendi dosyalarına erişimi dosya seviyesinde denetlemelerine imkan sağlanmış olur.

Ayrıca bakınız:

  • Bir istek alındığında farklı yapılandırma bölümlerinin nasıl bir arada ele alındığının açıklaması için <Directory>, <Location> ve <Files> bölümleri nasıl çalışır? belgesine bakınız.

<FilesMatch> Yönergesi

Açıklama: | Düzenli ifadelerin dosya isimleriyle eşleşmesi halinde uygulanacak yönergeleri içerir.
Sözdizimi: | <FilesMatch düzifd> ... </FilesMatch>
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

<FilesMatch> yönergesi, içerdiği yönergelerin etki alanını <Files> yönergesinin yaptığı gibi dosya isimlerine göre sınırlandırır. Ancak, argüman olarak bir düzenli ifade kabul eder. Örneğin

<FilesMatch "\.(gif|jpe?g|png)$">

satırı en bilinen resim dosyası biçimleriyle eşleşecektir.

Ayrıca bakınız:

  • Bir istek alındığında farklı yapılandırma bölümlerinin nasıl bir arada ele alındığının açıklaması için <Directory>, <Location> ve <Files> bölümleri nasıl çalışır? belgesine bakınız.

ForceType Yönergesi

Açıklama: | Bütün dosyaların belirtilen MIME içerik türüyle sunulmasına sebep olur.
Sözdizimi: | ForceType MIME-türü|None
Bağlam: | dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache 2.0’da core modülüne taşındı.

Bu yönerge, bir .htaccess dosyası veya bir <Directory>, <Location> veya <Files> bölümüne yerleştirildiği zaman, eşleşen tüm dosyaların MIME-türü ile belirtilen içerik türüyle sunulmasına sebep olur. Örneğin, altında sadece GIF dosyaları bulunan bir dizininiz varsa ve bunlara tek tek .gif uzantısı belirtmek istemiyorsanız şu yapılandırmayı kullanabilirsiniz:

ForceType image/gif

DefaultType yönergesinin tersine bu yönerge ortam türünü betimleyen tüm MIME-türü tanımlarını geçersiz kılar.

Mevcut ForceType ayarlarını None değeriyle geçersiz kılabilirsiniz:

# tüm dosyaların image/gif olarak sunulması için:
<Location /images>
ForceType image/gif
 </Location>

# normal MIME-türüne geri dönmek için:
<Location /images/mixed>
ForceType None
 </Location>

GprofDir Yönergesi

Açıklama: | gmon.out profilleme verisinin yazılacağı dizin.
Sözdizimi: | GprofDir /tmp/gprof/|/tmp/gprof/%
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

Sunucu gprof profilleme desteği ile derlendiği takdirde GprofDir yönergesi, süreç çıkarken gmon.out dosyalarının belirtilen dizine yazılmasını sağlar. Eğer değistirge yüzde simgesi (%) ile bitirilirse her süreç kimliği (PID) için ayrı bir aldizin oluşturulur.

Bu yönerge sadece prefork MPM ile çalışır.

HostnameLookups Yönergesi

Açıklama: | İstemci IP adresleri üzerinde DNS sorgularını etkin kılar.
Sözdizimi: | HostnameLookups On|Off|Double
Öntanımlı: | HostnameLookups Off
Bağlam: | sunucu geneli, sanal konak, dizin
Durum: | Çekirdek
Modül: | core

Bu yönerge oturum açabilecek konak isimlerini tespit edebilmek için DNS sorgularını etkin kılar (ve sonuç REMOTE_HOST’ta belirtilerek CGI/SSI’lere aktarılır). Double değeri sorgunun çift yönlü yapılacağını belirtir. Yani, bir tersine sorgunun ardından bir normal sorgu yapılır. Normal sorguda elde edilen IP adreslerinden birinin istek yapan IP adresi ile eşleşmesi gerekir. ("tcpwrappers" terminolojisinde buna PARANOID adı verilir.)

Konak ismine göre erişimi denetlemek için mod_authz_host kullanıldığında, nasıl bir ayar yapıldığına bakılmaksızın, çift yönlü sorgulama yapılır. Bu güvenlik için gereklidir. Bunun dışında açıkça HostnameLookups Double belirtilmedikçe genellikle çift yönlü sorgulama yapılmaz. Örneğin, sadece HostnameLookups On belirtilmiş ve konak ismi kısıtlamalarıyla korunmuş bir nesne için bir istek yapılmışsa çift yönlü sorgunun başarısına bakılmaksızın CGI’lere REMOTE_HOST olarak tek yönlü sorgu sonucu aktarılır.

Gerçekte ters yönlü sorguya gerek duyulmayan sitelerde ağ trafiğini yormamak için Off, öntanımlı değerdir. Ayrıca, son kullanıcıların DNS sorguları nedeniyle gereksiz yere bir beklemeye maruz kalmaması için de bu daha iyidir. Yükü zaten ağır olan sitelerde, DNS sorgularının görece uzun zaman alması nedeniyle bu yönergenin değeri Off olarak bırakılmalıdır. Öntanımlı olarak kurulum dizininizin bin alt dizinine kurulan logresolve uygulaması kullanılarak oturum açan IP adresleri için isim sorguları çevrim dışıyken yapılabilir.

<IfDefine> Yönergesi

Açıklama: | Başlatma sırasında bir doğruluk sınamasından sonra işleme sokulacak yönergeleri sarmalar.
Sözdizimi: | <IfDefine [!]parametre-adı> ... </IfDefine>
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

<IfDefine sınama>...</IfDefine> bölümü koşullu olarak işleme sokulacak yönergeleri içerir. Bir <IfDefine> bölümü içindeki yönergeler sadece sınama doğru sonuç verirse işleme sokulur. Aksi takdirde, bölüm içinde kalan her şey yok sayılır.

<IfDefine> bölüm yönergesinde sınama için belirtilebilecek iki biçim vardır:

  • parametre-adı
  • !parametre-adı

Birinci durumda bölüm içinde kalan yönergeler sadece parametre-adı ile belirtilen parametre tanımlı ise işleme sokulur. İkinci durumda ise tersi yapılır, yani sadece parametre-adı ile belirtilen parametre tanımlı değil ise yönergeler işleme sokulur.

parametre-adı argümanı sunucu başlatılırken httpd komut satırında -Dparametre ile belirtilerek tanımlı hale getirilebilir.

<IfDefine> bölümleri iç içe olabilir, dolayısıyla çok parametreli basit sınamalar gerçeklenebilir. Örnek:

httpd -DReverseProxy -DUseCache -DMemCache ...

# httpd.conf
<IfDefine ReverseProxy>
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
<IfDefine UseCache>
LoadModule cache_module modules/mod_cache.so
<IfDefine MemCache>
LoadModule mem_cache_module modules/mod_mem_cache.so
 </IfDefine>
<IfDefine !MemCache>
LoadModule disk_cache_module modules/mod_disk_cache.so
 </IfDefine> </IfDefine> </IfDefine>

<IfModule> Yönergesi

Açıklama: | Belli bir modülün varlığına veya yokluğuna göre işleme sokulacak yönergeleri sarmalar.
Sözdizimi: | <IfModule [!]modül-dosyası|modül-betimleyici> ... </IfModule>
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Modül betimleyiciler 2.1 sürümünde ve sonrası için geçerlidir.

<IfModule sınama>...</IfModule> bölümü belli bir modülün varlığına veya yokluğuna göre işleme sokulacak yönergeleri içerir. Bir <IfModule> bölümü içindeki yönergeler sadece sınama doğru sonuç verirse işleme sokulur. Aksi takdirde, bölüm içinde kalan her şey yok sayılır.

<IfModule> bölüm yönergesinde sınama için belirtilebilecek iki biçim vardır:

  • modül
  • !modül

Birinci durumda bölüm içinde kalan yönergeler sadece modül ile belirtilen modül Apache içine dahil edilmişse veya LoadModule yönergesi ile devingen olarak yüklenmişse işleme sokulur. İkinci durumda ise tersi yapılır, yani sadece modül içerilmiş değil ise yönergeler işleme sokulur.

modül argümanında bir modül betimleyici veya modülün derleme sırasındaki dosya adı belirtilebilir. Örneğin, rewrite_module bir betimleyici, mod_rewrite.c ise bir dosya ismidir. Eğer modül çok sayıda kaynak dosyasından oluşuyorsa STANDARD20_MODULE_STUFF dizgesini içeren dosyanın ismi kullanılır.

<IfModule> bölümleri iç içe olabilir, dolayısıyla çok parametreli basit sınamalar gerçeklenebilir.

Bu bölümü sadece yapılandırma dosyanızın belli modüllerin varlığına veya yokluğuna bağlı olarak çalışması gerektiği durumlarda kullanmalısınız. Normal işlemlerde yönergelerin <IfModule> bölümlerine yerleştirilmeleri gerekmez.

Include Yönergesi

Açıklama: | Sunucu yapılandırma dosyalarının başka dosyaları içermesini sağlar.
Sözdizimi: | Include dosya-yolu|dizin-yolu
Bağlam: | sunucu geneli, sanal konak, dizin
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Dosya kalıbıyla eşleşme 2.0.41 ve sonrasında mevcuttur.

Bu yönerge sunucu yapılandırma dosyalarının başka dosyaları içermesini mümkün kılar.

Çok sayıda dosyayı bir kerede alfabetik sırada içermek için kabuk tarzı (fnmatch()) dosya ismi kalıp karakterleri kullanılabilir. Ayrıca, eğer Include yönergesi bir dosya değil de bir dizin gösteriyorsa Apache bu dizindeki ve alt dizinlerindeki bütün dosyaları okuyacaktır. Fakat dizinin bir bütün olarak okutulması önerilmez, çünkü dizinde httpd programının çökmesine sebep olabilecek geçici dosyalar unutulabilir.

Dosya yolu mutlak bir dosya yolu olarak belirtilebileceği gibi ServerRoot dizinine göreli olarak da belirtilebilir.

Örnekler:

Include /usr/local/apache2/conf/ssl.conf
Include /usr/local/apache2/conf/vhosts/*.conf

Veya dizinler ServerRoot dizinine göre belirtilebilir:

Include conf/ssl.conf
Include conf/vhosts/*.conf

Ayrıca bakınız:

  • apachectl

KeepAlive Yönergesi

Açıklama: | HTTP kalıcı bağlantılarını etkin kılar
Sözdizimi: | KeepAlive On|Off
Öntanımlı: | KeepAlive On
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

Keep-Alive yönergesi HTTP/1.0 protokolüne bir eklenti olup HTTP/1.1 protokolünün kalıcı bağlantı özelliği aynı TCP bağlantısı üzerinden çok sayıda isteğin gönderilmesini mümkün kılan uzun süreli HTTP oturumları açılmasını sağlar. Bunun, çok sayıda resim içeren HTML belgelerin yanıt zamanlarında bazı durumlarda %50’lik bir hızlanmayla sonuçlandığı gösterilmiştir. Kalıcı bağlantıları etkin kılmak için yönerge KeepAlive On şeklinde kullanılır.

HTTP/1.0 istemcileri için kalıcı bağlantılar sadece bir istemci tarafından özellikle istendiği takdirde kullanılabilir. Ek olarak, HTTP/1.0 istemci kalıcı bağlantıları sadece içerik uzunluğu baştan bilindiği zaman kullanılabilir. Bu, CGI çıktısı, SSI sayfaları ve sunucunun ürettiği dizin listeleri gibi genellikle HTTP/1.0 istemcilere kalıcı bağlantılar kullanmayan devingen içeriklere uygulanır. HTTP/1.1 istemciler için kalıcı bağlantılar aksi belirtilmedikçe öntanımlıdır. İstemci istediği takdirde, uzunluğu bilinmeyen içerik kalıcı bağlantılar üzerinden gönderilirken parçalı kodlama kullanılacaktır.

Bir istemci kalıcı bağlantı kullandığı takdirde, bağlantı üzerinden kaç istek gönderilirse gönderilsin, MaxRequestsPerChild yönergesi bakımından tek bir istek olarak değerlendirilir.

Ayrıca bakınız:

  • MaxKeepAliveRequests

KeepAliveTimeout Yönergesi

Açıklama: | Bir kalıcı bağlantıda sunucunun bir sonraki isteği bekleme süresi
Sözdizimi: | KeepAliveTimeout saniye
Öntanımlı: | KeepAliveTimeout 5
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

Sunucunun kalıcı bir bağlantıyı kapatmadan önce bir sonraki isteği kaç saniye bekleyeceğini belirler. İstek alındıktan sonra Timeout yönergesiyle belirtilen zaman aşımı değeri uygulanır.

KeepAliveTimeout için yüksek bir değer belirtmek ağır yüklü sunucularda başarım sorunlarına yol açar. Daha yüksek bir zaman aşımı, boştaki istemcilerin bulunduğu bağlantıları bekleyen daha fazla sunucu sürecini meşgul edecektir.

İsme dayalı sanal konak bağlamında, NameVirtualHost bölümleri içinde tanımlanmış ilk sanal konağın (öntanımlı konak) değeri kullanılır. Diğer değerler görmezden gelinir.

<Limit> Yönergesi

Açıklama: | Erişimi sınırlanacak HTTP yöntemleri için erişim sınırlayıcıları sarmalar.
Sözdizimi: | <Limit yöntem [yöntem] ... > ... </Limit>
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

Erişim denetleyicileri normalde tüm erişim yöntemleri için etkindir ve olağan olanı da budur. Genel durum olarak, erişim denetim yönergeleri bir <Limit> bölümüne yerleştirilmemelidir.

<Limit> bölümünün amacı, erişim denetleyicilerinin etkilerini belli HTTP yöntemleri için sınırlamaktır. <Limit> bölümü içinde listelenen erişim sınırlamaları, kalan tüm diğer yöntemler için etkisiz olacaktır. Aşağıdaki örnekte, erişim sınırlaması POST, PUT ve DELETE yöntemleri için uygulanmakta, diğer tüm yöntemler korumasız bırakılmaktadır:

<Limit POST PUT DELETE>
Require valid-user
 </Limit>

Birden fazla bölümde kullanılabilecek yöntem isimleri: GET, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, LOCK ve UNLOCK. Yöntem isimleri harf büyüklüğüne duyarlıdır. GET yöntemi sınırlanırsa HEAD istekleri de sınırlanmış olur. TRACE yöntemi sınırlanamaz.

Erişimi sınarlarken bir <Limit> bölümü yerine daima bir <LimitExcept> bölümünü tercih etmelisiniz, çünkü <LimitExcept> bölümü belirtilen yöntemler dışında kalanlara erişim koruması sağlar.

<LimitExcept> Yönergesi

Açıklama: | İsimleri belirtilenler dışında kalan HTTP yöntemleri için kullanılacak erişim sınırlayıcıları sarmalar.
Sözdizimi: | <LimitExcept yöntem [yöntem] ... > ... </LimitExcept>
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

<LimitExcept> ve </LimitExcept> argüman olarak belirtilenler dışında kalan HTTP yöntemleri için kullanılacak erişim sınırlayıcıları gruplamakta kullanılır. Yani, <Limit> bölümünün tersine, standart olsun olmasın bütün yöntemler için erişimi kısıtlamakta kullanılabilir. Daha ayrıntılı bilgi edinmek için <Limit> yönergesinin açıklamasına bakınız.

Örnek:

<LimitExcept POST GET>
Require valid-user
 </LimitExcept>

LimitInternalRecursion Yönergesi

Açıklama: | Dahili yönlendirmelerin ve istek içi isteklerin azami sayısını belirler.
Sözdizimi: | LimitInternalRecursion sayı [sayı]
Öntanımlı: | LimitInternalRecursion 10
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache 2.0.47 ve sonrasında mevcuttur.

Örneğin, özgün istekleri dahili olarak bir CGI betiğine yönlendiren Action yönergesi kullanıldığında bir dahili yönlendirme oluşur. İstek içi istekler ise bazı URI’ler için istek yapıldığında ne olacağını bulmak için Apache’nin kullandığı bir mekanizmadır. Örneğin, mod_dir, DirectoryIndex yönergesinde listelenen dosyalara bakmak için istek içi istekler kullanır.

LimitInternalRecursion yönergesi sunucunun dahili yönlendirmeler ve istek içi isteklerin oluşturduğu döngülerden dolayı çökmemesini sağlar. Böyle döngüler genellikle yanlış yapılandırma sonucu ortaya çıkarlar.

Yönerge her istek için değerlendirmeye alınacak iki farklı sınırlama için kullanılabilir. İlk sayı ardarda gelebilen dahili yönlendirmelerin azami sayısını, ikinci sayı ise istek içi isteklerin ne kadar iç içe olabileceğini belirler. Tek bir sayı belirtilirse iki sınırlama için de aynı değer kullanılır.

Örnek

LimitInternalRecursion 5

LimitRequestBody Yönergesi

Açıklama: | İstemci tarafından gönderilen HTTP istek gövdesinin toplam uzunluğunu sınırlar.
Sözdizimi: | LimitRequestBody bayt-sayısı
Öntanımlı: | LimitRequestBody 0
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

Bu yönerge, bir istek gövdesinde izin verilen bayt sayısını 0 (sınırsız anlamında) ile 2147483647 (2GB) arasında sınırlamak için kullanılır.

LimitRequestBody yönergesi kullanıcıya yönergenin kullanıldığı bağlam (sunucu, belli bir dizin, belli bir dosya, belli bir yer) dahilinde bir HTTP istek iletisi gövdesinin izin verilen uzunluğu için bir sınır belirleme imkanı verir. Eğer istemcinin isteği bu sınırı aşarsa sunucu isteği sunmak yerine bir hata iletisi döndürecektir. Normal bir istek ileti gövdesinin uzunluğu büyük oranda özkaynağın doğasına ve bu özkaynak üzerinde izin verilen yöntemlere bağlıdır. CGI betikleri genellikle ileti gövdesini form bilgisini almak için kullanır. PUT yöntemi gerçeklenimleri, en azından, sunucunun o özkaynak için kabul etmek isteyeceği herhangi bir gösterim kadar büyük bir değer gerektirecektir.

Bu yönerge, bazı hizmet reddi (DoS) saldırılarından kaçınmak için sunucu yöneticilerine, anormal istemci istekleri üzerinde daha iyi denetim imkanı sağlar.

Eğer, örneğin, belli bir yere dosya yükleme izni verir ve buraya yüklenebilecek dosya boyutunu 100 kB ile sınırlamak isterseniz yönergeyi şöyle kullanabilirsiniz:

LimitRequestBody 102400

Dikkat: Vekil isteklerine uygulanamaz.

LimitRequestFields Yönergesi

Açıklama: | İstemciden kabul edilecek HTTP isteği başlık alanlarının sayısını sınırlar.
Sözdizimi: | LimitRequestFields sayı
Öntanımlı: | LimitRequestFields 100
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

sayı, en küçük 0 (sınırsız anlamında), en büyük 32767 olabilir. Öntanımlı değer bir derleme zamanı sabiti olan DEFAULT_LIMIT_REQUEST_FIELDS ile belirlenir (dağıtımla gelen değeri 100’dür).

LimitRequestFields yönergesi sunucu yöneticilerine bir HTTP isteğinde izin verilen istek başlık alanlarının sayısı üzerindeki sınırı değiştirebilme imkanı verir. Sunucu bu değerin, normal bir istemci isteğinin içerebileceği alan sayısından daha büyük olmasına ihtiyaç duyar. Bir istemci tarafından kullanılan istek başlık alanlarının sayısı nadiren 20’yi geçer, fakat bu farklı istemci gerçeklenimleri için değişiklik gösterir ve çoğunlukla kullanıcının tarayıcısını ayrıntılı içerik müzakeresini desteklemek için nasıl yapılandırdığıyla ilgilidir. İsteğe bağlı HTTP eklentileri çoğunlukla istek başlık alanları kullanılarak ifade edilir.

Bu yönerge, bazı hizmet reddi (DoS) saldırılarından kaçınmak için sunucu yöneticilerine, anormal istemci istekleri üzerinde daha iyi denetim imkanı sağlar. Eğer normal istemciler sunucudan istekte bulunurken çok fazla başlık alanı gönderildiğine dair bir hata iletisi alırlarsa bu değerin arttırılması gerekir.

Örnek:

LimitRequestFields 50

Uyarı

İsme dayalı sanal konaklar kullanılıyorsa bu yönergenin değeri, bağlantının eşleştirildiği ilk NameVirtualHost yönergesinden (listedeki ilk - öntanımlı - konak) alınır.

LimitRequestFieldSize Yönergesi

Açıklama: | İstemciden kabul edilecek HTTP isteği başlık uzunluğunu sınırlar.
Sözdizimi: | LimitRequestFieldSize bayt-sayısı
Öntanımlı: | LimitRequestFieldSize 8190
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

Bu yönerge, HTTP istek başlığında izin verilecek bayt sayısını belirler.

LimitRequestFieldSize yönergesi, sunucu yöneticilerine HTTP istek başlık alanının azami uzunluğunu belirtme imkanı verir. Sunucu bu değerin, normal bir istemci isteğinin içerebileceği herhangi bir başlık alanını tutabilecek kadar büyük olmasını gerektirir. Normal bir istek başlık alanı uzunluğu kullanıcının tarayıcısını ayrıntılı içerik müzakeresini desteklemek için nasıl yapılandırdığıyla ilgilidir. SPNEGO kimlik doğrulama başlıkları 12392 baytlık olabilir.

Bu yönerge, bazı hizmet reddi (DoS) saldırılarından kaçınmak için sunucu yöneticilerine, anormal istemci istekleri üzerinde daha iyi denetim imkanı sağlar.

Örnek:

LimitRequestFieldSize 4094

Normal şartlar altında öntanımlı değer değiştirilmemelidir.

Uyarı

İsme dayalı sanal konaklar kullanılıyorsa bu yönergenin değeri, bağlantının eşleştirildiği ilk NameVirtualHost yönergesinden (listedeki ilk - öntanımlı - konak) alınır.

LimitRequestLine Yönergesi

Açıklama: | İstemciden kabul edilecek HTTP istek satırının uzunluğunu sınırlar.
Sözdizimi: | LimitRequestLine bayt-sayısı
Öntanımlı: | LimitRequestLine 8190
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

Bu yönerge, HTTP istek satırında izin verilecek bayt sayısını belirler.

LimitRequestLine yönergesi, sunucu yöneticilerine bir istemcinin HTTP istek satırının azami uzunluğunu belirleme imkanı verir. İstek satırının içeriği HTTP yöntemi, URI ve protokol sürümünden oluştuğundan LimitRequestLine yönergesi, sunucudan bir istek için kullanılan istek adresinin uzunluğunu sınırlamış olur. Sunucu bu değerin, bir GET isteğinin sorgu kısmında aktarılabilen her bilgi dahil, özkaynak isimlerinden her birini tutabilecek kadar büyük olmasını gerektirir.

Bu yönerge, bazı hizmet reddi (DoS) saldırılarından kaçınmak için sunucu yöneticilerine, anormal istemci istekleri üzerinde daha iyi denetim imkanı sağlar.

Örnek:

LimitRequestLine 4094

Normal şartlar altında öntanımlı değer değiştirilmemelidir. Ayrıca, kaynak kodda değişiklik yapıp, yeniden derlemedikçe bu değerin azamisi 8190 olarak kalacaktır.

Uyarı

İsme dayalı sanal konaklar kullanılıyorsa bu yönergenin değeri, bağlantının eşleştirildiği ilk NameVirtualHost yönergesinden (listedeki ilk - öntanımlı - konak) alınır.

LimitXMLRequestBody Yönergesi

Açıklama: | Bir XML temelli istek gövdesinin uzunluğunu sınırlar.
Sözdizimi: | LimitXMLRequestBody bayt-sayısı
Öntanımlı: | LimitXMLRequestBody 1000000
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

Bir XML temelli istek gövdesinin azami bayt sayısını belirler. Değer olarak 0 belirtildiğinde herhangi bir boyut sınaması yapılmaz.

Örnek:

LimitXMLRequestBody 0

<Location> Yönergesi

Açıklama: | İçerdiği yönergeler sadece eşleşen URL’lere uygulanır.
Sözdizimi: | <Location URL-yolu|URL> ... </Location>
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

<Location> bölüm yönergesi kapsadığı yönergelerin etki alanını belirtilen URL’lerle sınırlar. Bu yönerge, <Directory> yönergesine benzer ve </Location> yönergesi ile biten bir alt bölüm başlatır. <Location> bölümleri yapılandırma dosyasında göründükleri sıraya göre, <Directory> bölümleri ve .htaccess dosyaları okunup <Files> bölümleri de işlendikten sonra işleme sokulurlar.

<Location> bölümleri dosya sisteminin tamamen dışında işlem görürler. Bunun çeşitli sonuçları olur. En önemlisi, <Location> yönergelerinin dosya sistemi konumlarına erişimi denetim altına almak için kullanılmaması gerekliliğidir. Aynı dosya sistemi konumuna farklı URL’lerle erişmek mümkün olduğundan bu tür erişim denetimleri hile ile atlatılabilir olacaktır.

URL-yolu bileşeni aşağıdaki koşullardan herhangi birine uyduğu takdirde kapsanan yönergeler isteğe uygulanacaktır:

  • URL'nin yol bileşeni belirtilen konum ile eşleşir.
  • URL'nin yol bileşeninin başındaki bölü çizgisi, belirtilen konumun sonundaki bölü çizgisi ile eşleşir (içeriğin kök dizini olarak ele alınır).
  • URL'nin yol bileşeninin başındaki bölü çizgisi, belirtilen konumun sonuna bir bölü çizgisi eklenerek bununla eşleşir (içeriğin kök dizini olarak ele alınır)

Aşağıdaki örnekte, sonda bir bölü çizgisi kullanılmamış olmasına rağmen /herhangi1, /herhangi1/ ve /herhangi1/dosya.txt dizgilerini içeren isteklere kapsanan yönergeler uygulanacak, ancak /herhangi1baskasi dizgisini içeren bir isteğe uygulanmayacaktır.

<Location /herhangi1> ...

Aşağıdaki örnekte, sonda bir bölü çizgisi kullanılmış olup, /herhangi2, /herhangi2/ ve /herhangi2/dosya.txt dizgilerini içeren isteklere kapsanan yönergeler uygulanacak, ancak /herhangi2baskasi dizgisini içeren bir isteğe uygulanmayacaktır.

<Location /private2/> ...

<Location> ne zaman kullanılmalı

<Location> yönergesini dosya sistemi dışındaki içeriğe çeşitli yönergeler uygulamak için kullanın. Dosya sisteminde bulunan içerik için <Directory> ve <Files> bölümlerini kullanın. Bunun istisnası, sunucunun tamamına bir yapılandırma uygulamak için kolay bir yol olan <Location /> kullanımıdır.

Kaynağa yapılan (vekil olmayan) tüm istekler için eşleşecek URL, /yol/ şeklinde bir URL yolu olmalı; ne şema, ne konak ismi ne port ne de sorgu dizgesi içermelidir. Vekil istekleri için eşleşecek URL ise şema://sunucuadı/dosya-yolu şeklinde olmalı ve önek içermelidir.

URL içinde dosya kalıp karakterleri kullanılabilir. Dosya kalıp karakterleri bulunan bir dizgede bulunan ? karakteri herhangi bir tek karakterle eşleşirken * karakteri herhangi bir karakter dizisi ile eşleşecektir. URL yolu içindeki / karakterleri ile hiçbir dosya kalıp karakteri eşleşmez.

Ayrıca, ~ karakteri eşliğinde düzenli ifadeler de kullanılabilir. Örneğin,

<Location ~ "/(ek|hususi)/veri">

yönergesi /ek/veri ve /hususi/veri alt dizgeleriyle eşleşecektir. <LocationMatch> yönergesi <Location> yönergesinin düzenli ifade sürümüne eşdeğer davranır.

<Location> işlevselliği özellikle SetHandler yönergesi ile birlikte kullanışlı olur. Örneğin, durum isteklerini etkin kılmak ama sadece mesela.dom’dan gelen isteklere izin vermek için şöyle bir uygulama yapabilirsiniz:

<Location /status>
SetHandler server-status
Order Deny,Allow
Deny from all
Allow from .mesela.dom
 </Location>

/ (bölü çizgisi) hakkında

Bölü çizgisinin URL içinde bulunduğu yere bağlı olarak özel anlamları vardır. Dosya sistemindeki çok sayıda yanyana kullanımının tek bir bölü çizgisi olarak ele alındığı duruma alışkın olanlar olabilir (yani, /home///foo ile /home/foo aynıdır). URL uzayında bunun böyle olması gerekli değildir. Eğer çok sayıda bölü çizgisini yanyana belirtmeniz gerekiyorsa <LocationMatch> yönergesinde ve <Location> yönergesinin düzenli ifadeli kullanımında bunu açıkça belirtmeniz gerekir.

Örneğin, <LocationMatch ^/abc> yönergesi /abc ile eşleşecek ama //abc ile eşleşmeyecektir. <Location> yönergesinin düzenli ifade içermeyen kullanımındaki davranış vekil isteklerinde kullanılana benzer ve doğrudan kaynağa yapılan (vekil olmayan) isteklerde çok sayıda bölü çizgisi dolaylı olarak tek bir bölü çizgisiyle eşleşecektir. Örneğin, <Location /abc/def> belirtirseniz ve istek /abc//def şeklinde olursa bu ikisi eşleşir.

Ayrıca bakınız:

  • Bir istek alındığında farklı yapılandırma bölümlerinin nasıl bir arada ele alındığının açıklaması için <Directory>, <Location> ve <Files> bölümleri nasıl çalışır? belgesine bakınız.

<LocationMatch> Yönergesi

Açıklama: | İçerdiği yönergeler sadece düzenli ifadelerle eşleşen URL’lere uygulanır.
Sözdizimi: | <LocationMatch düzifade> ... </LocationMatch>
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

<LocationMatch> yönergesi içerdiği yönergelerin etki alanını <Location> yönergesinin yaptığı gibi belirtilen URL’lerle sınırlar. Ancak argüman olarak basit bir dizge değil bir düzenli ifade alır. Örneğin,

<LocationMatch "/(ek|hususi)/veri">

yönergesi /ek/veri ve /hususi/veri alt dizgeleriyle eşleşecektir.

Ayrıca bakınız:

  • Bir istek alındığında farklı yapılandırma bölümlerinin nasıl bir arada ele alındığının açıklaması için <Directory>, <Location> ve <Files> bölümleri nasıl çalışır? belgesine bakınız.

LogLevel Yönergesi

Açıklama: | Hata günlüklerinin ayrıntı seviyesini belirler.
Sözdizimi: | LogLevel seviye
Öntanımlı: | LogLevel warn
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

LogLevel yönergesi hata günlüklerine kaydedilen hata iletilerinde hangi ayrıntılara yer verileceğini belirler (ErrorLog yönergesine bakınız). En yüksek önem derecesinden başlayarak olası seviye değerleri aşağıda sıralanmıştır:

Seviye | Açıklama | Örnek
emerg | Acil durumlar - sistem kullanışsız. | "Child cannot open lock file. Exiting" (Alt süreç kilit dosyasını açamıyor. Çıkılıyor)
alert | Ne yapılacaksa beklemeden yapılmalı. | "getpwuid: couldn't determine user name from uid" (getpwuid: Kullanıcı ismi numarasından saptanamadı)
crit | Kriz durumları. | "socket: Failed to get a socket, exiting child" (socket: bir soket alınamadı, alt süreç çıkıyor)
error | Hata durumları. | "Premature end of script headers" (Betik başlıkları beklenmedik şekilde bitti)
warn | Uyarı durumları. | "child process 1234 did not exit, sending another SIGHUP" (1234 alt süreci çıkmadı, başka bir SIGHUP gönderiliyor)
notice | Normal fakat önemli durum. | "httpd: caught SIGBUS, attempting to dump core in ..." (httpd: SIGBUS alındı, core dökümlenmeye çalışılıyor: ...)
info | Bilgilendirme. | "Server seems busy, (you may need to increase StartServers, or Min/MaxSpareServers)..." (Sunucu meşgul görünüyor, (StartServers veya Min/MaxSpareServers değerlerini arttırmanız gerekebilir)...)
debug | Hata ayıklama seviyesi iletileri | "Opening config file ..." (... yapılandırma dosyası açılıyor)

Belli bir seviye belirtildiğinde daha yüksek seviyeden iletiler de raporlanır. Örneğin, LogLevel info belirtildiğinde notice ve warn günlük seviyelerinin iletileri ayrıca raporlanacaktır.

En az crit seviyesinin kullanılması önerilir.

Örnek:

LogLevel notice

Ek Bilgi

Günlük iletileri normal bir dosyaya yazılırken notice seviyesinden iletiler engellenemez ve dolayısıyla daima raporlanırlar. Ancak, günlük kaydı syslog kullanılarak yapılıyorsa bu uygulanmaz.

MaxKeepAliveRequests Yönergesi

Açıklama: | Bir kalıcı bağlantıda izin verilen istek sayısı
Sözdizimi: | MaxKeepAliveRequests sayı
Öntanımlı: | MaxKeepAliveRequests 100
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

MaxKeepAliveRequests yönergesi KeepAlive etkinken bağlantı başına izin verilecek istek sayısını sınırlar. Değer olarak 0 belirtilirse istek sayısı sınırsız olur. Sunucu başarımını yüksek tutmak için yüksekçe bir değer belirtmenizi öneririz.

Örnek:

MaxKeepAliveRequests 500

MaxRanges Yönergesi

Açıklama: | Özkaynağın tamamı döndürülmeden önce gönderilebilecek HTTP range başlıklarının azami miktarı
Sözdizimi: | MaxRanges default | unlimited | none | miktar
Öntanımlı: | MaxRanges 200
Bağlam: | sunucu geneli, sanal konak, dizin
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache HTTP Sunucusunun 2.2.21 ve sonraki sürümlerinde kullanılabilir.

MaxRanges yönergesi, sunucunu istemciye gönderebileceği HTTP range başlıklarının sayısını sınırlamak için kullanılır. Eğer izin verilenden daha fazla range başlığı istenirse fazlalık yerine özkaynağın tamamı gönderilir.

default
Sayı derleme sırasında 200 olarak belirlenmiştir.
none
Range başlıkları yoksayılır.
unlimited
Sunucunun gönerebileceği başlık sayısı sınırlanmaz.
miktar
Sunucunun gönderebileceği azami HTTP range başlık sayısını gösteren bir pozitif tamsayı.

MergeTrailers Yönergesi

Açıklama: | Determins whether trailers are merged into headers
Sözdizimi: | MergeTrailers [on|off]
Öntanımlı: | MergeTrailers off
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core
Uyumluluk: | 2.4.10 and later

Bu yönergenin belgesi henüz Türkçeye çevrilmedi. Lütfen İngilizce sürümüne bakınız.

NameVirtualHost Yönergesi

Açıklama: | İsme dayalı sanal konaklar için IP adresi belirtir
Sözdizimi: | NameVirtualHost adres[:port]
Bağlam: | sunucu geneli
Durum: | Çekirdek
Modül: | core

NameVirtualHost yönergesi isme dayalı sanal konakları yapılandırmak isterseniz gerekli olur.

adres olarak bir konak ismi de belirtebilirsiniz ama daima bir IP adresi ve bir port kullanmanızı öneririz. Örnek:

NameVirtualHost 111.22.33.44:80

NameVirtualHost yönergesi ile sunucunun isme dayalı sanal konaklar için istekleri hangi IP adresinden alacağı belirtilir. Bu adres genellikle isme dayalı sanal konak isimleri çözümlendiğinde elde edilen IP adresidir. İstekleri bir güvenlik duvarının veya bir vekilin alıp sunucuya yönlendirdiği durumlarda ise bu adres sunucunun istekleri aldığı fiziksel arabirimin IP adresi olmalıdır. Çok sayıda adres üzerinde çok sayıda isme dayalı sanal konak varsa her adresin kendi yönergeleri olmalıdır.

Ek Bilgi

“Ana sunucu” ve _default_ sunucuların bir NameVirtualHost IP adresine yapılan bir isteği asla sunmayacağına dikkat ediniz (bir sebeple NameVirtualHost belirtip bu adres için herhangi bir VirtualHost tanımlamadığınız durumlar hariç).

Seçimlik olarak, isme dayalı sanal konakların kullanması gereken port numarasını örnekteki gibi belirtebilirsiniz:

NameVirtualHost 111.22.33.44:8080

IPv6 adresleri belirtilirken örnekteki gibi köşeli ayraçlar arasına alınmalıdır:

NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080

İsteklerin bütün arabirimlerden alınacağını belirtmek için değer olarak *:80 veya eğer çok sayıda portu dinliyorsanız ve belli bir sanal konak kümesi üzerinden sunucunun hepsine yanıt vermesini istiyorsanız * belirtebilirsiniz:

NameVirtualHost *:80

<VirtualHost> yönergesinin argümanı

<VirtualHost> yönergesinin argümanının NameVirtualHost yönergesininkiyle tam olarak eşleşmesi gerektiğine dikkat ediniz.

NameVirtualHost 1.2.3.4:80
<VirtualHost 1.2.3.4:80>
# ...
</VirtualHost>

Ayrıca bakınız:

  • Apache Sanal Konak Belgeleri

Options Yönergesi

Açıklama: | Belli bir dizinde geçerli olacak özellikleri yapılandırır.
Sözdizimi: | Options [+|-]seçenek [[+|-]seçenek] ...
Öntanımlı: | Options All
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Options
Durum: | Çekirdek
Modül: | core

Options yönergesi belli bir dizinde hangi sunucu özelliklerinin etkin olacağını (veya olmayacağını) belirler.

seçenek olarak hiçbir ek özellik etkin olmayacaksa None, aksi takdirde aşağıdakilerden biri veya bir kaçı belirtilir:

All
MultiViews hariç tüm seçenekler. Bu öntanımlıdır.
ExecCGI
mod_cgi kullanan CGI betiklerinin çalışmasına izin verilir.
FollowSymLinks
Sunucu bu dizindeki sembolik bağları izler.

Sembolik bağlar izlense bile <Directory> bölümleriyle eşleşen dosya yolları değiştirilmez.

The FollowSymLinks ve SymLinksIfOwnerMatch Options yönergeleri sadece <Directory> bölümlerinde veya .htaccess dosyalarında çalışır.

Sembolik bağ sınamaları, atlatılabilir yarış koşullarına konu olduğundan bu seçeneğin yokluğu bir güvenlik sınırlaması olarak değerlendirilmemelidir.

Includes
mod_include tarafından sağlanan sunucu taraflı içeriklere izin verilir.
IncludesNOEXEC
Sunucu taraflı içeriklere izin verilir fakat #exec cmd ve #exec cgi iptal edilir. Ancak, ScriptAlias’lı dizinlerdeki CGI betikleri için #include virtual hala mümkün olacaktır.
Indexes
İstenen URL bir dizin ile eşleşiyorsa ve bu dizin için bir DirectoryIndex (index.html gibi) belirtilmemişse mod_autoindex bu dizinin biçimlenmiş bir listesini döndürecektir.
MultiViews
mod_negotiation kullanılarak içerik uzlaştırmalı çok görünümlü içeriğe izin verilir.
SymLinksIfOwnerMatch
Sunucu sembolik bağları sadece sembolik bağın hedefi ile bulunduğu dizinin sahibinin aynı kullanıcı olması halinde izleyecektir.

Ek Bilgi

The FollowSymLinks ve SymLinksIfOwnerMatch Options yönergeleri sadece <Directory> bölümlerinde veya .htaccess dosyalarında çalışır.

Sembolik bağ sınamaları, atlatılabilir yarış koşullarına konu olduğundan bu seçenek bir güvenlik sınırlaması olarak değerlendirilmemelidir.

Normalde, bir dizine çok sayıda Options uygulanabilirse de, dizine en uygun olanı uygulanıp diğerleri yok sayılır; seçenekler katıştırılmaz (bkz, Bölümler Nasıl Katıştırılır?). Bununla birlikte, önüne bir + veya - simgesi konmuş seçenekler varsa, o seçenekler katıştırılır. Önüne + konmuş seçenekler mevcutlara eklenirken - konmuş seçenekler silinir.

Uyarı

+ veya - imli seçenekler içeren Options ile imsiz seçenekler içerenlerin karışık olarak kullanılması beklenmedik sonuçlara yol açması sebebiyle aslında geçersiz bir sözdizimidir.

Örneğin, + ve - imleri olmaksızın,

<Directory /web/docs>
Options Indexes FollowSymLinks
 </Directory>

<Directory /web/docs/spec>
Options Includes
 </Directory>

yapılandırmasıyla /web/docs/spec dizininde sadece Includes seçeneği etkin olacaktır. Bununla birlikte, ikinci Options yönergesinde + ve - imleri kullanılırsa,

<Directory /web/docs>
Options Indexes FollowSymLinks
 </Directory>

<Directory /web/docs/spec>
Options +Includes -Indexes
 </Directory>

yapılandırmasıyla /web/docs/spec dizininde FollowSymLinks ve Includes seçenekleri etkin olacaktır.

Ek Bilgi

-IncludesNOEXEC veya -Includes kullanımı, önceki ayarların ne olduğuna bakılmaksızın sunucu taraflı içeriğin tamamen iptaline sebep olur.

Herhangi bir başka değer belirtilmedikçe All öntanımlıdır.

Protocol Yönergesi

Açıklama: | Dinlenen bir soket için protokol
Sözdizimi: | Protocol protokol
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Windows üzerinde Apache 2.3.3 ve sonrasında diğerlerinde ise Apache 2.1.5 ve sonrasında kullanılabilmektedir.

Bu yönerge dinlenen belli bir soket için protokol belirtmek amacıyla kullanılır. Protokol, bir isteği hangi modülün işleyeceğini belirlemekte ve AcceptFilter yönergesi ile ilgili protokole özgü iyileştirmeleri uygulamakta kullanılır.

Bu yönergeyi sadece standartdışı portlar belirtecekseniz kullanın. Normalde http için 80, https için 443 portu kullanılır.

Örneğin, https'i standartdışı bir port üzerinde çalıştırıyorsanız bunu şöyle belirtebilirsiniz:

Protocol https

Kullandığınız protoklü ayrıca Listen yönergesini kullanarak da belirtebilirsiniz.

Ayrıca bakınız:

  • AcceptFilter
  • Listen

Require Yönergesi

Açıklama: | Bir özkaynağa erişebilecek kimliği doğrulanmış kullanıcıları belirler
Sözdizimi: | Require öğe-adı [öğe-adı] ...
Bağlam: | dizin, .htaccess
Geçersizleştirme: | AuthConfig
Durum: | Çekirdek
Modül: | core

Bu yönerge br özkaynağa erişebilecek kimliği doğrulanmış kullanıcıları belirlemek için kullanılır. Belli bir kullanıcı veya kullanıcı grubuna erişim vermek için bu yönergeden çok sayıda yazmak yerine bunlar mantıksal VEYAlarla birleştirilebilir. Kısıtlamalar yetkilendirme modülleri tarafından işleme sokulur. mod_authz_user ve mod_authz_groupfile tarafından izin verilen bazı sözdizimleri:

Require user kull-kiml [kull-kiml] ...
Sadece belirtilen kullanıcılar özkaynağa erişebilir.
Require group grup-adı [grup-adı] ...
Sadece belirtilen gruplara üye kullanıcılar özkaynağa erişebilir.
Require valid-user
Geçerli kullanıcıların hepsi özkaynağa erişebilir.

Gerekli diğer seçenekleri sağlayan yetkilendirme modülleri olarak mod_authnz_ldap, mod_authz_dbm ve mod_authz_owner sayılabilir.

Require yönergesinin düzgün çalışması için kendisine AuthName ve AuthType yönergelerinin yanı sıra kullanıcıları ve grupları tanımlamak için AuthUserFile ve AuthGroupFile gibi yönergelerinin de eşlik etmesi gerekir. Örnek:

AuthType Basic
AuthName "Restricted Resource"
AuthUserFile /web/users
AuthGroupFile /web/groups
Require group admin

Bu yolla uygulanan erişim denetimleri tüm yöntemler için etkilidir. Normalde istenen zaten budur. Erişim denetimlerini diğerlerini korumasız bırakmak pahasına sadece belli yöntemlerle sınırlamak isterseniz Require yönergesini bir <Limit> bölümüne yerleştirin.

Eğer Require yönergesini Allow veya Deny yönergeleri ile birlikte kullanırsanız bu sınırlamalarla olan etkileşim Satisfy yönergesi tarafından denetlenir.

Denetimlerin alt dizinlerden kaldırılması

Aşağıdaki örnekte korunmuş bir dizinin bir alt dizinindeki erişim denetimlerinin kaldırılması için Satisfy yönergesinin nasıl kullanılacağı gösterilmiştir. Bu teknik, mod_authz_host tarafından dayatılan erişim denetimlerini de ortadan kaldırdığından dikkatli kullanılmalıdır.

<Directory /korunmuş/dizine/giden/yol/>
Require user david
 </Directory>
<Directory /korunmuş/dizine/giden/yol/korunmamış-dizin/>
# Bu dizinde tüm erişim denetimleri ve kimlik doğrulaması
# iptal ediliyor
Satisfy Any
Allow from all
 </Directory>

Ayrıca bakınız:

  • Kimlik Doğrulama ve Yetkilendirme
  • Erişim Denetimi
  • Satisfy
  • mod_authz_host

RLimitCPU Yönergesi

Açıklama: | Apache alt süreçleri tarafından çalıştırılan süreçlerin işlemci tüketimine sınırlama getirir.
Sözdizimi: | RLimitCPU saniye|max [saniye|max]
Öntanımlı: | Bir değer belirtilmemiştir; işletim sistemi öntanımlıları kullanılır
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

1 veya 2 değer alır. İlk değer bütün süreçler için sanal özkaynak sınırını, ikinci değer ise kesin özkaynak sınırını belirler. İki değer de birer sayı olabileceği gibi bu sınırın işletim sistemi yapılandırmasında izin verilen üst sınıra ayarlanacağını belirtmek üzere max olabilir. Kesin özkaynak sınırını yükseltmek için sunucunun root olarak veya sistem açılışı sırasında çalıştırılması gerekir.

Bu sınırlar Apache’nin kendi alt süreçlerine değil, isteklere yanıt verirken Apache alt süreçlerinin çatalladıkları süreçlere uygulanır. Bunlar CGI betikleri ve SSI çalıştırma komutları olabilir fakat borulu günlük kaydı gibi ana Apache süreci tarafından çatallanmış süreçler olmazlar.

İşlemci özkaynak sınırları saniye cinsinden ifade edilir.

Ayrıca bakınız:

  • RLimitMEM
  • RLimitNPROC

RLimitMEM Yönergesi

Açıklama: | Apache alt süreçleri tarafından çalıştırılan süreçlerin bellek tüketimine sınırlama getirir.
Sözdizimi: | RLimitMEM bayt-sayısı|max [bayt-sayısı|max]
Öntanımlı: | Bir değer belirtilmemiştir; işletim sistemi öntanımlıları kullanılır
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

1 veya 2 değer alır. İlk değer bütün süreçler için sanal özkaynak sınırını, ikinci değer ise kesin özkaynak sınırını belirler. İki değer de birer sayı olabileceği gibi bu sınırın işletim sistemi yapılandırmasında izin verilen üst sınıra ayarlanacağını belirtmek üzere max olabilir. Kesin özkaynak sınırını yükseltmek için sunucunun root olarak veya sistem açılışı sırasında çalıştırılması gerekir.

Bu sınırlar Apache’nin kendi alt süreçlerine değil, isteklere yanıt verirken Apache alt süreçlerinin çatalladıkları süreçlere uygulanır. Bunlar CGI betikleri ve SSI çalıştırma komutları olabilir fakat borulu günlük kaydı gibi ana Apache süreci tarafından çatallanmış süreçler olmazlar.

Bellek özkaynak sınırları süreç başına bayt sayısı olarak ifade edilir.

Ayrıca bakınız:

  • RLimitCPU
  • RLimitNPROC

RLimitNPROC Yönergesi

Açıklama: | Apache alt süreçleri tarafından çalıştırılabilecek süreç sayısına sınırlama getirir.
Sözdizimi: | RLimitNPROC sayı|max [sayı|max]
Öntanımlı: | Bir değer belirtilmemiştir; işletim sistemi öntanımlıları kullanılır
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

1 veya 2 değer alır. İlk değer bütün süreçler için sanal özkaynak sınırını, ikinci değer ise kesin özkaynak sınırını belirler. İki değer de birer sayı olabileceği gibi bu sınırın işletim sistemi yapılandırmasında izin verilen üst sınıra ayarlanacağını belirtmek üzere max olabilir. Kesin özkaynak sınırını yükseltmek için sunucunun root olarak veya sistem açılışı sırasında çalıştırılması gerekir.

Bu sınırlar Apache’nin kendi alt süreçlerine değil, isteklere yanıt verirken Apache alt süreçlerinin çatalladıkları süreçlere uygulanır. Bunlar CGI betikleri ve SSI çalıştırma komutları olabilir fakat borulu günlük kaydı gibi ana Apache süreci tarafından çatallanmış süreçler olmazlar.

Süreç sayısı sınırı kullanıcı başına süreç sayısına sınırlama getirir.

Ek Bilgi

CGI süreçleri sunucu kullanıcı kimliğinden farklı bir kullanıcı kimliği altında çalışmıyorsa bu yönerge sunucunun kendi oluşturduğu süreç sayısını sınırlayacaktır. Bunun kanıtı error_log’da iletilerin çatallanamamasıdır.

Ayrıca bakınız:

  • RLimitMEM
  • RLimitCPU

Satisfy Yönergesi

Açıklama: | Konak seviyesinde erişim denetimi ile kullanıcı kimlik doğrulaması arasındaki etkileşim
Sözdizimi: | Satisfy Any|All
Öntanımlı: | Satisfy All
Bağlam: | dizin, .htaccess
Geçersizleştirme: | AuthConfig
Durum: | Çekirdek
Modül: | core
Uyumluluk: | 2.0.51 sürümü ve sonrasında <Limit> ve <LimitExcept> tarafından etkin kılınır.

Allow ve Require yönergelerinin ikisi birden kullanıldığında uygulanacak erişim kuralını belirler. Değer olarak sadece All veya Any belirtilebilir. Bu yönergenin yararlı olabilmesi için belli bir alana hem istemci konak adresi hem de kullanıcı ismi ve parolası belirtmek suretiyle erişilebiliyor olunması gerekir. Bu durumda öntanımlı davranış (All), istemcinin belli bir adrese erişebilmek için belli kısıtlamaları aşması ve geçerli bir kullanıcı adı ve parola girmesi gerekir. Any seçeneğinin belirtildiği durumda ise istemcinin ya konak kısıtlamalarıdan geçmesi ya da geçerli bir kullanıcı adı ve parolası girmesi gerekir. Bu seçenek, belli bir alana erişimi parolayla kısıtlayıp, belli adreslerden gelen kullanıcılara parolasız erişim vermek için kullanılabilir.

Örneğin, sitenizin belli bir bölümü için iç ağınızdan gelen isteklere sınırsız erişim vermek ama dışardan gelen istekleri parolayla kısıtlamak isterseniz şöyle bir yapılandırma kullanabilirsiniz:

Require valid-user
Order allow,deny
Allow from 192.168.1
Satisfy Any

2.0.51 sürümünden itibaren Satisfy yönergeleri <Limit> ve <LimitExcept> bölümleri tarafından belli yöntemlerle kısıtlanmış olabilir.

Ayrıca bakınız:

  • Allow
  • Require

ScriptInterpreterSource Yönergesi

Açıklama: | CGI betikleri için yorumlayıcı belirleme tekniği
Sözdizimi: | ScriptInterpreterSource Registry|Registry-Strict|Script
Öntanımlı: | ScriptInterpreterSource Script
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Sadece Win32 için; Registry-Strict seçeneği Apache 2.0 ve sonrası için geçerlidir.

Bu yönerge Apache’nin CGI betiklerini çalıştıracak yorumlayıcıyı nasıl tespit edeceğini belirler. Script öntanımlı olup Apache’nin yorumlayıcı olarak betiğin diyezli ünlem satırında (#! ile başlayan ilk satır) belirtilen yorumlayıcıyı kullanacağını belirtir. Win32 sistemlerinde bu satır genellikle şöyledir:

#!C:/Perl/bin/perl.exe

perl yorumlayıcının yeri PATH değişkeninde kayıtlı ise şöyle de olabilir:

#!perl

ScriptInterpreterSource Registry değeri ise betik dosyası uzantısının (.pl gibi) Windows Sicili içindeki HKEY_CLASSES_ROOT ağacında arama yapmak için bir arama anahtarı olarak kullanılmasını sağlar. Betik dosyasını çalıştırmak için tanımlanmış komutu bulmak için Shell\ExecCGI\Command yoluna, orada yoksa Shell\Open\Command yoluna bakılır. İkisi de yoksa son çare olarak Script seçeneğinin davranışına dönülür.

Örneğin, .pl uzantılı bir betiğin perl ile işlenmesi için sicil ayarı şöyle olabilir:

HKEY_CLASSES_ROOT\.pl\Shell\ExecCGI\Command\(Default) => C:\Perl\bin\perl.exe -wT

Güvenlik

ScriptAlias’lı dizinlerde Apache bulduğu her dosyayı çalıştırmayı deneyeceğinden ScriptInterpreterSource Registry yapılandırmasını kullanırken dikkatli olun. Registry seçeneği genellikle çalıştırılmayacak dosyalar için istenmeyen program çağrılarına sebep olabilir. Örneğin, çoğu Windows sisteminde .htm dosyaları için ön tanımlı "open" komutu Microsoft Internet Explorer’ın çalıştırılmasına sebep olur; bu bakımdan, betik dizininde bulunan bir .htm dosyası için yapılan bir HTTP isteği tarayıcının sunucu artalanında çalıştırılmasına sebep olacaktır. Bu, sistemi bir kaç dakika içinde çökertmek için iyi bir yoldur.

Registry-Strict seçeneği Apache 2.0’da yeni olup Registry seçeneğinin yaptığını Shell\ExecCGI\Command yolu için yapar. ExecCGI sistem tarafından bilinen bir anahtar olmadığından Windows Siciline elle kaydedilmesi gerekir ve dolayısıyla sisteminiz üzerinde istenmeyen program çağrılarına sebep olmaz.

ServerAdmin Yönergesi

Açıklama: | Sunucunun hata iletilerinde istemciye göstereceği eposta adresi
Sözdizimi: | ServerAdmin eposta-adresi|URL
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

ServerAdmin yönergesi, sunucunun bir hata durumunda istemciye döndüreceği hata iletilerinde içereceği iletişim adresini belirtmek için kullanılır. Eğer httpd sağlanan değerin bir URL olmadığını saptarsa değerin bir eposta adresi olduğuna hükmeder ve önüne mailto: getirerek onu bir hiper bağ hedefi olarak kullanır. Çoğu CGI betiği bir eposta adresi belirtildiği kabulünü yaptığından değer olarak bir URL değil bir eposta adresi belirtmeniz önerilir. Eğer bir URL belirtecekseniz hedef sizin denetiminizde olan başka bir sunucuda bulunmalıdır, yoksa kullanıcılar hata durumunda bu adrese erişemeyebilirler.

Kullanıcıların sunucu hakkında konuşurken isminizden bahsetmemeleri için burada belirtilecek adresin sırf bu işe adanmış bir adres olması daha iyidir. Örnek:

ServerAdmin www-admin@falan.filan.dom

ServerAlias Yönergesi

Açıklama: | İstekleri isme dayalı sanal konaklarla eşleştirilirken kullanılacak konak adları için başka isimler belirtebilmeyi sağlar.
Sözdizimi: | ServerAlias konakadı [konakadı] ...
Bağlam: | sanal konak
Durum: | Çekirdek
Modül: | core

ServerAlias yönergesi, istekleri isme dayalı sanal konaklarla eşleştirilirken kullanılacak konak adları için başka isimler belirtebilmeyi sağlar. ServerAlias dosya adı kalıp karakterleri içerebilir.

<VirtualHost *:80>
ServerName sunucu.mesela.dom
ServerAlias sunucu sunucu2.mesela.dom sunucu2
ServerAlias *.mesela.dom
UseCanonicalName Off
# ...
</VirtualHost>

<virtualhost> bölümleriyle en iyi eşleşen isme dayalı sanal konaklar yapılandırmada göründükleri sıraya göre işleme sokulur. İlk eşleşen ServerName veya ServerAlias kullanılır ve joker kullanımı halinde herhangi bir öncelik söz konusu olmaz.

VirtualHost içindeki isimlerin tamamı bir (jokersiz) ServerAlias gibi ele alınır.

Ayrıca bakınız:

  • UseCanonicalName
  • Apache Sanal Konak Belgeleri

ServerName Yönergesi

Açıklama: | Sunucunun özdeşleşeceği konak ismi ve port.
Sözdizimi: | ServerName [şema://]tam-nitelenmiş-alan-adı[:port]
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Bu yönerge 2.0 sürümünden itibaren 1.3 sürümündeki Port yönergesinin işlevselliğini de üstlenmiştir.

ServerName yönergesi, sunucunun kendini betimlemekte kullanacağı şema, konak adı ve port değerlerini belirler. Bu, yönlendirme URL’leri oluşturulurken kullanılır.

Buna ek olarak, ServerName yönergesi isme dayali sanal konaklar kullanılması durumunda, bir sanal konağı tam olarak belirlemek için de kullanlır (muhtemelen ServerAlias ile birlikte).

Örneğin, HTTP sunucusunun barındırıldığı makinenin ismi falan.filan.dom olduğu halde makinenin bir de www.filan.dom diye bir de DNS rumuzu varsa ve HTTP sunucunuzun bu rumuzla kendini özdeşleştirmesini isterseniz bunu şöyle belirtebilirsiniz:

ServerName www.filan.dom

Bir ServerName ataması yapılmamışsa sunucu IP adresine atanmış sunucu ismi için bir ters DNS sorgusu yapacaktır. ServerName yönergesinde bir port belirtilmediği takdirde sunucu, isteğin geldiği portu kullanacaktır. Öngörülebilirlik ve güvenilirlik açısından en iyisi ServerName yönergesini kullanarak açıkça bir konak ismi ve port belirtmektir.

İsme dayalı sanal konaklar kullanıyorsanız, <VirtualHost> bölümü içindeki ServerName yönergesi, isteğin Host: başlığında bu sanal konakla eşleşecek konak ismini belirler.

Bazen sunucu, bir ters vekil, yük dengeleyici veya SSL yük aktarım uygulaması gibi bir aygıtın arkasında çalışır. Böyle durumlarda sunucunun kendine yönelik URL’leri doğru üretebildiğinden emin olmak için ServerName yönergesinde istemcinin bağlanacağı https:// şeması ve port numarası belirtilir.

Sunucunun kendine yönelik URL’lerin belirtilen portu içerip içermediğini veya istemcinin yaptığı istekte belirtilen port numarasının verilip verilmediğinin saptamasını sağlayan (örneğin, mod_dir modülü tarafından) ayarlar için UseCanonicalName ve UseCanonicalPhysicalPort yönergelerinin açıklamalarına bakınız.

Ayrıca bakınız:

  • DNS ile ilgili konular ve Apache
  • Apache Sanal Konak Belgeleri
  • UseCanonicalName
  • UseCanonicalPhysicalPort
  • NameVirtualHost
  • ServerAlias

ServerPath Yönergesi

Açıklama: | Uyumsuz bir tarayıcı tarafından erişilmesi için bir isme dayalı sanal konak için meşru URL yolu
Sözdizimi: | ServerPath URL-yolu
Bağlam: | sanal konak
Durum: | Çekirdek
Modül: | core

ServerPath yönergesi isme dayalı sanal konaklarda kullanmak için konağa meşru bir URL yolu belirler.

Ayrıca bakınız:

  • Apache Sanal Konak Belgeleri

ServerRoot Yönergesi

Açıklama: | Sunucu yapılandırması için kök dizin
Sözdizimi: | ServerRoot dizin-yolu
Öntanımlı: | ServerRoot /usr/local/apache
Bağlam: | sunucu geneli
Durum: | Çekirdek
Modül: | core

ServerRoot yönergesi sunucu yapılandırmasını içeren dizinin yerini belirtir. Genellikle conf/ ve logs/ gibi alt dizinler içerir. Include, LoadModule gibi diğer yapılandırma yönergelerindeki göreli yollar bu dizine göre ele alınır.

Örnek

ServerRoot /home/httpd

Ayrıca bakınız:

  • httpd için -d seçeneği
  • ServerRoot dizininin erişim izinlerinin nasıl ayarlanması gerektiğini öğrenmek için güvenlik ipuçları

ServerSignature Yönergesi

Açıklama: | Sunucu tarafından üretilen belgelerin dipnotunu ayarlar.
Sözdizimi: | ServerSignature On|Off|EMail
Öntanımlı: | ServerSignature Off
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | All
Durum: | Çekirdek
Modül: | core

ServerSignature yönergesi, sunucu tarafından üretilen belgelerin (hata iletileri, mod_proxy ftp dizin listeleri, mod_info çıktısı, vs.) altındaki dipnot satırını yapılandırabilmenizi sağlar. Böyle bir dipnot satırın istenmesinin sebebi vekil zincirlerinde istemciye dönen hata iletisinin aslında hangi sunucu tarafından üretildiğini kullanıcıya bildirmektir.

Off değeri öntanımlı değer olup dipnot satırının gösterilmemesini sağlar (Apache-1.2 ve öncesi ile uyumluluk). On değeri, sunucu sürüm numarası ve hizmeti sunan sanal konağın isminden (ServerName) oluşan bir dipnot satırı oluşturulmasını sağlar; EMail değeri bu ikisine ek olarak satıra ServerAdmin ile belirtilen adres için bir "mailto:" bağı ekler.

2.0.44 sürümünden beri sunucu sürüm numarasının ayrıntıları ServerTokens yönergesi ile belirlenmektedir.

Ayrıca bakınız:

  • ServerTokens

ServerTokens Yönergesi

Açıklama: | Server HTTP yanıt başlığını yapılandırır.
Sözdizimi: | ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
Öntanımlı: | ServerTokens Full
Bağlam: | sunucu geneli
Durum: | Çekirdek
Modül: | core

Bu yönerge Server HTTP yanıt başlığı alanında istemcilere sunucunun işletim sistemi, sunucuyla derlenmiş modüller, vs. hakkında bilgi verilip verilmeyeceğini belirler.

ServerTokens Prod[uctOnly]
Sunucu şunu gönderir (örnek): Server: Apache
ServerTokens Major
Sunucu şunu gönderir (örnek): Server: Apache/2
ServerTokens Minor
Sunucu şunu gönderir (örnek): Server: Apache/2.0
ServerTokens Min[imal]
Sunucu şunu gönderir (örnek): Server: Apache/2.0.41
ServerTokens OS
Sunucu şunu gönderir (örnek): Server: Apache/2.0.41 (Unix)
ServerTokens Full (ya da belirtilmezse)
Sunucu şunu gönderir (örnek): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

Bu ayarlama sunucunun tamamını etkiler ve her sanal konak için farklılaştırılamaz.

2.0.44 sürümünden itibaren bu yönerge ServerSignature yönergesi tarafından sunulan bilgiyi de etkilemektedir.

Ayrıca bakınız:

  • ServerSignature

SetHandler Yönergesi

Açıklama: | Eşleşen tüm dosyaların belli bir eylemci tarafından işlenmesine sebep olur.
Sözdizimi: | SetHandler eylemci-ismi|None
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache 2.0’da core modülüne taşındı.

Bir .htaccess dosyasına veya bir <Directory> ya da <Location> bölümüne yerleştirildiğinde, eşleşen tüm dosyaların, ismi eylemci-ismi ile belirtilen eylemci tarafından çözümlenmesine sebep olur. Örneğin, bir dizin içindeki bütün dosyaların, uzantılarına bakılmaksızın birer imagemap kural dosyası olarak çözümlenmesini istersiniz, bu dizin içindeki bir .htaccess dosyasına şöyle bir satır koyabilirsiniz:

SetHandler imap-file

Başka bir örnek: http://localhost/status gibi bir istek yapıldığında sunucunun bir durum bilgisi göstermesi için httpd.conf dosyasına şöyle bir satır koyabilirsiniz:

<Location /status>
SetHandler server-status
 </Location>

Evvelce tanımlanmış bir SetHandler yönergesini None değeriyle geçersiz hale getirebilirsiniz.

Ayrıca bakınız:

  • AddHandler

SetInputFilter Yönergesi

Açıklama: | POST girdilerini ve istemci isteklerini işleyecek süzgeçleri belirler.
Sözdizimi: | SetInputFilter süzgeç[;süzgeç...]
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core

SetInputFilter yönergesi, istemci isteklerini ve sunucu tarafından alındığı takdirde POST girdisini işleyecek süzgeç veya süzgeçleri belirler. Bu, diğer AddInputFilter yönergeleri dahil evvelce tanımlanmış süzgeçlere eklenir.

Birden fazla süzgeç belirtilmek istenirse birbirlerinden noktalı virgüllerle ayrılmalı ve çıktıyı işleyecekleri sıraya uygun olarak sıralanmalıdırlar.

Ayrıca bakınız:

  • Süzgeçler belgesi

SetOutputFilter Yönergesi

Açıklama: | Sunucunun yanıtlarını işleyecek süzgeçleri belirler.
Sözdizimi: | SetOutputFilter süzgeç[;süzgeç...]
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Çekirdek
Modül: | core

SetOutputFilter yönergesi, istemciye gönderilmeden önce sunucunun yanıtlarını işleyecek süzgeçleri belirler. Bu, diğer AddOutputFilter yönergeleri dahil evvelce tanımlanmış süzgeçlere eklenir.

Örneğin, aşağıdaki yapılandırma ile /www/data/ dizinindeki bütün dosyalar sunucu taraflı içerik kapsamında ele alınacaktır.

<Directory /www/data/>
SetOutputFilter INCLUDES
 </Directory>

Birden fazla süzgeç belirtilmek istenirse birbirlerinden noktalı virgüllerle ayrılmalı ve çıktıyı işleyecekleri sıraya uygun olarak sıralanmalıdırlar.

Ayrıca bakınız:

  • Süzgeçler belgesi

Suexec Yönergesi

Açıklama: | suEXEC özelliğini açar veya kapar
Sözdizimi: | Suexec On|Off
Öntanımlı: | suexec çalıştırılabiliri doğru sahip ve kip ile mevcutsa etkin kılınır, yoksa etkin kılınmaz.
Bağlam: | sunucu geneli
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache httpd 2.2.18 ve sonrasında kullanılabilir.

Yönergeye On değeri verildiğinde, suexec çalıştırılabiliri mevcut değilse veya çalıştırılabilir dosyanın sahibi veya kip geçersizse sunucu başlatılamaz.

Off değeri verildiğinde ise, suexec çalıştırılabiliri doğru sahip ve kip ile mevcutsa bile suEXEC iptal edilir.

TimeOut Yönergesi

Açıklama: | Bir istek için başarısız olmadan önce belirli olayların gerçekleşmesi için sunucunun geçmesini bekleyeceği süre.
Sözdizimi: | TimeOut saniye
Öntanımlı: | TimeOut 300
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core

TimeOut yönergesi çeşitli durumlarda Apache’nin bekleyeceği süreyi belirler:

  1. Veri istemciden okunurken, okuma tamponu boş olduğunda bir TCP paketinin gelmesi için beklenecek süre.
  2. Veri istemciye yazılırken, gönderim tamponu dolu olduğunda bir paket alındı bilgisi için beklenecek süre.
  3. mod_cgi modülünde bir CGI betiğinin çıktısı için beklenecek süre.
  4. mod_ext_filter modülünde bir süzme işleminin çıktısı için beklenecek süre.
  5. mod_proxy modülünde ProxyTimeout yapılandırılmamışsa öntanımlı zaman aşımı değeri.

TraceEnable Yönergesi

Açıklama: | TRACE isteklerinde davranış şeklini belirler
Sözdizimi: | TraceEnable [on|off|extended]
Öntanımlı: | TraceEnable on
Bağlam: | sunucu geneli, sanal konak
Durum: | Çekirdek
Modül: | core
Uyumluluk: | Apache 1.3.34, 2.0.55 ve sonrasında mevcuttur.

Bu yönerge çekirdek ve vekil (mod_proxy) sunucuların her ikisi için öntanımlı TRACE davranışını değiştirir. Öntanımlı olan TraceEnable on ile RFC 2616’dan kaynaklanan ve isteğe herhangi bir istek gövdesinin eşlik etmesine izin vermeyen TRACE isteklerine izin verilir. TraceEnable off ile çekirdek ve vekil (mod_proxy) sunucuların her ikisi de TRACE isteklerine yanıt olarak bir 405 (Yönteme izin verilmiyor) hatası döndürür.

TraceEnable extended ile sadece sınama ve tanı koyma amaçlarına yönelik olarak istek gövdelerine izin verilir. Asıl sunucu istek gövdesini 64k ile sınırlar (Transfer-Encoding: chunked kullanılmışsa bölüm başlıkları için 8k daha). Asıl sunucu yanıt gövdesinde tüm başlıkları ve bölüm başlıklarının tamamını yansıtacaktır. Vekil sunucuda ise istek gövdesi için 64k’lık sınır yoktur.

UseCanonicalName Yönergesi

Açıklama: | Sunucunun kendi adını ve portunu nasıl belirleyeceğini ayarlar
Sözdizimi: | UseCanonicalName On|Off|DNS
Öntanımlı: | UseCanonicalName Off
Bağlam: | sunucu geneli, sanal konak, dizin
Durum: | Çekirdek
Modül: | core

Apache‘nin çoğu durumda özüne yönelik URL‘ler (isteğin tekrar aynı sunucuya yapıldığı bir URL türü) oluşturması gerekir. UseCanonicalName On ile Apache, sunucu için meşru ismi ve portu oluşturmak için ServerName yönergesinde belirtilen ismi ve portu kullanır. Bu isim CGI'lerde SERVER_NAME ve SERVER_PORT değerlerinde ve tüm özüne yönelik URL’lerde kullanılır.

UseCanonicalName Off ile Apache, özüne yönelik URL’leri varsa istemci tarafından sağlanan konak ismini ve portu kullanarak oluşturur; bunlar istemci tarafından sağlanmamışsa yukarıda tanımlanan işleme başvurulur. Bu değerler, isme dayalı sanal konakları gerçekleştirirken kullanılan değerlerle aynı olup aynı istemcilerle kullanılabilir. SERVER_NAME ve SERVER_PORT CGI değişkenleri de istemci tarafından sağlanan isim ve portla oluşturulur.

Bir örnek olarak, iç ağdaki istemcilerin sunucuya www gibi bir kısa isim kullanarak bağlandığı durumu ele alırsak daha yararlı olur. Kullanıcılar bir kısa isim ve bir dizin isminden oluşan ve bir / ile sonlandırılmamış http://www/splat şeklinde bir istek yaparlarsa, Apache onları http://www.mesela.dom/splat/ adresine yönlendirecektir. Eğer kimlik doğrulama da etkinse bu kullanıcının iki defa kimlik doğrulamasına sokulmasına sebep olacaktır (bir kere www için bir kere de www.mesela.dom için; daha ayrıntılı bilgi için SSS’ye bakınız). Fakat UseCanonicalName Off olsaydı Apache isteği http://www/splat/ adresine yönlendirecekti.

UseCanonicalName DNS diye üçüncü bir seçenek daha vardır ve istek yaparken Host: başlığını kullanmayan eski istemcileri desteklemek amacıyla IP’ye dayalı sanal konaklarla kullanmak için tasarlanmıştır. Bu seçenek etkin olduğunda Apache, istemciyi özüne yönelik URL’lerle doğru yere bağlamak için sunucu IP adresi üzerinde bir ters DNS sorgusu yapar.

Uyarı

Eğer CGI’ler SERVER_NAME değerleri için önkabuller yapıyorlarsa bu seçenek işlerinin bozulmasına yol açabilir. Aslında istemciler konak ismi olarak istedikleri değeri vermekte özgürdürler. Fakat eğer CGI, özüne yönelik URL’leri oluştururken sadece SERVER_NAME değerini kullanıyorsa bu istendiği gibi çalışacaktır.

Ayrıca bakınız:

  • UseCanonicalPhysicalPort
  • ServerName
  • Listen

UseCanonicalPhysicalPort Yönergesi

Açıklama: | Sunucunun kendi adını ve portunu nasıl belirleyeceğini ayarlar
Sözdizimi: | UseCanonicalPhysicalPort On|Off
Öntanımlı: | UseCanonicalPhysicalPort Off
Bağlam: | sunucu geneli, sanal konak, dizin
Durum: | Çekirdek
Modül: | core

Apache‘nin çoğu durumda özüne yönelik URL‘ler (isteğin tekrar aynı sunucuya yapıldığı bir URL türü) oluşturması gerekir. Apache UseCanonicalName yönergesine bağlı olarak sunucu için meşru portu oluştururken UseCanonicalPhysicalPort On ile olası port olarak istek tarafından kullanılmakta olan fiziksel portu kullanacaktır. UseCanonicalPhysicalPort Off olduğunda ise geçerli bir port numarası oluşturmak için asıl fiziksel port yerine yapılandırma bilgisi kullanılır.

Ek Bilgi

Fiziksel port kullanımı etkin olduğunda işlemler şu sırayla yürütülür:

UseCanonicalName On

  • Servername yönergesinde belirtilen port
  • Fiziksel port
  • Öntanımlı port
UseCanonicalName Off | DNS
  • Host: başlığından çözümlenen port
  • Fiziksel port
  • Servername yönergesinde belirtilen port
  • Öntanımlı port

UseCanonicalPhysicalPort Off olduğunda işlem sırasında fiziksel port adımları atlanır.

Ayrıca bakınız:

  • UseCanonicalName
  • ServerName
  • Listen

<VirtualHost> Yönergesi

Açıklama: | Sadece belli bir konak ismine ve porta uygulanacak yönergeleri barındırır.
Sözdizimi: | <VirtualHost adres[:port] [adres[:port]] ...> ... </VirtualHost>
Bağlam: | sunucu geneli
Durum: | Çekirdek
Modül: | core

<VirtualHost> ve </VirtualHost> birlikte sadece belli bir sanal konağa uygulanacak yönergeleri sarmalamakta kullanılırlar. Bir sanal konak kapsamında belirtilebilecek her yönerge kullanılabilir. Sunucu belli bir sanal konak üzerindeki bir belge için bir istek aldığında <VirtualHost> bölümünde bulunan yapılandırma yönergelerini kullanır. adres şunlardan biri olabilir:

  • Sanal konağın IP adresi.
  • Sanal konağın IP adresi için tam nitelenmiş alan adı (önerilmez).
  • NameVirtualHost * ile birlikte tüm IP adresleri ile eşleşmek üzere * karakteri.
  • Sadece IP sanal konaklarında kullanmak için eşleşmeyen IP adreslerini yakalamak amacıyla _default_ dizgesi.

Örnek

<VirtualHost 10.1.2.3:80>
ServerAdmin webmaster@konak.mesela.dom
DocumentRoot /www/docs/konak.mesela.dom
ServerName konak.mesela.dom
ErrorLog logs/konak.mesela.dom-error_log
TransferLog logs/konak.mesela.dom-access_log
 </VirtualHost>

İsteğe bağlı port numarasını belirtmeyi mümkün kılmak için IPv6 adresleri köşeli ayraç içine alınır. IPv6 adresi kullanılan bir örnek:

<VirtualHost [2001:db8::a00:20ff:fea7:ccea]:80>
ServerAdmin webmaster@konak.mesela.dom
DocumentRoot /www/docs/konak.mesela.dom
ServerName konak.mesela.dom
ErrorLog logs/konak.mesela.dom-error_log
TransferLog logs/konak.mesela.dom-access_log
 </VirtualHost>

Her sanal konağın ya farklı bir IP adresi ve port ile ya da farklı bir konak ismiyle eşleşmesi gerekir. Birinci durumda sunucu makinesinin çok sayıda adresten IP paketleri kabul edecek şekilde yapılandırılması gerekir. (Eğer makinede çok sayıda ağ arabirimi yoksa bu, işletim sistemi desteklediği takdirde ifconfig alias komutuyla sağlanabilir.)

Ek Bilgi

<VirtualHost> kullanımı Apache’nin dinleyeceği adresler üzerinde belirleyici değildir. Apache’nin doğru adresi dinlediğinden emin olmak için Listen kullanmanız gerekebilir.

IP’ye dayalı sanal konakları kullanıyorsanız, diğer sanal konaklarda açıkça belirtilmemiş IP adresleriyle eşleşecek sanal konağı _default_ özel ismiyle belirtebilirsiniz. "Ana" sunucu yapılandırmasında _default_ diye bir sanal konağın bulunmaması halinde, hiçbir IP adresi eşleşmesi bulunamadığı takdirde <VirtualHost> bölümleri dışında kalan tüm yapılandırmalar bu amaca yönelik olarak kullanılır. (Yalnız dikkat edin, bir NameVirtualHost yönergesi ile eşleşen bir IP adresi için ne "ana" sunucu yapılandırması ne de _default_ sanal konak yapılandırması kullanılır. Bu konuda daha ayrıntılı bilgi için isme dayalı sanal konaklar belgesine bakınız.)

Eşleşilecek portu değiştirmek için bir :port belirtebilirsiniz. Port bu şekilde değiştirilmediği takdirde ana sunucunun son Listen yönergesinde belirtilen port kullanılır. Bir adresteki tüm portlarla eşleşileceğini belirtmek için :* kullanabilirsiniz. (Bu, _default_ kullanıldığı takdirde önerilir.)

Her <VirtualHost> bloku içinde bir ServerName yönergesi mutlaka olmalıdır. Yokluğu halinde "ana" sunucu yapılandırmasındaki ServerName miras alınacaktır (yani, sanal konak belirtmek için boşuna uğraşmış olursunuz).

Güvenlik

Günlük dosyalarının sunucuyu çalıştıran kullanıcıdan başka herkes tarafından yazılabilen bir yerde saklanmasından dolayı ortaya çıkabilecek güvenlik sorunları hakkında daha ayrıntılı bilgi için güvenlik ipuçları belgesine bakınız.

Ayrıca bakınız:

  • Apache Sanal Konak Belgeleri
  • DNS ile İlgili Konular ve Apache
  • Apache’nin belli adresleri ve portları dinlemek üzere yapılandırılması
  • Bir istek alındığında farklı yapılandırma bölümlerinin nasıl bir arada ele alındığının açıklaması için <Directory>, <Location> ve <Files> bölümleri nasıl çalışır? belgesine bakınız.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mpm_common - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache MPM Ortak Yönergeleri

Açıklama: | Birden fazla Çok Süreçlilik Modülü (MPM) tarafından gerçeklenmiş yönergeler bütünü.
Durum: | MPM

AcceptMutex Yönergesi

Açıklama: | Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden çok sayıda çocuk süreci sıraya sokmak için kullandığı yöntemi belirler.
Sözdizimi: | AcceptMutex Default|yöntem
Öntanımlı: | AcceptMutex Default
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | prefork, worker

AcceptMutex yönergesi Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden çok sayıda çocuk süreci sıraya sokmak için kullandığı yöntemi belirler. Apache 2.0’dan önce, yöntem sadece derleme sırasında seçilebiliyordu. Kullanılacak en uygun yöntem mimariye ve platforma aşırı derecede bağımlıdır. Bu konuda daha ayrıntılı bilgi edinmek için Başarım Arttırma İpuçları belgesine bakabilirsiniz.

Bu yönergeye değer olarak Default belirtilmişse derleme sırasında seçilen öntanımlı yöntem kullanılacaktır. Diğer olası yöntemler aşağıda listelenmiştir. Tüm yöntemlerin tüm platformlarda mevcut olmadığına dikkat ediniz. Eğer belirtilen yöntem mevcut değilse hata günlüğüne mevcut yöntemlerin listesini içeren bir ileti yazılacaktır.

flock
LockFile yönergesi ile belirtilen dosyayı kilitlemek için flock(2) sistem çağrısı kullanılır.
fcntl
LockFile yönergesi ile belirtilen dosyayı kilitlemek için fcntl(2) sistem çağrısı kullanılır.
posixsem
Muteksleri gerçeklemek için POSIX uyumlu semaforlar kullanılır.
pthread
POSIX Evreleri (PThreads) belirtimi tarafından gerçeklenen muteksler kullanılır.
sysvsem
Muteksleri gerçeklemek için SysV tarzı semaforlar kullanılır.

Sisteminiz için derleme sırasında seçilmiş öntanımlı yöntemi öğrenmek isterseniz LogLevel yönergesine debug değerini atayabilirsiniz. Öntanımlı AcceptMutex, ErrorLog ile belirtilen günlük dosyasına yazılacaktır.

Uyarı

Çoğu sistemde, pthread seçeneği seçildiği takdirde, AcceptCntl muteksi tutulurken bir çocuk süreç anormal şekilde sonlanırsa, muteksi kurtarmak için sunucunun elle yeniden başlatılması gerekecektir.

Solaris, bir muteks tutulurken, bir çocuk süreç anormal şekilde sonlandıktan sonra muteksin Apache tarafından kurtarılmasına imkan veren bir mekanizma sağlaması sebebiyle diğerlerinden ayrılır.

Sisteminiz pthread_mutexattr_setrobust_np() işlevini gerçekliyorsa pthread seçeneğini gönül rahatlığıyla kullanabilirsiniz.

ChrootDir Yönergesi

Açıklama: | Başlatıldıktan sonra Apache’nin chroot(8) yapacağı dizin
Sözdizimi: | ChrootDir /dizin/yolu/
Öntanımlı: | none
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | event, prefork, worker
Uyumluluk: | Apache 2.2.10 ve sonrasında mevcuttur.

Bu yönerge sunucu başlatıldıktan sonra istekleri kabul etmeye başlamadan önce sunucunun belirtilen dizine chroot(8) yapmasını söyler.

Sunucuyu chroot altında çalıştırmanın basit bir işlem olmadığını ve özellikle CGI veya PHP gibi betikler çalıştırıyorsanız bazı ek ayarlamaların yapılması gerektiğini unutmayınız. Bu özelliği kullanmaya çalışmadan önce chroot işlemi hakkında yeterli bilgiye sahip olduğunuzdan emin olmalısınız.

CoreDumpDirectory Yönergesi

Açıklama: | core dosyasını dökümlemek üzere Apache’nin geçmeye çalışacağı dizin.
Sözdizimi: | CoreDumpDirectory dizin
Öntanımlı: | Öntanımlı değer için aşağıdaki açıklamaya bakınız
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_winnt, prefork, worker

Bu yönerge core dosyasını dökümlemek üzere Apache’nin geçmeye çalışacağı dizini belirler. ServerRoot dizini öntanımlı dizin olmakla birlikte, bu dizin kullanıcılar tarafından yazılabilir bir dizin olmadığından bir core dosyası dökümlenmez. Hata ayıklama amacıyla bir core dosyası dökümlemek isterseniz farklı bir yer belirtmek için bu yönergeyi kullanabilirsiniz.

Linux üzerinde core dökümlemek

Apache root olarak başlatılıp başka bir kullanıcıya geçilirse Linux çekirdeği süreç tarafından yazılabilir olsa bile core dökümlemeyi iptal eder. Eğer CoreDumpDirectory yönergesi ile açıkça bir dizin belirtirseniz, Apache (2.0.46 ve sonraki sürümleri), Linux 2.4 ve sonrasında core dökümlemeyi yeniden etkinleştirecektir.

BSD üzerinde core dökümlemek

BSD-sistemlerde (FreeBSD gibi) suid-çalıştırılabilirlerinin core dökümlemesini etkinleştirmek için kern.sugid_coredump değişkenine 1 atayın.

EnableExceptionHook Yönergesi

Açıklama: | Bir çöküş sonrası olağandışılık eylemcilerini çalıştıracak kancayı etkin kılar.
Sözdizimi: | EnableExceptionHook On|Off
Öntanımlı: | EnableExceptionHook Off
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | prefork, worker
Uyumluluk: | Sürüm 2.0.49 ve sonrasında mevcuttur

Güvenlik sebebiyle bu yönerge sadece Apache --enable-exception-hook seçeneği ile yapılandırılmışsa kullanılabilir olacaktır. Bu, harici modüllerin eklenmesine ve bir çocuk sürecin çöküşü sonrası bir şeyler yapmaya izin veren bir kancayı etkin kılar.

Bu kancayı kullanan iki modül (mod_whatkilledus ve mod_backtrace) zaten vardır. bunlar hakkında daha fazla bilgi edinmek için Jeff Trawick'in EnableExceptionHook sitesine bakabilirsiniz.

GracefulShutdownTimeout Yönergesi

Açıklama: | Sunucunun nazikçe kapatılmasının ardından ana süreç çıkana kadar geçecek süre için bir zaman aşımı belirler.
Sözdizimi: | GracefulShutDownTimeout saniye
Öntanımlı: | GracefulShutDownTimeout 0
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | prefork, worker, event
Uyumluluk: | Sürüm 2.2 ve sonrasında mevcuttur

GracefulShutdownTimeout yönergesi, sunucuya "nazikçe dur" sinyali gönderildikten sonra mevcut bağlantılara hizmet sunmaya daha kaç saniye devam edebileceğini belirtir.

Bu değerin 0 olarak belirtilmesi, sunucunun bekleyen bütün isteklere hizmet sunumu tamamlanıncaya kadar (gerekirse sonsuza kadar) bekleyebileceği anlamına gelir.

Group Yönergesi

Açıklama: | İsteklere yanıt verecek sunucunun ait olacağı grubu belirler.
Sözdizimi: | Group unix-grubu
Öntanımlı: | Group #-1
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpmt_os2, prefork, worker
Uyumluluk: | Apache 2.0’dan itibaren sadece sunucu geneli için geçerlidir.

Group yönergesi, sunucunun hangi grup altında isteklere yanıt vereceğini belirler. Bu yönergenin uygulanabilmesi için sunucunun root olarak çalıştırılmış olması gerekir. Sunucuyu root dışında bir kullanıcı başlattığı takdirde, sunucu belirtilen gruba geçemez ve kullanıcının kendi grubunda çalışmaya devam eder. unix-grubu şunlardan biri olabilir:

Bir grup adı
Gruba ismiyle başvurulur.
# ardından grup numarası
Gruba numarası ile başvurulur.

Örnek

Group www-group

Çalışan sunucu için özellikle yeni bir grup atamanız önerilir. Bazı sistem yöneticileri nobody grubunu kullanırlar fakat bu her zaman mümkün olmadığı gibi arzulanan da değildir.

Güvenlik

Ne yaptığınızı ve ne tehlikelere yol açacağınızı bilmiyorsanız Group (veya User) yönergesine değer olarak root atamayınız.

Özel bilgi: Bu yönergenin <VirtualHost> taşıyıcısı içinde kullanımı artık desteklenmemektedir. Sunucunuzu suexec için yapılandırırken SuexecUserGroup yönergesini kullanınız.

Ek Bilgi

Group yönergesi beos ve mpmt_os2 MPM’lerinde mevcut olsa da, aslında işlevsiz olup sadece uyumluluk adına mevcuttur.

Listen Yönergesi

Açıklama: | Sunucunun dinleyeceği IP adresini ve portu belirler.
Sözdizimi: | Listen [IP-adresi:]port-numarası [protokol]
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker, event
Uyumluluk: | Apache 2.0’dan beri gerekli yönergelerden biridir. protokol argümanı 2.1.5 sürümünde eklenmiştir.

Listen yönergesi Apache’yi sadece belli IP adreslerini ve portlarını dinlemeye sevkeder. Listen artık belirtilmesi zorunlu yönergelerden biridir. Yapılandırma dosyasında bulunmadığı takdirde sunucu başlatılırken başarısız olacaktır. Bu Apache Sunucusunun önceki sürümünde böyle değildi.

Listen yönergesi Apache’ye, sadece belli portlardan veya IP adresi ve port çiftlerinden gelen istekleri kabul etmesini söyler. Eğer sadece port numarası belirtilmişse sunucu belirtilen portu bütün ağ arabirimlerinde dinleyecektir. Eğer portla birlikte bir IP adresi de belirtilmişse, sunucu belirtilen portu sadece belirtilen arabirimden dinleyecektir.

Çok sayıda IP adresi ve port belirtmek için çok sayıda Listen yönergesi kullanılabilir. Sunucu bu durumda belirtilen bütün IP adreslerinden ve portlardan gelecek isteklere yanıt verecektir.

Örneğin sunucunun hem port 80 hem de port 8000’den istek kabul etmesini istiyorsanız bunu şöyle belirtebilirsiniz:

Listen 80
Listen 8000

Sunucunun belirtilen iki ağ arabiriminden ve port numarasından gelen bağlantıları kabul etmesi için şu yapılandırmayı kullanabilirsiniz:

Listen 192.170.2.1:80
Listen 192.170.2.5:8000

IPv6 adresleri belirtilirken örnekteki gibi köşeli ayraçlar arasına alınmalıdır:

Listen [2001:db8::a00:20ff:fea7:ccea]:80

İsteğe bağlı protocol argümanı çoğu yapılandırmada gerekli değildir. Belirtilmediği takdirde. port 443 için https ve tüm diğer portlar için http öntanımlıdır. Protokol, isteği hangi modülün elde edeceğinin ve AcceptFilter yönergesi ile protokole özgü hangi en iyilemelerin uygulanacağının saptanmasında kullanılır.

Protokol belirtme ihtiyacını sadece standartdışı portlar çalıştırıyorsanız duyarsınız. Örneğin, port 8443 üzerinde bir https sitesi çalıştırmak istiyorsanız bunu şöyle belirtebilirsiniz:

Listen 192.170.2.1:8443 https

Hata durumu

Aynı IP adresi ve portun çok sayıda Listen yönergesinde belirtilmesi bir "adres kullanımda" (Address already in use) hatasına yol açar.

Ayrıca bakınız:

  • DNS ve Apache ile ilgili Konular
  • Sunucunun Kullandığı Adreslerin ve Portların Ayarlanması

ListenBackLog Yönergesi

Açıklama: | Bekleyen bağlantılar kuyruğunun azami uzunluğunu belirler
Sözdizimi: | ListenBacklog kuyruk-uzunluğu
Öntanımlı: | ListenBacklog 511
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

Bekleyen bağlantılar kuyruğunun azami uzunluğu. Genellikle bu ayar ne gerekir ne de istenir. Ancak bazı sistemlerde TCP SYN yüklenme saldırılarına karşı bu değerin arttırılması gerekebilir. kuyruk-uzunluğu parametresi için listen(2) işlevinin açıklamasına bakınız.

Bu değer çoğunlukla işletim sistemi tarafından daha küçük bir sayıyla sınırlanır. Bu, işletim sistemine bağlı olarak değişiklik gösterir. Ayrıca, çoğu işletim sisteminin kuyruk-uzunluğu parametresi ile ne belirttiğinize bakmaksızın kendisi için atanmış değeri (fakat normal olarak daha büyüğünü) kullanacağına dikkat ediniz.

LockFile Yönergesi

Açıklama: | Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden çok sayıda çocuk süreci sıraya sokarken kullandığı kilit dosyasının yerini belirler.
Sözdizimi: | LockFile dosya
Öntanımlı: | LockFile logs/accept.lock
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | prefork, worker

LockFile yönergesi, AcceptMutex yönergesi fcntl veya flock değeri ile belirtildiği takdirde kullanılan kilit dosyasının yerini belirler. Bu yönerge normalde öntanımlı değeriyle bırakılır. Değişmesini gerektiren ana sebep, logs dizininin ağ dosya sisteminde (NFS) yeralması halinde kilit dosyasının bir yerel diskte saklanması gereğidir. Ana sürecin süreç kimliği dosyaya kendiliğinden eklenir.

Güvenlik

Bu dosyayı herkesin yazabildiği /var/tmp gibi bir dizine koymaktan kaçınmak gerekir. Çünkü, bu takdirde, birileri sunucunun hizmet sunmaya başlarken oluşturacağı kilit dosyası ile aynı isimde bir dosya oluşturarak hizmet reddi saldırısı (DoS) başlatabilir.

Ayrıca bakınız:

  • AcceptMutex

MaxClients Yönergesi

Açıklama: | Aynı anda işleme sokulacak azami bağlantı sayısı
Sözdizimi: | MaxClients sayı
Öntanımlı: | Ayrıntılar için aşağıdaki açıklamaya bakınız.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, prefork, worker

MaxClients yönergesi aynı anda işleme sokulacak bağlantı sayısını sınırlamak için kullanılır. MaxClients bağlantı isteğinden fazlası geldiği takdirde bu istekler normal olarak kuyruğa alınıp bekletilir. Kuyrukta bekletilecek isteklerin azami sayısı ise ListenBacklog yönergesi ile belirlenir. İstek sunmakta olan çocuk süreçlerden biri serbest kaldığında bekletilen bağlantılardan birine hizmet sunulmaya başlanır.

Evreli olmayan sunucularda (prefork gibi) MaxClients yönergesi istekleri sunmak için başlatılacak çocuk süreçlerin azami sayısını belirler. Öntanımlı değer 256 olup bu değeri arttırmak isterseniz ServerLimit değerini de arttırmalısınız.

Çok evreli ve melez sunucularda (beos veya worker gibi) MaxClients yönergesi istemcilere hizmet verecek evre sayısını sınırlar. Öntanımlı değer beos için 50 iken melez MPM’ler için ServerLimit ile ThreadsPerChild çarpımıdır (16 x 25). Bu bakımdan MaxClients değerini 16 süreçten fazlasına ayarlamak için ServerLimit değerini de arttırmalısınız.

MaxMemFree Yönergesi

Açıklama: | free() çağrılmaksızın ana bellek ayırıcının ayırmasına izin verilen azami bellek miktarını belirler.
Sözdizimi: | MaxMemFree kB-sayısı
Öntanımlı: | MaxMemFree 0
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_netware, prefork, worker, mpm_winnt

MaxMemFree yönergesi, free() çağrılmaksızın ana bellek ayırıcının ayırmasına izin verilen azami bellek miktarını kB cinsinden belirler. Bir değerle belirtilmediğinde veya 0 değeriyle belirtildiğinde eşik sınırsız olacaktır.

MaxRequestsPerChild Yönergesi

Açıklama: | Tek bir çocuk sürecin ömrü boyunca işleme sokabileceği istek sayısını sınırlamakta kullanılır.
Sözdizimi: | MaxRequestsPerChild sayı
Öntanımlı: | MaxRequestsPerChild 10000
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

MaxRequestsPerChild yönergesi, tek bir çocuk sürecin işleme sokabileceği istek sayısını sınırlamakta kullanılır. MaxRequestsPerChild istekten sonra çocuk süreç ölür. Eğer MaxRequestsPerChild için 0 belirtilmişse sürecin ömrü sonsuz olacaktır.

Sıfırdan farklı öntanımlı değerler

mpm_netware ve mpm_winnt için öntanımlı değer 0’dır.

MaxRequestsPerChild için sıfırdan farklı bir değer belirtilmesi sürecin kullanacağı bellek miktarını sınırlamak suretiyle olası bellek sızıntılarını engeller.

Ek Bilgi

KeepAlive isteklerinde sadece ilk istek bu sınıra uygun sayılır. Etkisi ise, davranışın çocuk süreç başına bağlantı sayısının sınırlanması şeklinde değişmesidir.

Öntanımlı Yapılandırma

Öntanımlı (derleme sırasında atanan) değer (10000), yapılandırmada hiçbir MaxRequestsPerChild yönergesi bulunmadığı durumda kullanılır. Öntanımlı yapılandırma, "MaxRequestsPerChild 0" dahil pek çok öntanımlı yapılandırma yönergesi içerir.

MaxSpareThreads Yönergesi

Açıklama: | Boştaki azami evre sayısını belirler
Sözdizimi: | MaxSpareThreads number
Öntanımlı: | Ayrıntılar için aşağıdaki açıklamaya bakınız.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_netware, mpmt_os2, worker

Boştaki azami evre sayısı. Her MPM bu yönerge karşısında farklı davranır.

worker için MaxSpareThreads 250 öntanımlıdır. Bu MPM boştaki evreleri sunucu genelinde izler. Eğer sunucuda çok fazla boşta evre varsa, sunucu boştaki evrelerin sayısı bu sınırın altına inene kadar çocuk süreçleri öldürür.

mpm_netware için MaxSpareThreads 100 öntanımlıdır. Bu MPM tek bir süreç olarak çalıştığından boştaki evre sayısı aynı zamanda sunucu genelinde boştaki evre sayısıdır.

beos ve mpmt_os2 MPM’leri mpm_netware gibidir. beos için MaxSpareThreads 50 öntanımlıyken mpmt_os2 için öntanımlı değer 10’dur.

Kısıtlamalar

MaxSpareThreads için değer aralığı sınırlıdır. Apache belirtilen değeri aşağıdaki kurallara uygun olarak kendiliğinden düzeltecektir:

  • mpm_netware modülü, değerin MinSpareThreads değerinden küçük olmasını gerektirir.
  • worker için değer, MinSpareThreads ve ThreadsPerChild toplamına eşit veya büyük olmak zorundadır.

Ayrıca bakınız:

  • MinSpareThreads
  • StartServers

MinSpareThreads Yönergesi

Açıklama: | İsteklerin ani artışında devreye girecek boştaki evrelerin asgari sayısını belirler.
Sözdizimi: | MinSpareThreads sayı
Öntanımlı: | Ayrıntılar için aşağıdaki açıklamaya bakınız.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_netware, mpmt_os2, worker

İsteklerin ani artışında devreye girecek boştaki evrelerin asgari sayısı. Her MPM bu yönerge karşısında farklı davranır.

worker için MinSpareThreads 75 öntanımlıdır ve bu modüller boştaki evreleri sunucu genelinde izler. Eğer sunucuda boştaki evre sayısı yetersizse, sunucu boştaki evrelerin sayısı bu sınırın üstüne çıkana kadar çocuk süreç oluşturur.

mpm_netware için MinSpareThreads 10 öntanımlıdır ve tek süreç kendisi olduğundan izleme sunucu genelinde yapılır.

beos ve mpmt_os2 modülleri mpm_netware gibidir. beos için MinSpareThreads 1 öntanımlı iken mpmt_os2 için öntanımlı değer 5’tir.

Ayrıca bakınız:

  • MaxSpareThreads
  • StartServers

PidFile Yönergesi

Açıklama: | Ana sürecin süreç kimliğinin (PID) kaydedileceği dosyayı belirler.
Sözdizimi: | PidFile dosya
Öntanımlı: | PidFile logs/httpd.pid
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_winnt, mpmt_os2, prefork, worker

PidFile yönergesi, sunucunun artalan sürecinin süreç kimliğinin kaydedileceği dosyayı belirler. Dosya ismi mutlak dosya yoluyla belirtilmemişse dosya yolunun ServerRoot dizinine göre belirtildiği kabul edilir.

Örnek

PidFile /var/run/apache.pid

Sunucuya sinyal gönderebilmek çoğunlukla işe yarar. Böylece ErrorLog ve TransferLog dosyaları kapatılıp yeniden açılır ve yapılandırma dosyaları yeniden okunur. Bu, PidFile dosyasında belirtilen süreç kimliğine bir SIGHUP (kill -1) sinyali gönderilerek yapılır.

Günlük dosyasının yeri ve güvenlik ile ilgili uyarılar PidFile dosyası içinde sözkonusu olabilir.

Ek Bilgi

Apache 2’de sunucuyu (yeniden) başlatırken veya durdururken sadece apachectl betiğini kullanmanız önerilir.

ReceiveBufferSize Yönergesi

Açıklama: | TCP alım tamponu boyu
Sözdizimi: | ReceiveBufferSize bayt-sayısı
Öntanımlı: | ReceiveBufferSize 0
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

Sunucu TCP alım tamponu boyunu bayt-sayısı ile belirtilen bayta ayarlayacaktır.

0 değeri atarsanız sunucu işletim sistemi öntanımlısını kullanacaktır.

ScoreBoardFile Yönergesi

Açıklama: | Çocuk süreçler için eşgüdüm verisini saklamakta kullanılan dosyanın yerini belirler.
Sözdizimi: | ScoreBoardFile dosya-yolu
Öntanımlı: | ScoreBoardFile logs/apache_runtime_status
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_winnt, prefork, worker

Apache ana ve çocuk süreçler arasında iletişim için bir çetele tutar. Bazı mimariler bu iletişimi kolaylaştırmak için bir dosya gerektirir. Eğer yönerge belirtilmezse Apache çeteleyi önce tamamen bellekte oluşturmayı dener (anonim paylaşımlı bellek kullanarak); bunda başarılı olamazsa dosyayı diskte oluşturmaya çalışacaktır (paylaşımlı belleğe eşlemli dosya kullanarak). Bu yönergenin belirtilmesi Apache sunucusunun dosyayı daima diskte oluşturmasına sebep olur.

Örnek

ScoreBoardFile /var/run/apache_runtime_status

Paylaşımlı belleğe eşlemli dosya, çeteleye doğrudan erişmesi gereken üçüncü parti uygulamalar için yararlıdır.

Eğer ScoreBoardFile yönergesi ile bir dosya belirtecekseniz, dosyayı bir RAM diske yerleştirerek hız artışı sağlayabilirsiniz. Fakat, günlük dosyası yerleştirme ve güvenlik ile ilgili uyarılara benzer uyarılara karşı dikkatli olunuz.

Ayrıca bakınız:

  • Sunucuyu Durdurma ve Yeniden Başlatma

SendBufferSize Yönergesi

Açıklama: | TCP tamponu boyu
Sözdizimi: | SendBufferSize bayt-sayısı
Öntanımlı: | SendBufferSize 0
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_netware, mpm_winnt, mpmt_os2, prefork, worker

Sunucu TCP gönderim tamponu boyunu bayt-sayısı ile belirtilen bayta ayarlayacaktır. Yüksek hızlı yüksek yataklık süresi için standart işletim sistemi öntanımlılarını arttırmak çok yararlıdır (örneğin, kıtalar arası hızlı borularda olduğu gibi 100 ms civarında).

0 değeri atarsanız sunucu işletim sistemi öntanımlısını kullanacaktır.

Yüksek hızlı yüksek yataklık süreli bağlantılarda daha iyi başarım elde etmek için işletim sisteminizde bazı yapılandırmalara gitmeniz gerekebilir.

Bazı işletim sistemlerinde daha büyük bir SendBufferSize ile sonuçlanan TCP davranışındaki değişiklikler, EnableSendfile yönergesine OFF atanmadıkça görülmeyebilir. Bu etkileşim sadece duruk dosyalarda ortaya çıkar.

ServerLimit Yönergesi

Açıklama: | Ayarlanabilir süreç sayısının üst sınırını belirler.
Sözdizimi: | ServerLimit sayı
Öntanımlı: | Ayrıntılar için aşağıdaki açıklamaya bakınız.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | prefork, worker

prefork modülü söz konusu olduğunda bu yönerge, Apache sürecinin ömrü boyunca MaxClients yönergesine atanabilecek azami değeri belirler. worker modülü sözkonusu olduğunda ise, Apache sürecinin ömrü boyunca MaxClients yönergesine atanabilecek azami değeri ThreadLimit ile birlikte belirler. Bu yönergeyi bir yeniden başlatma sırasında değiştirirseniz bu değişiklik yok sayılır fakat MaxClients değişiklikleri dikkate alınır.

Bu yönergenin kullanılması özel bir dikkat gerektirir. Eğer ServerLimit gereğinden yüksek bir değere ayarlanırsa, gereksiz yere paylaşımlı bellek ayrılmış olur. Eğer ServerLimit ve MaxClients değerleri sistemin işleyebileceğinden daha yüksek değerlere ayarlanırsa Apache başlayamayacağı gibi sistemi kararsız hale de getirebilir.

Bu yönergeyi prefork modülü ile sadece MaxClients yönergesine 256’dan (öntanımlı) daha büyük bir değer atayacaksanız kullanınız. Bu yönergeye MaxClients için atamak istediğiniz değerden fazlasını atamayınız.

worker modülü söz konusu olduğunda bu yönergeyi MaxClients ve ThreadsPerChild ayarları 16 sunucu sürecinden (16 öntanımlıdır) fazlasını gerektiriyorsa ayarlayınız. Bu yönergeye MaxClients ve ThreadsPerChild için gerekli gördüğünüz sunucu süreci sayısından fazlasını atamayınız.

Ek Bilgi

Sunucu içinde derlenmiş olarak ServerLimit 20000 şeklinde bir zorlayıcı sınır vardır (prefork için 200000’dir). Bu önlem, yazım hatalarının istenmeyen sonuçlara yol açmasını engellemek için düşünülmüştür.

Ayrıca bakınız:

  • Sunucuyu Durdurma ve Yeniden Başlatma

StartServers Yönergesi

Açıklama: | Sunucunun başlatılması sırasında oluşturulan çocuk süreçlerin sayısını belirler.
Sözdizimi: | StartServers sayı
Öntanımlı: | Ayrıntılar için aşağıdaki açıklamaya bakınız.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | mpmt_os2, prefork, worker

StartServers yönergesi, sunucunun başlatılması sırasında oluşturulan çocuk süreçlerin sayısını belirler. Süreç sayısı normal olarak yüke bağlı olarak değişse de bu değerin ayarlanmasını gerektirecek küçük bir sebep vardır.

Öntanımlı değer MPM’den MPM’e fark eder. Öntanımlı değer worker için 3 iken prefork için 5 ve mpmt_os2 için 2’dir.

StartThreads Yönergesi

Açıklama: | Sunucunun başlatılması sırasında oluşturulan evrelerin sayısını belirler.
Sözdizimi: | StartThreads sayı
Öntanımlı: | Ayrıntılar için aşağıdaki açıklamaya bakınız.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | beos, mpm_netware

StartThreads yönergesi, sunucunun başlatılması sırasında oluşturulan evrelerin sayısını belirler. Evre sayısı normal olarak yüke bağlı olarak değişse de bu değerin ayarlanmasını gerektirecek küçük bir sebep vardır.

mpm_netware için StartThreads 50 öntanımlı olup, sadece tek bir süreç olduğundan, sunucunun başlatılması sırasında oluşturulan evrelerin toplam sayısı 50’dir.

beos için StartThreads 10 öntanımlı olup sunucunun başlatılması sırasında oluşturulan evrelerin toplam sayısı 10’dur.

ThreadLimit Yönergesi

Açıklama: | Çocuk süreç başına ayarlanabilir evre sayısının üst sınırını belirler.
Sözdizimi: | ThreadLimit sayı
Öntanımlı: | Ayrıntılar için aşağıdaki açıklamaya bakınız.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | mpm_winnt, worker
Uyumluluk: | mpm_winnt için Apache 2.0.41 ve sonrasında mevcuttur.

Bu yönerge, Apache sürecinin ömrü boyunca ThreadsPerChild yönergesine atanabilecek azami değeri belirler. Bu yönergeyi bir yeniden başlatma sırasında değiştirirseniz bu değişiklik yok sayılır fakat ThreadsPerChild değişiklikleri dikkate alınır.

Bu yönergenin kullanılması özel bir dikkat gerektirir. Eğer ThreadLimit değeri ThreadsPerChild değerinden yüksek bir değere ayarlanırsa, gereksiz yere paylaşımlı bellek ayrılmış olur. Eğer ThreadLimit ve ThreadsPerChild değerleri sistemin işleyebileceğinden daha yüksek değerlere ayarlanırsa Apache başlayamayacağı gibi sistemi kararsız hale de getirebilir. Bu yönergeye Apache sunucusunun çalışması için öngörülmüş en büyük değerden daha yükseğini atamayınız.

ThreadLimit yönergesinin öntanımlı değeri mpm_winnt için 1920, diğerleri için 64’tür.

Ek Bilgi

Sunucu içinde derlenmiş olarak ThreadLimit 20000 şeklinde bir zorlayıcı sınır vardır (mpm_winnt için 15000’dir). Bu önlem, yazım hatalarının istenmeyen sonuçlara yol açmasını engellemek için düşünülmüştür.

ThreadsPerChild Yönergesi

Açıklama: | Her çocuk süreç tarafından oluşturulan evrelerin sayısını belirler.
Sözdizimi: | ThreadsPerChild sayı
Öntanımlı: | Ayrıntılar için aşağıdaki açıklamaya bakınız.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | mpm_winnt, worker

Bu yönerge, her çocuk süreç tarafından oluşturulan evrelerin sayısını belirler. Çocuk süreçler bu evreleri başlatıldıklarında oluştururlar ve bundan daha fazlasını asla oluşturmazlar. mpm_winnt gibi sadece bir çocuk sürecin bulunduğu bir MPM kullanıyorsanız, bu sayı sunucunun tüm yükünü kaldırabilecek kadar büyük olmalıdır. worker gibi çok çocuk süreçli bir MPM kullanıyorsanız, toplam evre sayısı sunucunun tüm yükünü kaldırabilecek kadar büyük olmalıdır.

ThreadsPerChild için öntanımlı değer mpm_winnt kullanıldığında 64 diğerleri için 25’tir.

ThreadStackSize Yönergesi

Açıklama: | İstemci bağlantılarını elde eden evreler tarafından kullanılan yığıtın bayt cinsinden uzunluğunu belirler.
Sözdizimi: | ThreadStackSize boyut
Öntanımlı: | NetWare üzerinde 65536; diğer işletim sistemlerinde değişir.
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | mpm_netware, mpm_winnt, event, worker
Uyumluluk: | Apache 2.1 ve sonrasında mevcuttur.

ThreadStackSize yönergesi, istemci bağlantılarını elde eden evreler ve bu bağlantıları işlemekte yardımcı olan modül çağrıları tarafından kullanılan yığıtın bayt cinsinden uzunluğunu belirler. Çoğu durumda işletim sistemi yığıtı uygun bir boyuta ayarlar, fakat yine de ayarlanmasını gerektirecek bazı durumlar olabilir:

  • HP-UX gibi görece küçük yığıt boyuna sahip platformlarda, Apache, görece büyük yığıt alanı kullanan bazı üçüncü parti modüller yüzünden çökebilir. Bu modüller öntanımlı yığıt boyu daha büyük olan diğer platformlarda sorunsuz çalışabilir. Bu tür çökmeler ThreadStackSize yönergesine daha büyük yığıt boyu atanarak çözümlenir. Böyle bir ayarlamayı sadece üçüncü parti modülün üreticisi bunun gerekliliğini belirtmişse veya Apache’nin evre yığıt boyutunun küçüklüğünden dolayı çöktüğü teşhis edildiği takdirde yapınız.
  • Öntanımlı yığıt boyu Apache sunucusu için gerekenden belirgin şekilde büyük bazı platformalarda, eğer ThreadStackSize yönergesi ile bu boyuttan daha düşük bir değer atanmışsa çocuk süreç başına evre sayısının yüksek olduğu durumlarda bu yığıt yetmeyebilir. Böyle bir ayarlama sadece sunucunun öldüresiye denendiği dolayısıyla yığıt boyutlarının aşırı zorlandığı deneme ortamlarında yapılmalıdır. Gereken en küçük yığıt boyutu kullanılan modüllerle sıkı sıkıya ilintilidir, fakat sunucu yapılandırmasında yapılan bir değişiklik mevcut ThreadStackSize ayarını geçersiz hale getirebilir.
Çocuk süreç başına evre sayısı çok yüksek olmadıkça ThreadStackSize değerinin azaltılması önerilmez. Bazı platformlarda (Linux dahil), 128000 değeri zaten çok düşüktür ve bazı modüllerde çökmelere sebep olabilmektedir.

User Yönergesi

Açıklama: | İsteklere yanıt verecek sunucunun ait olacağı kullanıcıyı belirler.
Sözdizimi: | User unix-kullanıcısı
Öntanımlı: | User #-1
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | prefork, worker
Uyumluluk: | Apache 2.0’dan itibaren sadece sunucu geneli için geçerlidir.

User yönergesi, sunucunun hangi kullanıcı olarak isteklere yanıt vereceğini belirler. Bu yönergenin uygulanabilmesi için sunucunun root olarak çalıştırılmış olması gerekir. Sunucuyu root dışında bir kullanıcı başlattığı takdirde, sunucu belirtilen kullanıcıya geçemez ve mevcut kullanıcıyla çalışmaya devam eder. Eğer sunucuyu root olarak başlatmışsanız ana süreç root olarak çalışmaya devam edecektir. unix-kullanıcısı şunlardan biri olabilir:

Bir kullanıcı adı
Gruba ismiyle başvurulur.
# ardından kullanıcı numarası
Kullanıcıya numarası ile başvurulur.

Bu yönergede belirtilecek kullanıcının, başkaları tarafından üzerinde değişiklik yapılabilecek dosyalardan başkasına erişemeyen bir kullanıcı olmaması gerektiği gibi, HTTP isteklerini işlemek dışında işlemler de yapabilen bir kullanıcı olmamalıdır. Çalışan sunucu için özellikle yeni bir grup atamanız önerilir. Bazı sistem yöneticileri nobody kullanıcısını kullanırlar fakat nobody kullanıcısı sistemde başka amaçlarla kullanılabildiğinden bu her zaman mümkün olmadığı gibi arzulanan da değildir.

Güvenlik

Ne yaptığınızı ve ne tehlikelere yol açacağınızı bilmiyorsanız User (veya Group) yönergesine değer olarak root atamayınız.

Özel bilgi: Bu yönergenin <VirtualHost> taşıyıcısı içinde kullanımı artık desteklenmemektedir. Sunucunuzu suexec için yapılandırırken SuexecUserGroup yönergesini kullanınız.

Ek Bilgi

Useryönergesi beos ve mpmt_os2 MPM’lerinde mevcut olsa da, aslında işlevsiz olup sadece uyumluluk adına mevcuttur.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


beos - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache MPM beos

Description: | This Multi-Processing Module is optimized for BeOS.
Status: | MPM
Module Identifier: | mpm_beos_module
Source File: | beos.c

Summary

This Multi-Processing Module (MPM) is the default for BeOS. It uses a single control process which creates threads to handle requests.

See also

  • Setting which addresses and ports Apache uses

MaxRequestsPerThread Directive

Description: | Limit on the number of requests that an individual thread will handle during its life
Syntax: | MaxRequestsPerThread number
Default: | MaxRequestsPerThread 0
Context: | server config
Status: | MPM
Module: | beos

The MaxRequestsPerThread directive sets the limit on the number of requests that an individual server thread will handle. After MaxRequestsPerThread requests, the thread will die. If MaxRequestsPerThread is 0, then the thread will never expire.

Setting MaxRequestsPerThread to a non-zero limit has two beneficial effects:

  • it limits the amount of memory that a thread can consume by (accidental) memory leakage;
  • by giving threads a finite lifetime, it helps reduce the number of threads when the server load reduces.

Note:

For KeepAlive requests, only the first request is counted towards this limit. In effect, it changes the behavior to limit the number of connections per thread.


event - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache MPM event

Description: | An experimental variant of the standard worker MPM
Status: | MPM
Module Identifier: | mpm_event_module
Source File: | event.c

Summary

Warning

This MPM is experimental, so it may or may not work as expected.

The event Multi-Processing Module (MPM) is designed to allow more requests to be served simultaneously by passing off some processing work to supporting threads, freeing up the main threads to work on new requests. It is based on the worker MPM, which implements a hybrid multi-process multi-threaded server. Run-time configuration directives are identical to those provided by worker.

To use the event MPM, add --with-mpm=event to the configure script's arguments when building the httpd.

See also

  • The worker MPM

How it Works

This MPM tries to fix the 'keep alive problem' in HTTP. After a client completes the first request, the client can keep the connection open, and send further requests using the same socket. This can save significant overhead in creating TCP connections. However, Apache traditionally keeps an entire child process/thread waiting for data from the client, which brings its own disadvantages. To solve this problem, this MPM uses a dedicated thread to handle both the Listening sockets, and all sockets that are in a Keep Alive state.

The MPM assumes that the underlying apr_pollset implementation is reasonably threadsafe. This enables the MPM to avoid excessive high level locking, or having to wake up the listener thread in order to send it a keep-alive socket. This is currently only compatible with KQueue and EPoll.

Requirements

This MPM depends on APR's atomic compare-and-swap operations for thread synchronization. If you are compiling for an x86 target and you don't need to support 386s, or you are compiling for a SPARC and you don't need to run on pre-UltraSPARC chips, add --enable-nonportable-atomics=yes to the configure script's arguments. This will cause APR to implement atomic operations using efficient opcodes not available in older CPUs.

This MPM does not perform well on older platforms which lack good threading, but the requirement for EPoll or KQueue makes this moot.

  • To use this MPM on FreeBSD, FreeBSD 5.3 or higher is recommended. However, it is possible to run this MPM on FreeBSD 5.2.1, if you use libkse (see man libmap.conf).
  • For NetBSD, at least version 2.0 is recommended.
  • For Linux, a 2.6 kernel is recommended. It is also necessary to ensure that your version of glibc has been compiled with support for EPoll.


mpm_netware - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache MPM netware

Description: | Multi-Processing Module implementing an exclusively threaded web server optimized for Novell NetWare
Status: | MPM
Module Identifier: | mpm_netware_module
Source File: | mpm_netware.c

Summary

This Multi-Processing Module (MPM) implements an exclusively threaded web server that has been optimized for Novell NetWare.

The main thread is responsible for launching child worker threads which listen for connections and serve them when they arrive. Apache always tries to maintain several spare or idle worker threads, which stand ready to serve incoming requests. In this way, clients do not need to wait for a new child threads to be spawned before their requests can be served.

The StartThreads, MinSpareThreads, MaxSpareThreads, and MaxThreads regulate how the main thread creates worker threads to serve requests. In general, Apache is very self-regulating, so most sites do not need to adjust these directives from their default values. Sites with limited memory may need to decrease MaxThreads to keep the server from thrashing (spawning and terminating idle threads). More information about tuning process creation is provided in the performance hints documentation.

MaxRequestsPerChild controls how frequently the server recycles processes by killing old ones and launching new ones. On the NetWare OS it is highly recommended that this directive remain set to 0. This allows worker threads to continue servicing requests indefinitely.

See also

  • Setting which addresses and ports Apache uses

MaxThreads Directive

Description: | Set the maximum number of worker threads
Syntax: | MaxThreads number
Default: | MaxThreads 2048
Context: | server config
Status: | MPM
Module: | mpm_netware

The MaxThreads directive sets the desired maximum number worker threads allowable. The default value is also the compiled in hard limit. Therefore it can only be lowered, for example:

MaxThreads 512

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mpmt_os2 - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache MPM os2

Description: | Hybrid multi-process, multi-threaded MPM for OS/2
Status: | MPM
Module Identifier: | mpm_mpmt_os2_module
Source File: | mpmt_os2.c

Summary

The Server consists of a main, parent process and a small, static number of child processes.

The parent process's job is to manage the child processes. This involves spawning children as required to ensure there are always StartServers processes accepting connections.

Each child process consists of a a pool of worker threads and a main thread that accepts connections and passes them to the workers via a work queue. The worker thread pool is dynamic, managed by a maintenance thread so that the number of idle threads is kept between MinSpareThreads and MaxSpareThreads.

See also

  • Setting which addresses and ports Apache uses


prefork - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache MPM prefork

Açıklama: | Evresiz ön çatallamalı HTTP sunucusu oluşturur
Durum: | MPM
Modül Betimleyici: | mpm_prefork_module
Kaynak Dosyası: | prefork.c

Özet

Bu çok süreçlilik modülü (MPM) Apache 1.3’ün yaptığı gibi evresiz ve çocuk süreçlerin önceden çatallandığı bir HTTP sunucusu oluşturur. Evresiz kütüphanelerle uyumluluk için evrelemeden kaçınma ihtiyacında olan siteler için uygundur. Ayrıca istekleri birbirlerinden yalıtmak için en iyi MPM’dir, dolayısıyla herhangi bir istekle ilgili bir sorun diğerlerini etkilemez.

Bu MPM kendi kendine her duruma çok iyi uyum sağladığından yapılandırma yönergeleri ile yapılandırılmaya nadiren ihtiyaç gösterir. Yönergelerin en önemlisi MaxClients olup, değeri aynı anda almayı umduğunuz istek sayısını işleyebilecek kadar büyük, fiziksel belleğin tüm süreçlerin ihtiyaçlarını karşılamasına yetecek kadar da küçük olması gerekir.

Ayrıca bakınız:

  • Apache’nin kullandığı adres ve portların ayarlanması

Nasıl çalışır?

Bağlantıları dinleyip gerektiğinde onlara hizmet sunan çocuk süreçleri devreye almak tek bir denetim sürecinin sorumluluğundadır. Apache daima, gelen isteklere hizmet vermeye hazır bekleyen en fazla sayıda sunucu sürecini yedekte tutmaya veya boşta bekletmeye çalışır. Bu suretle, istemcilere isteklerinin sunulması için yeni çocuk süreçlerin çatallanmasını beklemek gerekmez.

Ana sürecin istekleri sunacak çocuk süreçleri oluşturma işlemini nasıl gerçekleştireceği StartServers, MinSpareServers, MaxSpareServers ve MaxClients yönergeleri ile düzenlenir. Apache kendiliğinden her duruma çok iyi uyum sağladığından, genelde, çoğu sitenin bu yönergelerin öntanımlı değerlerini değiştirmesi gerekmez. Aynı anda 256’dan fazla isteğe hizmet sunacak sitelerin MaxClients değerini arttırmaları gerekebilir. Ancak, fiziksel belleği yeterli olmayan sitelerin de sunucunun belleği diske takaslamasını önlemek için bu değeri azaltmaları gerekebilir. Süreç oluşturmanın ayarlanması ile ilgili daha fazla bilgi edinmek için başarım arttırma ipuçları belgesine bakınız.

Unix altında 80. portu dinleyebilmek için ana sürecin root tarafından çalıştırılmış olması gerekirse de çocuk süreçler Apache tarafından daha az yetkili bir kullanıcının aidiyetinde çalıştırılırlar. Apache’nin çocuk süreçlerinin kullanıcı ve gruplarını ayarlamak için User ve Group yönergeleri kullanılır. Çocuk süreçlerin sunacakları içeriği okumaya yetkili olmaları gerekir, fakat bu yetkinin mümkün olduğunca kısıtlı tutulmasına çalışılmalıdır.

MaxRequestsPerChild yönergesi ana sunucunun eski süreçleri öldürüp yenilerini oluşturmayı ne kadar sıklıkla yapacağını denetler.

MaxSpareServers Yönergesi

Açıklama: | Boştaki çocuk süreçlerin azami sayısı
Sözdizimi: | MaxSpareServers sayı
Öntanımlı: | MaxSpareServers 10
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | prefork

MaxSpareServers yönergesi boştaki çocuk sunucu süreçlerinin azami sayısını belirler. Boştaki süreç, o an bir isteğe hizmet sunmayan süreçtir. Eğer MaxSpareServers sayıda süreçten daha fazla boşta süreç varsa ana süreç bu fazlalıkları öldürecektir.

Bu parametrenin ayarlanması sadece çok meşgul siteler için gerekli olabilir. Bu parametreye çok büyük bir değerin atanması oldukça kötü bir fikirdir. Eğer bu değeri MinSpareServers değerine eşit veya daha küçük bir değere ayarlarsanız, Apache bu değeri kendiliğinden MinSpareServers + 1 olarak değiştirecektir.

Ayrıca bakınız:

  • MinSpareServers
  • StartServers

MinSpareServers Yönergesi

Açıklama: | Boştaki çocuk süreçlerin asgari sayısı
Sözdizimi: | MinSpareServers sayı
Öntanımlı: | MinSpareServers 5
Bağlam: | sunucu geneli
Durum: | MPM
Modül: | prefork

MinSpareServers yönergesi boştaki çocuk sunucu süreçlerinin asgari sayısını belirler. Boştaki süreç, o an bir isteğe hizmet sunmayan süreçtir. Eğer MinSpareServers sayıda süreçten daha az boşta süreç varsa ana süreç sayıyı tamamlamak için saniyede en fazla 1 süreç olmak üzere yeni çocuk süreçler oluşturacaktır.

Bu parametrenin ayarlanması sadece çok meşgul siteler için gerekli olabilir. Bu parametreye çok büyük bir değerin atanması oldukça kötü bir fikirdir.

Ayrıca bakınız:

  • MaxSpareServers
  • StartServers

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mpm_winnt - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache MPM winnt

Description: | This Multi-Processing Module is optimized for Windows NT.
Status: | MPM
Module Identifier: | mpm_winnt_module
Source File: | mpm_winnt.c

Summary

This Multi-Processing Module (MPM) is the default for the Windows NT operating systems. It uses a single control process which launches a single child process which in turn creates threads to handle requests

See also

  • Using Apache HTTP Server on Microsoft Windows

Win32DisableAcceptEx Directive

Description: | Use accept() rather than AcceptEx() to accept network connections
Syntax: | Win32DisableAcceptEx
Default: | AcceptEx() is enabled by default. Use this directive to disable use of AcceptEx()
Context: | server config
Status: | MPM
Module: | mpm_winnt
Compatibility: | Available in Version 2.0.49 and later

AcceptEx() is a Microsoft WinSock v2 API that provides some performance improvements over the use of the BSD style accept() API in certain circumstances. Some popular Windows products, typically virus scanning or virtual private network packages, have bugs that interfere with the proper operation of AcceptEx(). If you encounter an error condition like:

[error] (730038)An operation was attempted on something that is not a socket.: winnt_accept: AcceptEx failed. Attempting to recover.

you should use this directive to disable the use of AcceptEx().


worker - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache MPM worker

Açıklama: | Çok evreli ve çok süreçli melez bir HTTP sunucusu oluşturan çok süreçlilik modülü.
Durum: | MPM
Modül Betimleyici: | mpm_worker_module
Kaynak Dosyası: | worker.c

Özet

Bu çok süreçlilik modülü (MPM) hem çok süreçli hem de çok evreli olabilen melez bir sunucu oluşturur. İstekleri sunmak için evreleri kullanması sebebiyle çok süreçli bir sunucudan daha az sistem kaynağı harcayarak daha çok isteğe hizmet sunabilir. Bununla birlikte, herbiri çok sayıda evreye sahip çok sayıda süreci canlı tutarak bir çok süreçli sunucu kadar kararlı olur.

Bu MPM’i denetim altında tutmakta kullanılan en önemli yönergeler, her çocuk süreç için konuşlandırılacak evre sayısını belirleyen ThreadsPerChild yönergesi ile devreye sokulacak toplam evre sayısının azamisini belirleyen MaxClients yönergesidir.

Ayrıca bakınız:

  • Apache’nin kullandığı adres ve portların ayarlanması

Nasıl çalışır?

Çocuk süreçleri devreye almaktan tek bir süreç (ana süreç) sorumludur. Her çocuk süreç ThreadsPerChild yönergesinde belirtilen sayıda evre konuşlandırır. Bunlardan ayrı olarak, bir dinleyici evre bağlantıları dinleyip gelenleri işlenmek üzere bu sunucu evrelerinden birine aktarır.

Apache daima, gelen isteklere hizmet sunmaya hazır yedek veya boştaki sunucu evrelerinden oluşan bir havuzu canlı tutmaya çalışır. Bu suretle, istemcilere isteklerinin sunulması için yeni çocuk süreçlerin çatallanmasını, dolayısıyla yeni evrelerin konuşlandırılmasını beklemek gerekmez. Başlangıçta çalıştırılacak çocuk süreçlerin sayısı StartServers yönergesinde belirtilir. Apache, çalışma süresi boyunca MinSpareThreads ve MaxSpareThreads yönergeleri ile belirtilen sınırlar dahilinde kalmak üzere gerektiğinde süreçleri öldürerek gerektiğinde yenilerini devreye alarak tüm süreçlerdeki toplam evre sayısını sabit tutmaya çalışır. Bu işlem kendiliğinden çok iyi yürüdüğünden bu yönergelere öntanımlı değerlerinden farklı değerlerin atanması nadiren gerekli olur. Aynı anda hizmet sunulabilecek istemcilerin sayısı (yani, tüm süreçlerin toplam evre sayısı) MaxClients yönergesi ile belirlenir. Etkin çocuk süreçlerin sayısı ise MaxClients yönergesindeki değerin ThreadsPerChild yönergesindeki değere bölünmesi ile elde edilir.

Bu iki yönerge aynı anda etkin olabilecek çocuk süreçlerin ve her çocuk süreçteki sunucu evreleri sayısının üst sınırını belirler ve bu sınır sadece ana sunucu tamamen durdurulup yeniden başlatılarak değiştirilebilir. ServerLimit yönergesinin değeri etkin çocuk süreç sayısının üst sınırı olup MaxClients yönergesindeki değerin ThreadsPerChild yönergesindeki değere bölünmesi ile elde değere eşit veya bundan küçük olması gerekir. ThreadLimit yönergesinin değeri ise sunucu evreleri sayısının üst sınırını belirler ve ThreadsPerChild yönergesindeki değerden büyük veya ona eşit olması gerekir. Eğer bu yönergelere öntanımlı değerlerinden farklı bir değer atanacaksa bu atamaların diğer worker yönergelerinden önce yapılması gerekir.

Sonlandırma sırasında etkin çocuk süreçlere ek olarak mevcut istemci bağlantılarını işleme sokmaya çalışan tek bir sunucu evresinden başka fazladan bir çocuk süreç etkin kalabileceği gibi sonlandırılacak süreç sayısının en fazla MaxClients olması gerekirse de gerçekte sayı bundan küçük olabilir. Şöyle bir işlemle tek bir çocuk sürecin sonlandırılması iptal edilerek bu gibi durumlara karşı önlem alınabilir:

  • MaxRequestsPerChild yönergesinin değeri sıfır yapılır.
  • MaxSpareThreads ve MaxClients yönergelerinin değerleri birbirine eşitlenir.

worker modülünün öntanımlı süreç-evre yapılandırması genelde şöyledir:

ServerLimit 16
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25

Unix altında 80. portu dinleyebilmek için ana sürecin root tarafından çalıştırılmış olması gerekirse de çocuk süreçler ve evreler Apache tarafından daha az yetkili bir kullanıcının aidiyetinde çalıştırılırlar. Apache’nin çocuk süreçlerinin kullanıcı ve gruplarını ayarlamak için User ve Group yönergeleri kullanılır. Çocuk süreçlerin sunacakları içeriği okumaya yetkili olmaları gerekir, fakat bu yetkinin mümkün olduğunca kısıtlı tutulmasına çalışılmalıdır. Bundan başka, suexec kullanılmadığı takdirde, bu yönergeler CGI betikleri tarafından miras alınacak yetkili kullanıcı ve grubu da ayarlarlar.

MaxRequestsPerChild yönergesi ana sunucunun eski süreçleri öldürüp yenilerini oluşturmayı ne kadar sıklıkla yapacağını denetler.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_actions - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_actions

Description: | This module provides for executing CGI scripts based on media type or request method.
Status: | Base
Module Identifier: | actions_module
Source File: | mod_actions.c

Summary

This module has two directives. The Action directive lets you run CGI scripts whenever a file of a certain MIME content type is requested. The Script directive lets you run CGI scripts whenever a particular method is used in a request. This makes it much easier to execute scripts that process files.

See also

  • mod_cgi
  • Dynamic Content with CGI
  • Apache's Handler Use

Action Directive

Description: | Activates a CGI script for a particular handler or content-type
Syntax: | Action action-type cgi-script [virtual]
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_actions
Compatibility: | The virtual modifier and handler passing were introduced in Apache 2.1

This directive adds an action, which will activate cgi-script when action-type is triggered by the request. The cgi-script is the URL-path to a resource that has been designated as a CGI script using ScriptAlias or AddHandler. The action-type can be either a handler or a MIME content type. It sends the URL and file path of the requested document using the standard CGI PATH_INFO and PATH_TRANSLATED environment variables. The handler used for the particular request is passed using the REDIRECT_HANDLER variable.

Examples

# Requests for files of a particular MIME content type:
Action image/gif /cgi-bin/images.cgi

# Files of a particular file extension
AddHandler my-file-type .xyz
Action my-file-type /cgi-bin/program.cgi

In the first example, requests for files with a MIME content type of image/gif will be handled by the specified cgi script /cgi-bin/images.cgi.

In the second example, requests for files with a file extension of .xyz are handled by the specified cgi script /cgi-bin/program.cgi.

The optional virtual modifier turns off the check whether the requested file really exists. This is useful, for example, if you want to use the Action directive in virtual locations.

Example

<Location /news>
SetHandler news-handler
Action news-handler /cgi-bin/news.cgi virtual
 </Location>

See also

  • AddHandler

Script Directive

Description: | Activates a CGI script for a particular request method.
Syntax: | Script method cgi-script
Context: | server config, virtual host, directory
Status: | Base
Module: | mod_actions

This directive adds an action, which will activate cgi-script when a file is requested using the method of method. The cgi-script is the URL-path to a resource that has been designated as a CGI script using ScriptAlias or AddHandler. The URL and file path of the requested document is sent using the standard CGI PATH_INFO and PATH_TRANSLATED environment variables.

Any arbitrary method name may be used. Method names are case-sensitive, so Script PUT and Script put have two entirely different effects.

Note that the Script command defines default actions only. If a CGI script is called, or some other resource that is capable of handling the requested method internally, it will do so. Also note that Script with a method of GET will only be called if there are query arguments present (e.g., foo.html?hi). Otherwise, the request will proceed normally.

Examples

# For <ISINDEX>-style searching
Script GET /cgi-bin/search

# A CGI PUT handler
Script PUT /~bob/put.cgi

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_alias - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_alias

Açıklama: | Belge ağacının parçalarının dosya sisteminin parçalarıyla eşlenmesini sağlar ve URL yönlendirmesi yapar.
Durum: | Temel
Modül Betimleyici: | alias_module
Kaynak Dosyası: | mod_alias.c

Özet

Bu modülde bulunan yönergeler sunucuya istek olarak gelen URL’lerin denetlenmesini ve değiştirilmesini mümkün kılar. Alias ve ScriptAlias yönergeleri URL’lerin dosya sisteminin dizinlerine eşlenmesini sağlar. Böylece, kök dizini DocumentRoot ile belirtilen site belge ağacı altında bulunmayan içeriğe erişmek mümkün olur. ScriptAlias yönergesi buna ek olarak hedef dizini sadece CGI betiklerini içeren dizin olarak imler.

Redirect yönergesi, farklı bir URL ile yeni bir istek yapmaları için istemcileri yönlendirmekte kullanılır. Çoğunlukla özkaynak başka bir yere taşındığında kullanılır.

mod_alias modülü basit URL değiştirme görevlerini yerine getirmek için tasarlanmıştır. Sorgu dizgelerini işleme sokmak gibi daha karmaşık görevler için mod_rewrite modülü ile sağlanan araçlar kullanılır.

Ayrıca bakınız:

  • mod_rewrite
  • URL’lerin Dosya sistemi ile Eşlenmesi

İşlem Sırası

Farklı bağlamlarda bulunan Alias ve Redirect yönergeleri standart katıştırma kuralları ile ilgili diğer yönergeler gibi işleme sokulur. Fakat aynı bağlam dahilinde (örneğin, aynı <VirtualHost> bölümünde) çok fazla Alias ve Redirect varsa bunlar belli bir sıraya göre işleme sokulurlar.

İlk adımda, Alias’lardan önce bütün Redirect yönergeleri işleme sokulur. Bu bakımdan bir Redirect veya RedirectMatch ile eşleşen bir istek için hiçbir Alias uygulanmayacaktır. İkinci adımda yapılandırma dosyasında yer aldıkları sıraya göre Redirect ve Alias yönergeleri işleme sokulurlar, dolayısıyla ilk eşleşme öncelikli olmuş olur.

İlk eşleşmenin öncelikli olması sebebiyle, bu yönergelerin birden fazlası aynı alt yola uygulandığı takdirde, tüm yönergelerin etkili olabilmesi için en uzun yolu sıralamada en öne almalısınız. Örneğin aşağıdaki yapılandırma beklendiği gibi çalışacaktır:

Alias /foo/bar /baz
Alias /foo /gaz

Ama yukarıdaki iki satır ters sırada yerleştirilmiş olsaydı, /foo rumuzu daima /foo/bar rumuzundan önce eşleşecek, dolayısıyla ikinci yönerge yok sayılacaktı.

Alias Yönergesi

Açıklama: | URL’leri dosya sistemi konumlarıyla eşler.
Sözdizimi: | Alias URL-yolu dosya-yolu|dizin-yolu
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_alias

Alias yönergesi, belgelerin DocumentRoot dizininden farklı bir yerde saklanmasını mümkün kılar. URL-yolu ile başlayan URL’ler (% imlemesi çözüldükten sonra) dizin-yolu ile başlayan yerel dosyalarla eşlenir. URL-yolu, harf büyüklüğüne duyarsız sistemlerde bile harf büyüklüğüne duyarlıdır.

Örnek:

Alias /image /ftp/pub/image

http://mesela.dom/image/foo.gif şeklinde bir istek, sunucunun /ftp/pub/image/foo.gif dosyasıyla yanıt vermesine sebep olurdu. Sadece tam yol parçaları eşleştirilir; bu bakımdan yukarıdaki Alias yapılandırması http://mesela.dom/imagefoo.gif ile eşleşmez. Düzenli ifadelerin kullanıldığı daha karmaşık eşleşmeler için AliasMatch yönergesine bakınız.

URL-yolu’nu bir / ile sonlandırırsanız Alias yönergesini yorumlarken sunucunun da sona bir / ekleyeceğine dikkat ediniz. Yani, eğer

Alias /icons/ /usr/local/apache/icons/

diye bir tanım yaparsanız /icons URL’si için, sonunda bir / yokmuşçasına bir Alias kullanılmayacaktır. Benzer şekilde, URL-yolu belirtirken sonda / kullanmazsanız dosya-yolu için de sonda / kullanmamalısınız.

Alias hedefleri için ek <Directory> bölümleri belirtmeniz gerekebileceğine dikkat ediniz. <Directory> bölümlerinden önce yer alan Alias yönergelerine özellikle bakılır, dolayısıyla sadece Alias hedefleri etkilenir. (Bununla birlikte, Alias yönergelerinden önce işleme sokulan <Location> bölümlerinin uygulanacağına dikkat ediniz.)

Özellikle, DocumentRoot dışında bir dizine bir Alias oluşturuyorsanız hedef dizine doğrudan erişim izni vermeniz gerekebilir.

Örnek:

Alias /image /ftp/pub/image
<Directory /ftp/pub/image>
Order allow,deny
Allow from all
 </Directory>

URL-yolu değiştirgesindeki bölü çizgilerinin tamamı istekteki URL-yolunun içinde bulunan bölü çizgileri ile eşleşir.

AliasMatch Yönergesi

Açıklama: | URL’leri dosya sistemi konumlarıyla düzenli ifadeleri kullanarak eşler.
Sözdizimi: | AliasMatch düzenli-ifade dosya-yolu|dizin-yolu
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_alias

Bu yönerge URL-yolu ile eşleşmek üzere bir düzenli ifade kabul etmesi dışında Alias yönergesine eşdeğerdir. Belirtilen düzenli ifade URL-yolu ile eşleşiyorsa sunucu parantezli eşleşmeleri belirtilen dizgede kullanarak dosya yolunu elde eder. Örneğin, /icons dizinini etkinleştirmek için şu yazılabilir:

AliasMatch ^/icons(.*) /usr/local/apache/icons$1

Düzenli ifadeler tüm gücüyle kullanılabilir Örneğin, URL-yolu ile harf büyüklüğüne duyarsız eşleşmeler sağlayacak düzenli ifadeler kullanılabilir:

AliasMatch (?i)^/image(.*) /ftp/pub/image$1

Alias ile AliasMatch arasındaki belirgin tek fark Alias yönergesinin URI'nin bir ek bölümünü, sağda, dosya yolunun sonundaki eşleşen parçayı özdevinimli olarak kopyalayacak olmasıdır. Halbuki AliasMatch bunu yapmaz. Yani, hemen her durumda, istek URI'sinin baştan sona tümünün düzenli ifade ile eşleşmesini ve sağ taraftaki ikamenin kullanılmasını istersiniz.

Başka bir deyişle, Alias yerine AliasMatch yazmak aynı etkiyi sağlamayacaktır. En azından, düzenli ifadenin başına ^ ve sonuna (.*)$ ekledikten sonra yer değiştirme parçasının sonuna da $1 eklemeniz gerekir.

Örneğin, bunu AliasMatch ile değiştirmek istediğinizi varsayalım:

Alias /image/ /ftp/pub/image/

Bu aynı şey değildir; bunu yapmayın! Bu, herhangi bir yerinde /image/ içeren tüm istekleri /ftp/pub/image/ dizinine gönderecektir:

AliasMatch /image/ /ftp/pub/image/

Aynı etkiyi elde etmek için yapacağınız bu olacaktır:

AliasMatch ^/image/(.*)$ /ftp/pub/image/$1

Şüphesiz, Alias yönergesinin çalıştığı yerde AliasMatch kullanmanın bir yararı yoktur. AliasMatch daha karmaşık şeyler yapma imkanı verir. Örneğin, farklı dizinler altındaki farklı dosyalar için başka yerdeki dosyaları sunmak isteyelim:

AliasMatch ^/image/(.*)\.jpg$ /files/jpg.images/$1.jpg
AliasMatch ^/image/(.*)\.gif$ /files/gif.images/$1.gif

Bu modüldeki yönergeler istekteki URL-yolu ile karşılaştırılmadan önce istenen URL'nin başlangıcındaki bölü çizgilerini sunucu temizler.

Redirect Yönergesi

Açıklama: | İstemciyi, bir yönlendirme isteği döndürerek farklı bir URL’ye yönlendirir.
Sözdizimi: | Redirect [durum] URL-yolu URL
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_alias
Uyumluluk: | URL-yolu'nun son bileşen olarak belirtilebilmesi desteği Apache HTTP Sucusunun 2.2.6 sürümü ile eklendi.

Redirect yönergesi istemciye bir yönlendirme isteği döndürerek eski URL’yi yenisiyle eşler.

Eski URL-yolu bir bölü çizgisi ile başlar ve harf büyüklüğüne duyarlıdır (% imlemesi çözüldükten sonra). URL-yolu olarak göreli yollara izin verilmez. URL ise ya bir şema ve konak ismi ile başlayan bir mutlak URL olmalıdır. Apache HTTP Sucusu 2.2.6 ve sonrasında bir bölü çizgisi ile başlayan bir URL yolu belirtilebilmektedir; bu durumda URL yolunun başına geçerli sunucu ismi ve şemayı sunucu ekler.

URL-yolu ile başlayan istekler istemciye hedef URL konumuna bir yönlendirme isteği olarak dönecektir. URL-yolu’nun devamı niteliğindeki ek yol hedef URL’ye eklenir.

Örnek:

Redirect /hizmet http://iki.mesela.dom/hizmet

İstemcinin yaptığı http://mesela.dom/hizmet/fesmekan.txt isteğine karşılık istemciye isteği http://iki.mesela.dom/hizmet/fesmekan.txt olarak yapması söylenecektir. Sadece tam yol parçaları eşleştirilir, bu nedenle http://mesela.dom/hizmetfesmekan.txt isteği yukarıdaki yönlendirme ile eşleşmeyecektir. Düzenli ifadelerin kullanıldığı daha karmaşık eşleşmeler için RedirectMatch yönergesine bakınız.

Bilginize

Yapılandırma dosyasında yer alış sırasına bakmaksızın Redirect yönergeleri Alias ve ScriptAlias yönergelerinden önce ele alınır.

Herhangi bir durum belirtilmemişse "geçici" yönlendirme (HTTP durum kodu: 302) yapılır. Bu, istemciye özkaynağın geçici olarak başka yere taşındığını belirtir. Diğer HTTP durum kodlarını döndürmek için kullanılabilecek durum değerleri:

permanent
İstemciye özkaynağın kalıcı olarak taşındığını belirten kalıcı yönlendirme durumu (301) döndürülür.
temp
İstemciye geçici yönlendirme durumu (302) döner. Bu öntanımlıdır.
seeother
İstemciye özkaynağın yerine başka bir şey konduğunu belirten "diğerine bak" durumu (303) döndürülür.
gone
İstemciye özkaynağın kalıcı olarak kaldırıldığını belirten "ölü bağlantı" durumu (410) döner. Bu durumda URL belirtilmez.

Diğer durum kodları için durum olarak sayısal durum kodu belirtilir. Eğer durum 300 ile 399 arasındaysa bir URL belirtmek gereklidir, yoksa belirtilmez. Belirtilecek durum kodunu Apache’nin bilmesi gerektiğine dikkat ediniz (http_protocol.c dosyasında bulunan send_error_response işlevine bakınız).

Örnek:

Redirect permanent /bir http://mesela.dom/iki
Redirect 303 /yedi http://mesela.dom/baskabisey

RedirectMatch Yönergesi

Açıklama: | Geçerli URL ile eşleşen bir düzenli ifadeye dayanarak bir harici yönlendirme gönderir.
Sözdizimi: | RedirectMatch [durum] düzenli-ifade URL
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_alias

Bu yönerge URL-yolu ile eşleşmek üzere bir düzenli ifade kabul etmesi dışında Redirect yönergesine eşdeğerdir. Belirtilen düzenli ifade URL-yolu ile eşleşiyorsa sunucu parantezli eşleşmeleri belirtilen dizgede kullanarak dosya yolunu elde eder. Örneğin, tüm GIF dosyası isteklerini başka bir sunucudaki aynı isimli JPEG dosyalarına yönlendirmek için şu yazılabilir:

RedirectMatch (.*)\.gif$ http://baska.sunucu.dom$1.jpg

RedirectPermanent Yönergesi

Açıklama: | İstemciyi, kalıcı bir yönlendirme isteği döndürerek farklı bir URL’ye yönlendirir.
Sözdizimi: | RedirectPermanent URL-yolu URL
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_alias

Bu yönerge istemciye daima kalıcı yönlendirme durumu (301) döndürür. Yani, Redirect permanent ile aynı işi yapar.

RedirectTemp Yönergesi

Açıklama: | İstemciyi, geçici bir yönlendirme isteği döndürerek farklı bir URL’ye yönlendirir.
Sözdizimi: | RedirectTemp URL-yolu URL
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_alias

Bu yönerge istemciye daima geçici yönlendirme durumu (302) döndürür. Yani, Redirect temp ile aynı işi yapar.

ScriptAlias Yönergesi

Açıklama: | Bir URL’yi dosya sistemindeki bir yere eşler ve hedefi bir CGI betiği olarak çalıştırır.
Sözdizimi: | ScriptAlias URL-yolu dosya-yolu|dizin-yolu
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_alias

Hedef dizini, mod_cgi modülünün CGI betiği yorumlayıcısı tarafından çalıştırılacak betikleri içeren dizin olarak imlemesi dışında Alias yönergesinin yaptığı işi yapar. URL-yolu ile başlayan harf büyüklüğüne duyarlı URL’ler (% imlemesi çözüldükten sonra), dosya sistemindeki bir tam yol olarak belirtilmiş dizin-yolu ile başlayan betiklerle eşlenir.

Örnek:

ScriptAlias /cgi-bin/ /siteler/cgi-bin/

http://mesela.dom/cgi-bin/foo şeklindeki bir istek sunucunun /siteler/cgi-bin/foo betiğini çalıştırmasına sebep olur. Bu yapılandırma aslında şuna eşdeğerdir:

Alias /cgi-bin/ /siteler/cgi-bin/
<Location /cgi-bin >
SetHandler cgi-script
Options +ExecCGI
 </Location>

Yapılandırma değiştiğinde kaynak kodlarının ister istemez açığa çıkmasını istemiyorsanız CGI betiklerinizi DocumentRoot altına koymayınız. ScriptAlias yönergesi URL’yi doğru yere eşlemekten başka orayı bir CGI betikleri dizini olarak imler. CGI betiklerinizi DocumentRoot altına koyarsanız çalıştırmak için ScriptAlias değil, <Directory>, SetHandler ve Options yönergelerini örnekteki gibi kullanın:

<Directory /usr/local/apache2/htdocs/cgi-bin >
SetHandler cgi-script
Options ExecCGI
 </Directory>

Aynı dosya sistemi konumu ile çok sayıda URL-yolu eşleşebileceğinden, bir Directory bölümü ile sınırlanmadığı takdirde CGI betiklerinin kaynak kodları açığa çıkabilir; bu bakımdan ScriptAlias yönergesini yok sayan URL yollarının belirtilebilme olasılığı gözardı edilmemelidir.

Ayrıca bakınız:

  • CGI Öğreticisi

ScriptAliasMatch Yönergesi

Açıklama: | Bir URL’yi dosya sistemindeki bir yere düzenli ifade kullanarak eşler ve hedefi bir CGI betiği olarak çalıştırır.
Sözdizimi: | ScriptAliasMatch düzenli-ifade dosya-yolu|dizin-yolu
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_alias

Bu yönerge URL-yolu ile eşleşmek üzere bir düzenli ifade kabul etmesi dışında ScriptAlias yönergesine eşdeğerdir. Belirtilen düzenli ifade URL-yolu ile eşleşiyorsa sunucu parantezli eşleşmeleri belirtilen dizgede kullanarak dosya yolunu elde eder. Örneğin, standart /cgi-bin dizinini etkin kılmak için şu yazılabilir:

ScriptAliasMatch ^/cgi-bin(.*) /usr/local/apache/cgi-bin$1

AliasMatch'teki gibi, burada da düzenli ifadeler tüm gücüyle kullanılabilir. Örneğin, bir URL yolu ile harf büyüklüğüne duyarsız eşleşme sağlayan bir rumuz oluşturmak mümkündür:

ScriptAliasMatch (?i)^/cgi-bin(.*) /usr/local/apache/cgi-bin$1

Alias ve AliasMatch arasındaki farklarla ilgili herşey burada da geçerlidir. Ayrıntılar için AliasMatchyönergesine bakınız.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_asis - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_asis

Description: | Sends files that contain their own HTTP headers
Status: | Base
Module Identifier: | asis_module
Source File: | mod_asis.c

Summary

This module provides the handler send-as-is which causes Apache to send the document without adding most of the usual HTTP headers.

This can be used to send any kind of data from the server, including redirects and other special HTTP responses, without requiring a cgi-script or an nph script.

For historical reasons, this module will also process any file with the mime type httpd/send-as-is.

See also

  • mod_headers
  • mod_cern_meta
  • Apache's Handler Use

Usage

In the server configuration file, associate files with the send-as-is handler e.g.

AddHandler send-as-is asis

The contents of any file with a .asis extension will then be sent by Apache to the client with almost no changes. In particular, HTTP headers are derived from the file itself according to mod_cgi rules, so an asis file must include valid headers, and may also use the CGI Status: header to determine the HTTP response code.

Here's an example of a file whose contents are sent as is so as to tell the client that a file has redirected.

Status: 301 Now where did I leave that URL
Location: http://xyz.abc.com/foo/bar.html
Content-type: text/html

<html>
<head>
<title>Lame excuses'R'us</title>
</head>
<body>
<h1>Fred's exceptionally wonderful page has moved to
<a href="http://xyz.abc.com/foo/bar.html">Joe's</a> site.
</h1>
</body>
</html>

Notes:

The server always adds a Date: and Server: header to the data returned to the client, so these should not be included in the file. The server does not add a Last-Modified header; it probably should.


mod_auth_basic - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_auth_basic

Description: | Basic authentication
Status: | Base
Module Identifier: | auth_basic_module
Source File: | mod_auth_basic.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module allows the use of HTTP Basic Authentication to restrict access by looking up users in the given providers. HTTP Digest Authentication is provided by mod_auth_digest. This module should usually be combined with at least one authentication module such as mod_authn_file and one authorization module such as mod_authz_user.

See also

  • AuthName
  • AuthType
  • Require
  • Satisfy
  • Authentication howto

AuthBasicAuthoritative Directive

Description: | Sets whether authorization and authentication are passed to lower level modules
Syntax: | AuthBasicAuthoritative On|Off
Default: | AuthBasicAuthoritative On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Base
Module: | mod_auth_basic

Normally, each authorization module listed in AuthBasicProvider will attempt to verify the user, and if the user is not found in any provider, access will be denied. Setting the AuthBasicAuthoritative directive explicitly to Off allows for both authentication and authorization to be passed on to other non-provider-based modules if there is no userID or rule matching the supplied userID. This should only be necessary when combining mod_auth_basic with third-party modules that are not configured with the AuthBasicProvider directive. When using such modules, the order of processing is determined in the modules' source code and is not configurable.

AuthBasicProvider Directive

Description: | Sets the authentication provider(s) for this location
Syntax: | AuthBasicProvider provider-name [provider-name] ...
Default: | AuthBasicProvider file
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Base
Module: | mod_auth_basic

The AuthBasicProvider directive sets which provider is used to authenticate the users for this location. The default file provider is implemented by the mod_authn_file module. Make sure that the chosen provider module is present in the server.

Example

<Location /secure>
AuthType basic
AuthName "private area"
AuthBasicProvider dbm
AuthDBMType SDBM
AuthDBMUserFile /www/etc/dbmpasswd
Require valid-user
 </Location>

Providers are queried in order until a provider finds a match for the requested username, at which point this sole provider will attempt to check the password. A failure to verify the password does not result in control being passed on to subsequent providers.

Providers are implemented by mod_authn_dbm, mod_authn_file, mod_authn_dbd, and mod_authnz_ldap.


mod_auth_digest - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_auth_digest

Description: | User authentication using MD5 Digest Authentication.
Status: | Extension
Module Identifier: | auth_digest_module
Source File: | mod_auth_digest.c

Summary

This module implements HTTP Digest Authentication (RFC2617), and provides an alternative to mod_auth_basic where the password is not transmitted as cleartext. However, this does not lead to a significant security advantage over basic authentication. On the other hand, the password storage on the server is much less secure with digest authentication than with basic authentication. Therefore, using basic auth and encrypting the whole connection using mod_ssl is a much better alternative.

See also

  • AuthName
  • AuthType
  • Require
  • Satisfy
  • Authentication howto

Using Digest Authentication

Using MD5 Digest authentication is very simple. Simply set up authentication normally, using AuthType Digest and AuthDigestProvider instead of the normal AuthType Basic and AuthBasicProvider. Then add a AuthDigestDomain directive containing at least the root URI(s) for this protection space.

Appropriate user (text) files can be created using the htdigest tool.

Example:

<Location /private/>
AuthType Digest
AuthName "private area"
AuthDigestDomain /private/ http://mirror.my.dom/private2/

AuthDigestProvider file
AuthUserFile /web/auth/.digest_pw
Require valid-user
 </Location>

Note

Digest authentication was intended to be more secure than basic authentication, but no longer fulfills that design goal. A man-in-the-middle attacker can trivially force the browser to downgrade to basic authentication. And even a passive eavesdropper can brute-force the password using today's graphics hardware, because the hashing algorithm used by digest authentication is too fast. Another problem is that the storage of the passwords on the server is insecure. The contents of a stolen htdigest file can be used directly for digest authentication. Therefore using mod_ssl to encrypt the whole connection is strongly recommended.

AuthDigestAlgorithm Directive

Description: | Selects the algorithm used to calculate the challenge and response hashes in digest authentication
Syntax: | AuthDigestAlgorithm MD5|MD5-sess
Default: | AuthDigestAlgorithm MD5
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_auth_digest

The AuthDigestAlgorithm directive selects the algorithm used to calculate the challenge and response hashes.

MD5-sess is not correctly implemented yet.

AuthDigestDomain Directive

Description: | URIs that are in the same protection space for digest authentication
Syntax: | AuthDigestDomain URI [URI] ...
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_auth_digest

The AuthDigestDomain directive allows you to specify one or more URIs which are in the same protection space (i.e. use the same realm and username/password info). The specified URIs are prefixes; the client will assume that all URIs "below" these are also protected by the same username/password. The URIs may be either absolute URIs (i.e. including a scheme, host, port, etc.) or relative URIs.

This directive should always be specified and contain at least the (set of) root URI(s) for this space. Omitting to do so will cause the client to send the Authorization header for every request sent to this server. Apart from increasing the size of the request, it may also have a detrimental effect on performance if AuthDigestNcCheck is on.

The URIs specified can also point to different servers, in which case clients (which understand this) will then share username/password info across multiple servers without prompting the user each time.

AuthDigestNcCheck Directive

Description: | Enables or disables checking of the nonce-count sent by the server
Syntax: | AuthDigestNcCheck On|Off
Default: | AuthDigestNcCheck Off
Context: | server config
Status: | Extension
Module: | mod_auth_digest
Not implemented yet.

AuthDigestNonceFormat Directive

Description: | Determines how the nonce is generated
Syntax: | AuthDigestNonceFormat format
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_auth_digest
Not implemented yet.

AuthDigestNonceLifetime Directive

Description: | How long the server nonce is valid
Syntax: | AuthDigestNonceLifetime seconds
Default: | AuthDigestNonceLifetime 300
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_auth_digest

The AuthDigestNonceLifetime directive controls how long the server nonce is valid. When the client contacts the server using an expired nonce the server will send back a 401 with stale=true. If seconds is greater than 0 then it specifies the amount of time for which the nonce is valid; this should probably never be set to less than 10 seconds. If seconds is less than 0 then the nonce never expires.

AuthDigestProvider Directive

Description: | Sets the authentication provider(s) for this location
Syntax: | AuthDigestProvider provider-name [provider-name] ...
Default: | AuthDigestProvider file
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_auth_digest

The AuthDigestProvider directive sets which provider is used to authenticate the users for this location. The default file provider is implemented by the mod_authn_file module. Make sure that the chosen provider module is present in the server.

See mod_authn_dbm, mod_authn_file, and mod_authn_dbd for providers.

AuthDigestQop Directive

Description: | Determines the quality-of-protection to use in digest authentication
Syntax: | AuthDigestQop none|auth|auth-int [auth|auth-int]
Default: | AuthDigestQop auth
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_auth_digest

The AuthDigestQop directive determines the quality-of-protection to use. auth will only do authentication (username/password); auth-int is authentication plus integrity checking (an MD5 hash of the entity is also computed and checked); none will cause the module to use the old RFC-2069 digest algorithm (which does not include integrity checking). Both auth and auth-int may be specified, in which the case the browser will choose which of these to use. none should only be used if the browser for some reason does not like the challenge it receives otherwise.

auth-int is not implemented yet.

AuthDigestShmemSize Directive

Description: | The amount of shared memory to allocate for keeping track of clients
Syntax: | AuthDigestShmemSize size
Default: | AuthDigestShmemSize 1000
Context: | server config
Status: | Extension
Module: | mod_auth_digest

The AuthDigestShmemSize directive defines the amount of shared memory, that will be allocated at the server startup for keeping track of clients. Note that the shared memory segment cannot be set less than the space that is necessary for tracking at least one client. This value is dependant on your system. If you want to find out the exact value, you may simply set AuthDigestShmemSize to the value of 0 and read the error message after trying to start the server.

The size is normally expressed in Bytes, but you may let the number follow a K or an M to express your value as KBytes or MBytes. For example, the following directives are all equivalent:

AuthDigestShmemSize 1048576
AuthDigestShmemSize 1024K
AuthDigestShmemSize 1M

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_authn_alias - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authn_alias

Description: | Provides the ability to create extended authentication providers based on actual providers
Status: | Extension
Module Identifier: | authn_alias_module
Source File: | mod_authn_alias.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module allows extended authentication providers to be created within the configuration file and assigned an alias name. The alias providers can then be referenced through the directives AuthBasicProvider or AuthDigestProvider in the same way as a base authentication provider. Besides the ability to create and alias an extended provider, it also allows the same extended authentication provider to be reference by multiple locations.

Examples

This example checks for passwords in two different text files.

Checking multiple text password files

# Check here first
<AuthnProviderAlias file file1>
AuthUserFile /www/conf/passwords1
 </AuthnProviderAlias>

# Then check here
<AuthnProviderAlias file file2>
AuthUserFile /www/conf/passwords2
 </AuthnProviderAlias>

<Directory /var/web/pages/secure>
AuthBasicProvider file1 file2

AuthType Basic
AuthName "Protected Area"
Require valid-user
 </Directory>

The example below creates two different ldap authentication provider aliases based on the ldap provider. This allows a single authenticated location to be serviced by multiple ldap hosts:

Checking multiple LDAP servers

LoadModule authn_alias_module modules/mod_authn_alias.so

<AuthnProviderAlias ldap ldap-alias1>
AuthLDAPBindDN cn=youruser,o=ctx
AuthLDAPBindPassword yourpassword
AuthLDAPURL ldap://ldap.host/o=ctx
 </AuthnProviderAlias>

<AuthnProviderAlias ldap ldap-other-alias>
AuthLDAPBindDN cn=yourotheruser,o=dev
AuthLDAPBindPassword yourotherpassword
AuthLDAPURL ldap://other.ldap.host/o=dev?cn
 </AuthnProviderAlias>

Alias /secure /webpages/secure
<Directory /webpages/secure>
Order deny,allow
Allow from all

AuthBasicProvider ldap-other-alias ldap-alias1

AuthType Basic
AuthName LDAP_Protected_Place
AuthzLDAPAuthoritative off
Require valid-user
 </Directory>

<AuthnProviderAlias> Directive

Description: | Enclose a group of directives that represent an extension of a base authentication provider and referenced by the specified alias
Syntax: | <AuthnProviderAlias baseProvider Alias> ... </AuthnProviderAlias>
Context: | server config
Status: | Extension
Module: | mod_authn_alias

<AuthnProviderAlias> and </AuthnProviderAlias> are used to enclose a group of authentication directives that can be referenced by the alias name using one of the directives AuthBasicProvider or AuthDigestProvider.

This directive has no affect on authorization, even for modules that provide both authentication and authorization.


mod_authn_anon - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authn_anon

Description: | Allows "anonymous" user access to authenticated areas
Status: | Extension
Module Identifier: | authn_anon_module
Source File: | mod_authn_anon.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module provides authentication front-ends such as mod_auth_basic to authenticate users similar to anonymous-ftp sites, i.e. have a 'magic' user id 'anonymous' and the email address as a password. These email addresses can be logged.

Combined with other (database) access control methods, this allows for effective user tracking and customization according to a user profile while still keeping the site open for 'unregistered' users. One advantage of using Auth-based user tracking is that, unlike magic-cookies and funny URL pre/postfixes, it is completely browser independent and it allows users to share URLs.

When using mod_auth_basic, this module is invoked via the AuthBasicProvider directive with the anon value.

Example

The example below is combined with "normal" htpasswd-file based authentication and allows users in additionally as 'guests' with the following properties:

  • It insists that the user enters a userID. (Anonymous_NoUserID)
  • It insists that the user enters a password. (Anonymous_MustGiveEmail)
  • The password entered must be a valid email address, i.e. contain at least one '@' and a '.'. (Anonymous_VerifyEmail)
  • The userID must be one of anonymous guest www test welcome and comparison is not case sensitive. (Anonymous)
  • And the Email addresses entered in the passwd field are logged to the error log file. (Anonymous_LogEmail)

Example

<Directory /foo> AuthName "Use 'anonymous' & Email address for guest entry"
AuthType Basic
AuthBasicProvider file anon
AuthUserFile /path/to/your/.htpasswd

Anonymous_NoUserID off
Anonymous_MustGiveEmail on
Anonymous_VerifyEmail on
Anonymous_LogEmail on
Anonymous anonymous guest www test welcome

Order Deny,Allow
Allow from all

Require valid-user
 </Directory>

Anonymous Directive

Description: | Specifies userIDs that are allowed access without password verification
Syntax: | Anonymous user [user] ...
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authn_anon

A list of one or more 'magic' userIDs which are allowed access without password verification. The userIDs are space separated. It is possible to use the ' and " quotes to allow a space in a userID as well as the \ escape character.

Please note that the comparison is case-IN-sensitive.
It's strongly recommended that the magic username 'anonymous' is always one of the allowed userIDs.

Example:

Anonymous anonymous "Not Registered" "I don't know"

This would allow the user to enter without password verification by using the userIDs "anonymous", "AnonyMous", "Not Registered" and "I Don't Know".

As of Apache 2.1 it is possible to specify the userID as "*". That allows any supplied userID to be accepted.

Anonymous_LogEmail Directive

Description: | Sets whether the password entered will be logged in the error log
Syntax: | Anonymous_LogEmail On|Off
Default: | Anonymous_LogEmail On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authn_anon

When set On, the default, the 'password' entered (which hopefully contains a sensible email address) is logged in the error log.

Anonymous_MustGiveEmail Directive

Description: | Specifies whether blank passwords are allowed
Syntax: | Anonymous_MustGiveEmail On|Off
Default: | Anonymous_MustGiveEmail On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authn_anon

Specifies whether the user must specify an email address as the password. This prohibits blank passwords.

Anonymous_NoUserID Directive

Description: | Sets whether the userID field may be empty
Syntax: | Anonymous_NoUserID On|Off
Default: | Anonymous_NoUserID Off
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authn_anon

When set On, users can leave the userID (and perhaps the password field) empty. This can be very convenient for MS-Explorer users who can just hit return or click directly on the OK button; which seems a natural reaction.

Anonymous_VerifyEmail Directive

Description: | Sets whether to check the password field for a correctly formatted email address
Syntax: | Anonymous_VerifyEmail On|Off
Default: | Anonymous_VerifyEmail Off
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authn_anon

When set On the 'password' entered is checked for at least one '@' and a '.' to encourage users to enter valid email addresses (see the above Anonymous_LogEmail).


mod_authn_dbd - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authn_dbd

Description: | User authentication using an SQL database
Status: | Extension
Module Identifier: | authn_dbd_module
Source File: | mod_authn_dbd.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module provides authentication front-ends such as mod_auth_digest and mod_auth_basic to authenticate users by looking up users in SQL tables. Similar functionality is provided by, for example, mod_authn_file.

This module relies on mod_dbd to specify the backend database driver and connection parameters, and manage the database connections.

When using mod_auth_basic or mod_auth_digest, this module is invoked via the AuthBasicProvider or AuthDigestProvider with the dbd value.

See also

  • AuthName
  • AuthType
  • AuthBasicProvider
  • AuthDigestProvider
  • DBDriver
  • DBDParams

Configuration Example

This simple example shows use of this module in the context of the Authentication and DBD frameworks. Please note that you need to load an authorization module, such as mod_authz_user, to get it working.

# mod_dbd configuration
DBDriver pgsql
DBDParams "dbname=apacheauth user=apache password=xxxxxx"

DBDMin  4
DBDKeep 8
DBDMax  20
DBDExptime 300

<Directory /usr/www/myhost/private>
  # core authentication and mod_auth_basic configuration
  # for mod_authn_dbd
  AuthType Basic
  AuthName "My Server"
  AuthBasicProvider dbd

  # core authorization configuration
  Require valid-user

  # mod_authn_dbd SQL query to authenticate a user
  AuthDBDUserPWQuery \
    "SELECT password FROM authn WHERE user = %s"
</Directory>

Exposing Login Information

If httpd was built against APR version 1.3.0 or higher, then whenever a query is made to the database server, all column values in the first row returned by the query are placed in the environment, using environment variables with the prefix "AUTHENTICATE_".

If a database query for example returned the username, full name and telephone number of a user, a CGI program will have access to this information without the need to make a second independent database query to gather this additional information.

This has the potential to dramatically simplify the coding and configuration required in some web applications.

AuthDBDUserPWQuery Directive

Description: | SQL query to look up a password for a user
Syntax: | AuthDBDUserPWQuery query
Context: | directory
Status: | Extension
Module: | mod_authn_dbd

The AuthDBDUserPWQuery specifies an SQL query to look up a password for a specified user. The user's ID will be passed as a single string parameter when the SQL query is executed. It may be referenced within the query statement using a %s format specifier.

Example

AuthDBDUserPWQuery \
  "SELECT password FROM authn WHERE user = %s"

The first column value of the first row returned by the query statement should be a string containing the encrypted password. Subsequent rows will be ignored. If no rows are returned, the user will not be authenticated through mod_authn_dbd.

If httpd was built against APR version 1.3.0 or higher, any additional column values in the first row returned by the query statement will be stored as environment variables with names of the form AUTHENTICATE_COLUMN.

The encrypted password format depends on which authentication frontend (e.g. mod_auth_basic or mod_auth_digest) is being used. See Password Formats for more information.

AuthDBDUserRealmQuery Directive

Description: | SQL query to look up a password hash for a user and realm.
Syntax: | AuthDBDUserRealmQuery query
Context: | directory
Status: | Extension
Module: | mod_authn_dbd

The AuthDBDUserRealmQuery specifies an SQL query to look up a password for a specified user and realm in a digest authentication process. The user's ID and the realm, in that order, will be passed as string parameters when the SQL query is executed. They may be referenced within the query statement using %s format specifiers.

Example

AuthDBDUserRealmQuery \
  "SELECT password FROM authn WHERE user = %s AND realm = %s"

The first column value of the first row returned by the query statement should be a string containing the encrypted password. Subsequent rows will be ignored. If no rows are returned, the user will not be authenticated through mod_authn_dbd.

If httpd was built against APR version 1.3.0 or higher, any additional column values in the first row returned by the query statement will be stored as environment variables with names of the form AUTHENTICATE_COLUMN.

The encrypted password format depends on which authentication frontend (e.g. mod_auth_basic or mod_auth_digest) is being used. See Password Formats for more information.


mod_authn_dbm - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authn_dbm

Description: | User authentication using DBM files
Status: | Extension
Module Identifier: | authn_dbm_module
Source File: | mod_authn_dbm.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module provides authentication front-ends such as mod_auth_digest and mod_auth_basic to authenticate users by looking up users in dbm password files. Similar functionality is provided by mod_authn_file.

When using mod_auth_basic or mod_auth_digest, this module is invoked via the AuthBasicProvider or AuthDigestProvider with the dbm value.

See also

  • AuthName
  • AuthType
  • AuthBasicProvider
  • AuthDigestProvider

AuthDBMType Directive

Description: | Sets the type of database file that is used to store passwords
Syntax: | AuthDBMType default|SDBM|GDBM|NDBM|DB
Default: | AuthDBMType default
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authn_dbm

Sets the type of database file that is used to store the passwords. The default database type is determined at compile time. The availability of other types of database files also depends on compile-time settings.

It is crucial that whatever program you use to create your password files is configured to use the same type of database.

AuthDBMUserFile Directive

Description: | Sets the name of a database file containing the list of users and passwords for authentication
Syntax: | AuthDBMUserFile file-path
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authn_dbm

The AuthDBMUserFile directive sets the name of a DBM file containing the list of users and passwords for user authentication. File-path is the absolute path to the user file.

The user file is keyed on the username. The value for a user is the encrypted password, optionally followed by a colon and arbitrary data. The colon and the data following it will be ignored by the server.

Security:

Make sure that the AuthDBMUserFile is stored outside the document tree of the web-server; do not put it in the directory that it protects. Otherwise, clients will be able to download the AuthDBMUserFile.

Important compatibility note: The implementation of dbmopen in the apache modules reads the string length of the hashed values from the DBM data structures, rather than relying upon the string being NULL-appended. Some applications, such as the Netscape web server, rely upon the string being NULL-appended, so if you are having trouble using DBM files interchangeably between applications this may be a part of the problem.

A perl script called dbmmanage is included with Apache. This program can be used to create and update DBM format password files for use with this module.


mod_authn_default - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authn_default

Description: | Authentication fallback module
Status: | Base
Module Identifier: | authn_default_module
Source File: | mod_authn_default.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module is designed to be the fallback module, if you don't have configured an authentication module like mod_auth_basic. It simply rejects any credentials supplied by the user.

AuthDefaultAuthoritative Directive

Description: | Sets whether authentication is passed to lower level modules
Syntax: | AuthDefaultAuthoritative On|Off
Default: | AuthDefaultAuthoritative On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Base
Module: | mod_authn_default

Setting the AuthDefaultAuthoritative directive explicitly to Off allows for authentication to be passed on to lower level modules (as defined in the modules.c files).

Note

Normally there are no lower level modules, since mod_authn_default is defined to be already on a very low level. Therefore you should leave the value of AuthDefaultAuthoritative as default (On).


mod_authn_file - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authn_file

Description: | User authentication using text files
Status: | Base
Module Identifier: | authn_file_module
Source File: | mod_authn_file.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module provides authentication front-ends such as mod_auth_digest and mod_auth_basic to authenticate users by looking up users in plain text password files. Similar functionality is provided by mod_authn_dbm.

When using mod_auth_basic or mod_auth_digest, this module is invoked via the AuthBasicProvider or AuthDigestProvider with the file value.

See also

  • AuthBasicProvider
  • AuthDigestProvider
  • htpasswd
  • htdigest

AuthUserFile Directive

Description: | Sets the name of a text file containing the list of users and passwords for authentication
Syntax: | AuthUserFile file-path
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Base
Module: | mod_authn_file

The AuthUserFile directive sets the name of a textual file containing the list of users and passwords for user authentication. File-path is the path to the user file. If it is not absolute, it is treated as relative to the ServerRoot.

Each line of the user file contains a username followed by a colon, followed by the encrypted password. If the same user ID is defined multiple times, mod_authn_file will use the first occurrence to verify the password.

The utility htpasswd which is installed as part of the binary distribution, or which can be found in src/support, is used to maintain the password file for HTTP Basic Authentication. See the man page for more details. In short:

Create a password file Filename with username as the initial ID. It will prompt for the password:

htpasswd -c Filename username

Add or modify username2 in the password file Filename:

htpasswd Filename username2

Note that searching large text files is very inefficient; AuthDBMUserFile should be used instead.

If you are using HTTP Digest Authentication, the htpasswd tool is not sufficient. You have to use htdigest instead. Note that you cannot mix user data for Digest Authentication and Basic Authentication within the same file.

Security

Make sure that the AuthUserFile is stored outside the document tree of the web-server. Do not put it in the directory that it protects. Otherwise, clients may be able to download the AuthUserFile.


mod_authnz_ldap - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authnz_ldap

Description: | Allows an LDAP directory to be used to store the database for HTTP Basic authentication.
Status: | Extension
Module Identifier: | authnz_ldap_module
Source File: | mod_authnz_ldap.c
Compatibility: | Available in version 2.1 and later

Summary

This module provides authentication front-ends such as mod_auth_basic to authenticate users through an ldap directory.

mod_authnz_ldap supports the following features:

  • Known to support the OpenLDAP SDK (both 1.x and 2.x), Novell LDAP SDK and the iPlanet (Netscape) SDK.
  • Complex authorization policies can be implemented by representing the policy with LDAP filters.
  • Uses extensive caching of LDAP operations via mod_ldap.
  • Support for LDAP over SSL (requires the Netscape SDK) or TLS (requires the OpenLDAP 2.x SDK or Novell LDAP SDK).

When using mod_auth_basic, this module is invoked via the AuthBasicProvider directive with the ldap value.

See also

  • mod_ldap
  • mod_auth_basic
  • mod_authz_user
  • mod_authz_groupfile

Contents

  • Operation
    • The Authentication Phase
    • The Authorization Phase
  • The Require Directives
    • Require ldap-user
    • Require ldap-group
    • Require ldap-dn
    • Require ldap-attribute
    • Require ldap-filter
  • Examples
  • Using TLS
  • Using SSL
  • Exposing Login Information
  • Using Microsoft FrontPage with mod_authnz_ldap
    • How It Works
    • Caveats

Operation

There are two phases in granting access to a user. The first phase is authentication, in which the mod_authnz_ldap authentication provider verifies that the user's credentials are valid. This is also called the search/bind phase. The second phase is authorization, in which mod_authnz_ldap determines if the authenticated user is allowed access to the resource in question. This is also known as the compare phase.

mod_authnz_ldap registers both an authn_ldap authentication provider and an authz_ldap authorization handler. The authn_ldap authentication provider can be enabled through the AuthBasicProvider directive using the ldap value. The authz_ldap handler extends the Require directive's authorization types by adding ldap-user, ldap-dn and ldap-group values.

The Authentication Phase

During the authentication phase, mod_authnz_ldap searches for an entry in the directory that matches the username that the HTTP client passes. If a single unique match is found, then mod_authnz_ldap attempts to bind to the directory server using the DN of the entry plus the password provided by the HTTP client. Because it does a search, then a bind, it is often referred to as the search/bind phase. Here are the steps taken during the search/bind phase.

  1. Generate a search filter by combining the attribute and filter provided in the AuthLDAPURL directive with the username passed by the HTTP client.
  2. Search the directory using the generated filter. If the search does not return exactly one entry, deny or decline access.
  3. Fetch the distinguished name of the entry retrieved from the search and attempt to bind to the LDAP server using the DN and the password passed by the HTTP client. If the bind is unsuccessful, deny or decline access.

The following directives are used during the search/bind phase

AuthLDAPURL | Specifies the LDAP server, the base DN, the attribute to use in the search, as well as the extra search filter to use.
AuthLDAPBindDN | An optional DN to bind with during the search phase.
AuthLDAPBindPassword | An optional password to bind with during the search phase.

The Authorization Phase

During the authorization phase, mod_authnz_ldap attempts to determine if the user is authorized to access the resource. Many of these checks require mod_authnz_ldap to do a compare operation on the LDAP server. This is why this phase is often referred to as the compare phase. mod_authnz_ldap accepts the following Require directives to determine if the credentials are acceptable:

  • Grant access if there is a Require ldap-user directive, and the username in the directive matches the username passed by the client.
  • Grant access if there is a Require ldap-dn directive, and the DN in the directive matches the DN fetched from the LDAP directory.
  • Grant access if there is a Require ldap-group directive, and the DN fetched from the LDAP directory (or the username passed by the client) occurs in the LDAP group.
  • Grant access if there is a Require ldap-attribute directive, and the attribute fetched from the LDAP directory matches the given value.
  • Grant access if there is a Require ldap-filter directive, and the search filter successfully finds a single user object that matches the dn of the authenticated user.
  • otherwise, deny or decline access

Other Require values may also be used which may require loading additional authorization modules. Note that if you use a Require value from another authorization module, you will need to ensure that AuthzLDAPAuthoritative is set to off to allow the authorization phase to fall back to the module providing the alternate Require value. When no LDAP-specific Require directives are used, authorization is allowed to fall back to other modules as if AuthzLDAPAuthoritative was set to off.

  • Grant access to all successfully authenticated users if there is a Require valid-user directive. (requires mod_authz_user)
  • Grant access if there is a Require group directive, and mod_authz_groupfile has been loaded with the AuthGroupFile directive set.
  • others...

mod_authnz_ldap uses the following directives during the compare phase:

AuthLDAPURL | The attribute specified in the URL is used in compare operations for the Require ldap-user operation.
AuthLDAPCompareDNOnServer | Determines the behavior of the Require ldap-dn directive.
AuthLDAPGroupAttribute | Determines the attribute to use for comparisons in the Require ldap-group directive.
AuthLDAPGroupAttributeIsDN | Specifies whether to use the user DN or the username when doing comparisons for the Require ldap-group directive.

The Require Directives

Apache's Require directives are used during the authorization phase to ensure that a user is allowed to access a resource. mod_authnz_ldap extends the authorization types with ldap-user, ldap-dn, ldap-group, ldap-attribute and ldap-filter. Other authorization types may also be used but may require that additional authorization modules be loaded.

Require ldap-user

The Require ldap-user directive specifies what usernames can access the resource. Once mod_authnz_ldap has retrieved a unique DN from the directory, it does an LDAP compare operation using the username specified in the Require ldap-user to see if that username is part of the just-fetched LDAP entry. Multiple users can be granted access by putting multiple usernames on the line, separated with spaces. If a username has a space in it, then it must be surrounded with double quotes. Multiple users can also be granted access by using multiple Require ldap-user directives, with one user per line. For example, with a AuthLDAPURL of ldap://ldap/o=Airius?cn (i.e., cn is used for searches), the following Require directives could be used to restrict access:

Require ldap-user "Barbara Jenson"
Require ldap-user "Fred User"
Require ldap-user "Joe Manager"

Because of the way that mod_authnz_ldap handles this directive, Barbara Jenson could sign on as Barbara Jenson, Babs Jenson or any other cn that she has in her LDAP entry. Only the single Require ldap-user line is needed to support all values of the attribute in the user's entry.

If the uid attribute was used instead of the cn attribute in the URL above, the above three lines could be condensed to

Require ldap-user bjenson fuser jmanager

Require ldap-group

This directive specifies an LDAP group whose members are allowed access. It takes the distinguished name of the LDAP group. Note: Do not surround the group name with quotes. For example, assume that the following entry existed in the LDAP directory:

dn: cn=Administrators, o=Airius
objectClass: groupOfUniqueNames
uniqueMember: cn=Barbara Jenson, o=Airius
uniqueMember: cn=Fred User, o=Airius

The following directive would grant access to both Fred and Barbara:

Require ldap-group cn=Administrators, o=Airius

Behavior of this directive is modified by the AuthLDAPGroupAttribute and AuthLDAPGroupAttributeIsDN directives.

Require ldap-dn

The Require ldap-dn directive allows the administrator to grant access based on distinguished names. It specifies a DN that must match for access to be granted. If the distinguished name that was retrieved from the directory server matches the distinguished name in the Require ldap-dn, then authorization is granted. Note: do not surround the distinguished name with quotes.

The following directive would grant access to a specific DN:

Require ldap-dn cn=Barbara Jenson, o=Airius

Behavior of this directive is modified by the AuthLDAPCompareDNOnServer directive.

Require ldap-attribute

The Require ldap-attribute directive allows the administrator to grant access based on attributes of the authenticated user in the LDAP directory. If the attribute in the directory matches the value given in the configuration, access is granted.

The following directive would grant access to anyone with the attribute employeeType = active

Require ldap-attribute employeeType=active

Multiple attribute/value pairs can be specified on the same line separated by spaces or they can be specified in multiple Require ldap-attribute directives. The effect of listing multiple attribute/values pairs is an OR operation. Access will be granted if any of the listed attribute values match the value of the corresponding attribute in the user object. If the value of the attribute contains a space, only the value must be within double quotes.

The following directive would grant access to anyone with the city attribute equal to "San Jose" or status equal to "Active"

Require ldap-attribute city="San Jose" status=active

Require ldap-filter

The Require ldap-filter directive allows the administrator to grant access based on a complex LDAP search filter. If the dn returned by the filter search matches the authenticated user dn, access is granted.

The following directive would grant access to anyone having a cell phone and is in the marketing department

Require ldap-filter &(cell=*)(department=marketing)

The difference between the Require ldap-filter directive and the Require ldap-attribute directive is that ldap-filter performs a search operation on the LDAP directory using the specified search filter rather than a simple attribute comparison. If a simple attribute comparison is all that is required, the comparison operation performed by ldap-attribute will be faster than the search operation used by ldap-filter especially within a large directory.

Examples

  • Grant access to anyone who exists in the LDAP directory, using their UID for searches.

    AuthLDAPURL "ldap://ldap1.airius.com:389/ou=People, o=Airius?uid?sub?(objectClass=*)"
    Require valid-user

  • The next example is the same as above; but with the fields that have useful defaults omitted. Also, note the use of a redundant LDAP server.

    AuthLDAPURL "ldap://ldap1.airius.com ldap2.airius.com/ou=People, o=Airius"
    Require valid-user

  • The next example is similar to the previous one, but it uses the common name instead of the UID. Note that this could be problematical if multiple people in the directory share the same cn, because a search on cn must return exactly one entry. That's why this approach is not recommended: it's a better idea to choose an attribute that is guaranteed unique in your directory, such as uid.

    AuthLDAPURL "ldap://ldap.airius.com/ou=People, o=Airius?cn"
    Require valid-user

  • Grant access to anybody in the Administrators group. The users must authenticate using their UID.

    AuthLDAPURL ldap://ldap.airius.com/o=Airius?uid
    Require ldap-group cn=Administrators, o=Airius

  • The next example assumes that everyone at Airius who carries an alphanumeric pager will have an LDAP attribute of qpagePagerID. The example will grant access only to people (authenticated via their UID) who have alphanumeric pagers:

    AuthLDAPURL ldap://ldap.airius.com/o=Airius?uid??(qpagePagerID=*)
    Require valid-user

  • The next example demonstrates the power of using filters to accomplish complicated administrative requirements. Without filters, it would have been necessary to create a new LDAP group and ensure that the group's members remain synchronized with the pager users. This becomes trivial with filters. The goal is to grant access to anyone who has a pager, plus grant access to Joe Manager, who doesn't have a pager, but does need to access the same resource:

    AuthLDAPURL ldap://ldap.airius.com/o=Airius?uid??(|(qpagePagerID=*)(uid=jmanager))
    Require valid-user

    This last may look confusing at first, so it helps to evaluate what the search filter will look like based on who connects, as shown below. If Fred User connects as fuser, the filter would look like

    (&(|(qpagePagerID=*)(uid=jmanager))(uid=fuser))

    The above search will only succeed if fuser has a pager. When Joe Manager connects as jmanager, the filter looks like

    (&(|(qpagePagerID=*)(uid=jmanager))(uid=jmanager))

    The above search will succeed whether jmanager has a pager or not.

Using TLS

To use TLS, see the mod_ldap directives LDAPTrustedClientCert, LDAPTrustedGlobalCert and LDAPTrustedMode.

An optional second parameter can be added to the AuthLDAPURL to override the default connection type set by LDAPTrustedMode. This will allow the connection established by an ldap:// Url to be upgraded to a secure connection on the same port.

Using SSL

To use SSL, see the mod_ldap directives LDAPTrustedClientCert, LDAPTrustedGlobalCert and LDAPTrustedMode.

To specify a secure LDAP server, use ldaps:// in the AuthLDAPURL directive, instead of ldap://.

Exposing Login Information

When this module performs authentication, LDAP attributes specified in the AuthLDAPUrl directive are placed in environment variables with the prefix "AUTHENTICATE_".

If the attribute field contains the username, common name and telephone number of a user, a CGI program will have access to this information without the need to make a second independent LDAP query to gather this additional information.

This has the potential to dramatically simplify the coding and configuration required in some web applications.

Using Microsoft FrontPage with mod_authnz_ldap

Normally, FrontPage uses FrontPage-web-specific user/group files (i.e., the mod_authn_file and mod_authz_groupfile modules) to handle all authentication. Unfortunately, it is not possible to just change to LDAP authentication by adding the proper directives, because it will break the Permissions forms in the FrontPage client, which attempt to modify the standard text-based authorization files.

Once a FrontPage web has been created, adding LDAP authentication to it is a matter of adding the following directives to every .htaccess file that gets created in the web

AuthLDAPURL            "the url"
AuthGroupFile mygroupfile
Require group mygroupfile

How It Works

FrontPage restricts access to a web by adding the Require valid-user directive to the .htaccess files. The Require valid-user directive will succeed for any user who is valid as far as LDAP is concerned. This means that anybody who has an entry in the LDAP directory is considered a valid user, whereas FrontPage considers only those people in the local user file to be valid. By substituting the ldap-group with group file authorization, Apache is allowed to consult the local user file (which is managed by FrontPage) - instead of LDAP - when handling authorizing the user.

Once directives have been added as specified above, FrontPage users will be able to perform all management operations from the FrontPage client.

Caveats

  • When choosing the LDAP URL, the attribute to use for authentication should be something that will also be valid for putting into a mod_authn_file user file. The user ID is ideal for this.
  • When adding users via FrontPage, FrontPage administrators should choose usernames that already exist in the LDAP directory (for obvious reasons). Also, the password that the administrator enters into the form is ignored, since Apache will actually be authenticating against the password in the LDAP database, and not against the password in the local user file. This could cause confusion for web administrators.
  • Apache must be compiled with mod_auth_basic, mod_authn_file and mod_authz_groupfile in order to use FrontPage support. This is because Apache will still use the mod_authz_groupfile group file for determine the extent of a user's access to the FrontPage web.
  • The directives must be put in the .htaccess files. Attempting to put them inside <Location> or <Directory> directives won't work. This is because mod_authnz_ldap has to be able to grab the AuthGroupFile directive that is found in FrontPage .htaccess files so that it knows where to look for the valid user list. If the mod_authnz_ldap directives aren't in the same .htaccess file as the FrontPage directives, then the hack won't work, because mod_authnz_ldap will never get a chance to process the .htaccess file, and won't be able to find the FrontPage-managed user file.

AuthLDAPBindAuthoritative Directive

Description: | Determines if other authentication providers are used when a user can be mapped to a DN but the server cannot successfully bind with the user's credentials.
Syntax: | AuthLDAPBindAuthoritativeoff|on
Default: | AuthLDAPBindAuthoritative on
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap
Compatibility: | Available in versions later than 2.2.14

By default, subsequent authentication providers are only queried if a user cannot be mapped to a DN, but not if the user can be mapped to a DN and their password cannot be verified with an LDAP bind. If AuthLDAPBindAuthoritative is set to off, other configured authentication modules will have a chance to validate the user if the LDAP bind (with the current user's credentials) fails for any reason.

This allows users present in both LDAP and AuthUserFile to authenticate when the LDAP server is available but the user's account is locked or password is otherwise unusable.

See also

  • AuthUserFile
  • AuthBasicProvider

AuthLDAPBindDN Directive

Description: | Optional DN to use in binding to the LDAP server
Syntax: | AuthLDAPBindDN distinguished-name
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

An optional DN used to bind to the server when searching for entries. If not provided, mod_authnz_ldap will use an anonymous bind.

AuthLDAPBindPassword Directive

Description: | Password used in conjuction with the bind DN
Syntax: | AuthLDAPBindPassword password
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap
Compatibility: | exec: was added in 2.2.25.

A bind password to use in conjunction with the bind DN. Note that the bind password is probably sensitive data, and should be properly protected. You should only use the AuthLDAPBindDN and AuthLDAPBindPassword if you absolutely need them to search the directory.

If the value begins with exec: the resulting command will be executed and the first line returned to standard output by the program will be used as the password.

#Password used as-is
AuthLDAPBindPassword secret

#Run /path/to/program to get my password
AuthLDAPBindPassword exec:/path/to/program

#Run /path/to/otherProgram and provide arguments
AuthLDAPBindPassword "exec:/path/to/otherProgram argument1"

AuthLDAPCharsetConfig Directive

Description: | Language to charset conversion configuration file
Syntax: | AuthLDAPCharsetConfig file-path
Context: | server config
Status: | Extension
Module: | mod_authnz_ldap

The AuthLDAPCharsetConfig directive sets the location of the language to charset conversion configuration file. File-path is relative to the ServerRoot. This file specifies the list of language extensions to character sets. Most administrators use the provided charset.conv file, which associates common language extensions to character sets.

The file contains lines in the following format:

Language-Extension charset [Language-String] ...

The case of the extension does not matter. Blank lines, and lines beginning with a hash character (#) are ignored.

AuthLDAPCompareDNOnServer Directive

Description: | Use the LDAP server to compare the DNs
Syntax: | AuthLDAPCompareDNOnServer on|off
Default: | AuthLDAPCompareDNOnServer on
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

When set, mod_authnz_ldap will use the LDAP server to compare the DNs. This is the only foolproof way to compare DNs. mod_authnz_ldap will search the directory for the DN specified with the Require dn directive, then, retrieve the DN and compare it with the DN retrieved from the user entry. If this directive is not set, mod_authnz_ldap simply does a string comparison. It is possible to get false negatives with this approach, but it is much faster. Note the mod_ldap cache can speed up DN comparison in most situations.

AuthLDAPDereferenceAliases Directive

Description: | When will the module de-reference aliases
Syntax: | AuthLDAPDereferenceAliases never|searching|finding|always
Default: | AuthLDAPDereferenceAliases Always
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

This directive specifies when mod_authnz_ldap will de-reference aliases during LDAP operations. The default is always.

AuthLDAPGroupAttribute Directive

Description: | LDAP attributes used to check for group membership
Syntax: | AuthLDAPGroupAttribute attribute
Default: | AuthLDAPGroupAttribute member uniquemember
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

This directive specifies which LDAP attributes are used to check for group membership. Multiple attributes can be used by specifying this directive multiple times. If not specified, then mod_authnz_ldap uses the member and uniquemember attributes.

AuthLDAPGroupAttributeIsDN Directive

Description: | Use the DN of the client username when checking for group membership
Syntax: | AuthLDAPGroupAttributeIsDN on|off
Default: | AuthLDAPGroupAttributeIsDN on
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

When set on, this directive says to use the distinguished name of the client username when checking for group membership. Otherwise, the username will be used. For example, assume that the client sent the username bjenson, which corresponds to the LDAP DN cn=Babs Jenson, o=Airius. If this directive is set, mod_authnz_ldap will check if the group has cn=Babs Jenson, o=Airius as a member. If this directive is not set, then mod_authnz_ldap will check if the group has bjenson as a member.

AuthLDAPRemoteUserAttribute Directive

Description: | Use the value of the attribute returned during the user query to set the REMOTE_USER environment variable
Syntax: | AuthLDAPRemoteUserAttribute uid
Default: | none
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

If this directive is set, the value of the REMOTE_USER environment variable will be set to the value of the attribute specified. Make sure that this attribute is included in the list of attributes in the AuthLDAPUrl definition, otherwise this directive will have no effect. This directive, if present, takes precedence over AuthLDAPRemoteUserIsDN. This directive is useful should you want people to log into a website using an email address, but a backend application expects the username as a userid.

AuthLDAPRemoteUserIsDN Directive

Description: | Use the DN of the client username to set the REMOTE_USER environment variable
Syntax: | AuthLDAPRemoteUserIsDN on|off
Default: | AuthLDAPRemoteUserIsDN off
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

If this directive is set to on, the value of the REMOTE_USER environment variable will be set to the full distinguished name of the authenticated user, rather than just the username that was passed by the client. It is turned off by default.

AuthLDAPUrl Directive

Description: | URL specifying the LDAP search parameters
Syntax: | AuthLDAPUrl url [NONE|SSL|TLS|STARTTLS]
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

An RFC 2255 URL which specifies the LDAP search parameters to use. The syntax of the URL is

ldap://host:port/basedn?attribute?scope?filter

ldap
For regular ldap, use the string ldap. For secure LDAP, use ldaps instead. Secure LDAP is only available if Apache was linked to an LDAP library with SSL support.
host:port

The name/port of the ldap server (defaults to localhost:389 for ldap, and localhost:636 for ldaps). To specify multiple, redundant LDAP servers, just list all servers, separated by spaces. mod_authnz_ldap will try connecting to each server in turn, until it makes a successful connection.

Once a connection has been made to a server, that connection remains active for the life of the httpd process, or until the LDAP server goes down.

If the LDAP server goes down and breaks an existing connection, mod_authnz_ldap will attempt to re-connect, starting with the primary server, and trying each redundant server in turn. Note that this is different than a true round-robin search.

basedn
The DN of the branch of the directory where all searches should start from. At the very least, this must be the top of your directory tree, but could also specify a subtree in the directory.
attribute
The attribute to search for. Although RFC 2255 allows a comma-separated list of attributes, only the first attribute will be used, no matter how many are provided. If no attributes are provided, the default is to use uid. It's a good idea to choose an attribute that will be unique across all entries in the subtree you will be using.
scope
The scope of the search. Can be either one or sub. Note that a scope of base is also supported by RFC 2255, but is not supported by this module. If the scope is not provided, or if base scope is specified, the default is to use a scope of sub.
filter
A valid LDAP search filter. If not provided, defaults to (objectClass=*), which will search for all objects in the tree. Filters are limited to approximately 8000 characters (the definition of MAX_STRING_LEN in the Apache source code). This should be more than sufficient for any application.

When doing searches, the attribute, filter and username passed by the HTTP client are combined to create a search filter that looks like (&(filter)(attribute=username)).

For example, consider an URL of ldap://ldap.airius.com/o=Airius?cn?sub?(posixid=*). When a client attempts to connect using a username of Babs Jenson, the resulting search filter will be (&(posixid=*)(cn=Babs Jenson)).

An optional parameter can be added to allow the LDAP Url to override the connection type. This parameter can be one of the following:

NONE
Establish an unsecure connection on the default LDAP port. This is the same as ldap:// on port 389.
SSL
Establish a secure connection on the default secure LDAP port. This is the same as ldaps://
TLS | STARTTLS
Establish an upgraded secure connection on the default LDAP port. This connection will be initiated on port 389 by default and then upgraded to a secure connection on the same port.

See above for examples of AuthLDAPURL URLs.

When AuthLDAPURL is enabled in a particular context, but some other module has performed authentication for the request, the server will try to map the username to a DN during authorization regardless of whether or not LDAP-specific requirements are present. To ignore the failures to map a username to a DN during authorization, set AuthzLDAPAuthoritative to "off".

AuthzLDAPAuthoritative Directive

Description: | Prevent other authentication modules from authenticating the user if this one fails
Syntax: | AuthzLDAPAuthoritative on|off
Default: | AuthzLDAPAuthoritative on
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authnz_ldap

Set to off if this module should let other authorization modules attempt to authorize the user, should authorization with this module fail. Control is only passed on to lower modules if there is no DN or rule that matches the supplied user name (as passed by the client).

When no LDAP-specific Require directives are used, authorization is allowed to fall back to other modules as if AuthzLDAPAuthoritative was set to off.


mod_authz_dbm - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authz_dbm

Description: | Group authorization using DBM files
Status: | Extension
Module Identifier: | authz_dbm_module
Source File: | mod_authz_dbm.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module provides authorization capabilities so that authenticated users can be allowed or denied access to portions of the web site by group membership. Similar functionality is provided by mod_authz_groupfile.

See also

  • Require
  • Satisfy

AuthDBMGroupFile Directive

Description: | Sets the name of the database file containing the list of user groups for authorization
Syntax: | AuthDBMGroupFile file-path
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authz_dbm

The AuthDBMGroupFile directive sets the name of a DBM file containing the list of user groups for user authorization. File-path is the absolute path to the group file.

The group file is keyed on the username. The value for a user is a comma-separated list of the groups to which the users belongs. There must be no whitespace within the value, and it must never contain any colons.

Security

Make sure that the AuthDBMGroupFile is stored outside the document tree of the web-server. Do not put it in the directory that it protects. Otherwise, clients will be able to download the AuthDBMGroupFile unless otherwise protected.

Combining Group and Password DBM files: In some cases it is easier to manage a single database which contains both the password and group details for each user. This simplifies any support programs that need to be written: they now only have to deal with writing to and locking a single DBM file. This can be accomplished by first setting the group and password files to point to the same DBM:

AuthDBMGroupFile /www/userbase
AuthDBMUserFile /www/userbase

The key for the single DBM is the username. The value consists of

Encrypted Password : List of Groups [ : (ignored) ]

The password section contains the encrypted password as before. This is followed by a colon and the comma separated list of groups. Other data may optionally be left in the DBM file after another colon; it is ignored by the authorization module. This is what www.telescope.org uses for its combined password and group database.

AuthzDBMAuthoritative Directive

Description: | Sets whether authorization will be passed on to lower level modules
Syntax: | AuthzDBMAuthoritative On|Off
Default: | AuthzDBMAuthoritative On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authz_dbm

Setting the AuthzDBMAuthoritative directive explicitly to Off allows group authorization to be passed on to lower level modules (as defined in the modules.c file) if there is no group found for the supplied userID. If there are any groups specified, the usual checks will be applied and a failure will give an Authentication Required reply.

So if a userID appears in the database of more than one module; or if a valid Require directive applies to more than one module; then the first module will verify the credentials; and no access is passed on; regardless of the AuthAuthoritative setting.

A common use for this is in conjunction with one of the auth providers; such as mod_authn_dbm or mod_authn_file. Whereas this DBM module supplies the bulk of the user credential checking; a few (administrator) related accesses fall through to a lower level with a well protected .htpasswd file.

By default, control is not passed on and an unknown group will result in an Authentication Required reply. Not setting it thus keeps the system secure and forces an NCSA compliant behaviour.

Security

Do consider the implications of allowing a user to allow fall-through in his .htaccess file; and verify that this is really what you want; Generally it is easier to just secure a single .htpasswd file, than it is to secure a database which might have more access interfaces.

AuthzDBMType Directive

Description: | Sets the type of database file that is used to store list of user groups
Syntax: | AuthzDBMType default|SDBM|GDBM|NDBM|DB
Default: | AuthzDBMType default
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authz_dbm

Sets the type of database file that is used to store the list of user groups. The default database type is determined at compile time. The availability of other types of database files also depends on compile-time settings.

It is crucial that whatever program you use to create your group files is configured to use the same type of database.


mod_authz_default - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authz_default

Description: | Authorization fallback module
Status: | Base
Module Identifier: | authz_default_module
Source File: | mod_authz_default.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module is designed to be the fallback module, if you don't have configured an authorization module like mod_authz_user or mod_authz_groupfile. It simply rejects any authorization request.

AuthzDefaultAuthoritative Directive

Description: | Sets whether authorization is passed to lower level modules
Syntax: | AuthzDefaultAuthoritative On|Off
Default: | AuthzDefaultAuthoritative On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Base
Module: | mod_authz_default

Setting the AuthzDefaultAuthoritative directive explicitly to Off allows for authorization to be passed on to lower level modules (as defined in the modules.c files).

Note

Normally there are no lower level modules, since mod_authz_default is defined to be already on a very low level. Therefore you should leave the value of AuthzDefaultAuthoritative as default (On).


mod_authz_groupfile - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authz_groupfile

Description: | Group authorization using plaintext files
Status: | Base
Module Identifier: | authz_groupfile_module
Source File: | mod_authz_groupfile.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module provides authorization capabilities so that authenticated users can be allowed or denied access to portions of the web site by group membership. Similar functionality is provided by mod_authz_dbm.

See also

  • Require
  • Satisfy

AuthGroupFile Directive

Description: | Sets the name of a text file containing the list of user groups for authorization
Syntax: | AuthGroupFile file-path
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Base
Module: | mod_authz_groupfile

The AuthGroupFile directive sets the name of a textual file containing the list of user groups for user authorization. File-path is the path to the group file. If it is not absolute, it is treated as relative to the ServerRoot.

Each line of the group file contains a groupname followed by a colon, followed by the member usernames separated by spaces.

Example:

mygroup: bob joe anne

Note that searching large text files is very inefficient; AuthDBMGroupFile provides a much better performance.

Security

Make sure that the AuthGroupFile is stored outside the document tree of the web-server; do not put it in the directory that it protects. Otherwise, clients may be able to download the AuthGroupFile.

AuthzGroupFileAuthoritative Directive

Description: | Sets whether authorization will be passed on to lower level modules
Syntax: | AuthzGroupFileAuthoritative On|Off
Default: | AuthzGroupFileAuthoritative On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Base
Module: | mod_authz_groupfile

Setting the AuthzGroupFileAuthoritative directive explicitly to Off allows for group authorization to be passed on to lower level modules (as defined in the modules.c files) if there is no group matching the supplied userID.

By default, control is not passed on and an unknown group will result in an Authentication Required reply. Not setting it thus keeps the system secure and forces an NCSA compliant behaviour.

Security

Do consider the implications of allowing a user to allow fall-through in his .htaccess file; and verify that this is really what you want; Generally it is easier to just secure a single .htpasswd file, than it is to secure a database which might have more access interfaces.


mod_authz_host - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authz_host

Description: | Group authorizations based on host (name or IP address)
Status: | Base
Module Identifier: | authz_host_module
Source File: | mod_authz_host.c
Compatibility: | Available in Apache 2.1 and later

Summary

The directives provided by mod_authz_host are used in <Directory>, <Files>, and <Location> sections as well as .htaccess files to control access to particular parts of the server. Access can be controlled based on the client hostname, IP address, or other characteristics of the client request, as captured in environment variables. The Allow and Deny directives are used to specify which clients are or are not allowed access to the server, while the Order directive sets the default access state, and configures how the Allow and Deny directives interact with each other.

Both host-based access restrictions and password-based authentication may be implemented simultaneously. In that case, the Satisfy directive is used to determine how the two sets of restrictions interact.

In general, access restriction directives apply to all access methods (GET, PUT, POST, etc). This is the desired behavior in most cases. However, it is possible to restrict some methods, while leaving other methods unrestricted, by enclosing the directives in a <Limit> section.

See also

  • Satisfy
  • Require

Allow Directive

Description: | Controls which hosts can access an area of the server
Syntax: | Allow from all|host|env=[!]env-variable [host|env=[!]env-variable] ...
Context: | directory, .htaccess
Override: | Limit
Status: | Base
Module: | mod_authz_host
Compatibility: | Support for negating env=env-variable was added in 2.2.10

The Allow directive affects which hosts can access an area of the server. Access can be controlled by hostname, IP address, IP address range, or by other characteristics of the client request captured in environment variables.

The first argument to this directive is always from. The subsequent arguments can take three different forms. If Allow from all is specified, then all hosts are allowed access, subject to the configuration of the Deny and Order directives as discussed below. To allow only particular hosts or groups of hosts to access the server, the host can be specified in any of the following formats:

A (partial) domain-name

Example:

Allow from apache.org
Allow from .net example.edu

Hosts whose names match, or end in, this string are allowed access. Only complete components are matched, so the above example will match foo.apache.org but it will not match fooapache.org. This configuration will cause Apache to perform a double reverse DNS lookup on the client IP address, regardless of the setting of the HostnameLookups directive. It will do a reverse DNS lookup on the IP address to find the associated hostname, and then do a forward lookup on the hostname to assure that it matches the original IP address. Only if the forward and reverse DNS are consistent and the hostname matches will access be allowed.

A full IP address

Example:

Allow from 10.1.2.3
Allow from 192.168.1.104 192.168.1.205

An IP address of a host allowed access

A partial IP address

Example:

Allow from 10.1
Allow from 10 172.20 192.168.2

The first 1 to 3 bytes of an IP address, for subnet restriction.

A network/netmask pair

Example:

Allow from 10.1.0.0/255.255.0.0

A network a.b.c.d, and a netmask w.x.y.z. For more fine-grained subnet restriction.

A network/nnn CIDR specification

Example:

Allow from 10.1.0.0/16

Similar to the previous case, except the netmask consists of nnn high-order 1 bits.

Note that the last three examples above match exactly the same set of hosts.

IPv6 addresses and IPv6 subnets can be specified as shown below:

Allow from 2001:db8::a00:20ff:fea7:ccea
Allow from 2001:db8::a00:20ff:fea7:ccea/10

The third format of the arguments to the Allow directive allows access to the server to be controlled based on the existence of an environment variable. When Allow from env=env-variable is specified, then the request is allowed access if the environment variable env-variable exists. When Allow from env=!env-variable is specified, then the request is allowed access if the environment variable env-variable doesn't exist. The server provides the ability to set environment variables in a flexible way based on characteristics of the client request using the directives provided by mod_setenvif. Therefore, this directive can be used to allow access based on such factors as the clients User-Agent (browser type), Referer, or other HTTP request header fields.

Example:

SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in
<Directory /docroot>
Order Deny,Allow
Deny from all
Allow from env=let_me_in
 </Directory>

In this case, browsers with a user-agent string beginning with KnockKnock/2.0 will be allowed access, and all others will be denied.

Deny Directive

Description: | Controls which hosts are denied access to the server
Syntax: | Deny from all|host|env=[!]env-variable [host|env=[!]env-variable] ...
Context: | directory, .htaccess
Override: | Limit
Status: | Base
Module: | mod_authz_host

This directive allows access to the server to be restricted based on hostname, IP address, or environment variables. The arguments for the Deny directive are identical to the arguments for the Allow directive.

Order Directive

Description: | Controls the default access state and the order in which Allow and Deny are evaluated.
Syntax: | Order ordering
Default: | Order Deny,Allow
Context: | directory, .htaccess
Override: | Limit
Status: | Base
Module: | mod_authz_host

The Order directive, along with the Allow and Deny directives, controls a three-pass access control system. The first pass processes either all Allow or all Deny directives, as specified by the Order directive. The second pass parses the rest of the directives (Deny or Allow). The third pass applies to all requests which do not match either of the first two.

Note that all Allow and Deny directives are processed, unlike a typical firewall, where only the first match is used. The last match is effective (also unlike a typical firewall). Additionally, the order in which lines appear in the configuration files is not significant -- all Allow lines are processed as one group, all Deny lines are considered as another, and the default state is considered by itself.

Ordering is one of:

Allow,Deny
First, all Allow directives are evaluated; at least one must match, or the request is rejected. Next, all Deny directives are evaluated. If any matches, the request is rejected. Last, any requests which do not match an Allow or a Deny directive are denied by default.
Deny,Allow
First, all Deny directives are evaluated; if any match, the request is denied unless it also matches an Allow directive. Any requests which do not match any Allow or Deny directives are permitted.
Mutual-failure
This order has the same effect as Order Allow,Deny and is deprecated in its favor.

Keywords may only be separated by a comma; no whitespace is allowed between them.

Match | Allow,Deny result | Deny,Allow result
Match Allow only | Request allowed | Request allowed
Match Deny only | Request denied | Request denied
No match | Default to second directive: Denied | Default to second directive: Allowed
Match both Allow & Deny | Final match controls: Denied | Final match controls: Allowed

In the following example, all hosts in the apache.org domain are allowed access; all other hosts are denied access.

Order Deny,Allow
Deny from all
Allow from apache.org

In the next example, all hosts in the apache.org domain are allowed access, except for the hosts which are in the foo.apache.org subdomain, who are denied access. All hosts not in the apache.org domain are denied access because the default state is to Deny access to the server.

Order Allow,Deny
Allow from apache.org
Deny from foo.apache.org

On the other hand, if the Order in the last example is changed to Deny,Allow, all hosts will be allowed access. This happens because, regardless of the actual ordering of the directives in the configuration file, the Allow from apache.org will be evaluated last and will override the Deny from foo.apache.org. All hosts not in the apache.org domain will also be allowed access because the default state is Allow.

The presence of an Order directive can affect access to a part of the server even in the absence of accompanying Allow and Deny directives because of its effect on the default access state. For example,

<Directory /www>
Order Allow,Deny
 </Directory>

will Deny all access to the /www directory because the default access state is set to Deny.

The Order directive controls the order of access directive processing only within each phase of the server's configuration processing. This implies, for example, that an Allow or Deny directive occurring in a <Location> section will always be evaluated after an Allow or Deny directive occurring in a <Directory> section or .htaccess file, regardless of the setting of the Order directive. For details on the merging of configuration sections, see the documentation on How Directory, Location and Files sections work.


mod_authz_owner - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authz_owner

Description: | Authorization based on file ownership
Status: | Extension
Module Identifier: | authz_owner_module
Source File: | mod_authz_owner.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module authorizes access to files by comparing the userid used for HTTP authentication (the web userid) with the file-system owner or group of the requested file. The supplied username and password must be already properly verified by an authentication module, such as mod_auth_basic or mod_auth_digest. mod_authz_owner recognizes two arguments for the Require directive, file-owner and file-group, as follows:

file-owner
The supplied web-username must match the system's name for the owner of the file being requested. That is, if the operating system says the requested file is owned by jones, then the username used to access it through the web must be jones as well.
file-group
The name of the system group that owns the file must be present in a group database, which is provided, for example, by mod_authz_groupfile or mod_authz_dbm, and the web-username must be a member of that group. For example, if the operating system says the requested file is owned by (system) group accounts, the group accounts must appear in the group database and the web-username used in the request must be a member of that group.

Note

If mod_authz_owner is used in order to authorize a resource that is not actually present in the filesystem (i.e. a virtual resource), it will deny the access.

Particularly it will never authorize content negotiated "MultiViews" resources.

See also

  • Require
  • Satisfy

Configuration Examples

Require file-owner

Consider a multi-user system running the Apache Web server, with each user having his or her own files in ~/public_html/private. Assuming that there is a single AuthDBMUserFile database that lists all of their web-usernames, and that these usernames match the system's usernames that actually own the files on the server, then the following stanza would allow only the user himself access to his own files. User jones would not be allowed to access files in /home/smith/public_html/private unless they were owned by jones instead of smith.

<Directory /home/*/public_html/private>
AuthType Basic
AuthName MyPrivateFiles
AuthBasicProvider dbm
AuthDBMUserFile /usr/local/apache2/etc/.htdbm-all
Satisfy All
Require file-owner
 </Directory>

Require file-group

Consider a system similar to the one described above, but with some users that share their project files in ~/public_html/project-foo. The files are owned by the system group foo and there is a single AuthDBMGroupFile database that contains all of the web-usernames and their group membership, i.e. they must be at least member of a group named foo. So if jones and smith are both member of the group foo, then both will be authorized to access the project-foo directories of each other.

<Directory /home/*/public_html/project-foo>
AuthType Basic
AuthName "Project Foo Files"
AuthBasicProvider dbm

# combined user/group database
AuthDBMUserFile /usr/local/apache2/etc/.htdbm-all
AuthDBMGroupFile /usr/local/apache2/etc/.htdbm-all

Satisfy All
Require file-group
 </Directory>

AuthzOwnerAuthoritative Directive

Description: | Sets whether authorization will be passed on to lower level modules
Syntax: | AuthzOwnerAuthoritative On|Off
Default: | AuthzOwnerAuthoritative On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_authz_owner

Setting the AuthzOwnerAuthoritative directive explicitly to Off allows for user authorization to be passed on to lower level modules (as defined in the modules.c files) if:

  • in the case of file-owner the file-system owner does not match the supplied web-username or could not be determined, or
  • in the case of file-group the file-system group does not contain the supplied web-username or could not be determined.

Note that setting the value to Off also allows the combination of file-owner and file-group, so access will be allowed if either one or the other (or both) match.

By default, control is not passed on and an authorization failure will result in an "Authentication Required" reply. Not setting it to Off thus keeps the system secure and forces an NCSA compliant behaviour.


mod_authz_user - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_authz_user

Description: | User Authorization
Status: | Base
Module Identifier: | authz_user_module
Source File: | mod_authz_user.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module provides authorization capabilities so that authenticated users can be allowed or denied access to portions of the web site. mod_authz_user grants access if the authenticated user is listed in a Require user directive. Alternatively Require valid-user can be used to grant access to all successfully authenticated users.

See also

  • Require
  • Satisfy

AuthzUserAuthoritative Directive

Description: | Sets whether authorization will be passed on to lower level modules
Syntax: | AuthzUserAuthoritative On|Off
Default: | AuthzUserAuthoritative On
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Base
Module: | mod_authz_user

Setting the AuthzUserAuthoritative directive explicitly to Off allows for user authorization to be passed on to lower level modules (as defined in the modules.c files) if there is no user matching the supplied userID.

By default, control is not passed on and an unknown user will result in an Authentication Required reply. Not setting it to Off thus keeps the system secure and forces an NCSA compliant behaviour.


mod_autoindex - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_autoindex

Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.
Açıklama: | Unix ls veya Win32 dir kabuk komutunun yaptığı gibi dizin içeriğini listeler.
Durum: | Temel
Modül Betimleyici: | autoindex_module
Kaynak Dosyası: | mod_autoindex.c

Özet

Bir dizin içerik dosyası iki kaynaktan gelebilir:

  • Kullanıcı tarafından yazılmış ve genellikle index.html adında bir dosya olarak. Dosyanın ismi DirectoryIndex yönergesi ile belirlenir ve mod_dir tarafından denetlenir.
  • Kullanıcı tarafından böyle bir dosya sağlanmadığı takdirde dizin içerik listesini sunucu üretir. Diğer yönergeler bu listenin biçemini belirler. Listede gösterilen dosya türü simgeleri AddIcon, AddIconByEncoding ve AddIconByType yönergeleri ile belirlenir. Bunlar mod_autoindex tarafından denetlenir.

İki işlev birbirinden ayrı tutulmuştur, böylece kendiliğinden içerik listesi üretimi tamamen iptal edilebilir (veya değiştirilebilir).

Kendiliğinden içerik listesi üretimi Options +Indexes ile etkin kılınabilir. Daha fazla bilgi için Options yönergesinin açıklamasına bakınız.

IndexOptions yönergesi FancyIndexing seçeneği ile kullanılmışsa sütun başlıkları listenin sıralamasını sütundaki sıralamaya göre değiştirecek hiper bağlar haline getirilir (süslü liste). Aynı başlığa peşpeşe tıklamak suretiyle sıralamayı büyükten küçüğe veya tersine değiştirebilirsiniz. Bu sütun başlığı bağlarının oluşturulması IndexOptions yönergesi SuppressColumnSorting seçeneği ile kullanılarak engellenebilir.

Boyuta göre sıralamada daima dosyanın asıl boyutuna bakılır. Dolayısıyla ikisi de "1K" olarak gösterilen iki dosyadan 1010 baytlık olanı küçükten büyüğe sıralamada 1011 baytlıktan önce gösterilecektir.

Sütun Sıralamada Sorgu Seçenekleri

Apache 2.0.23’te Sütun Sıralama için Sorgu Seçenekleri yeniden düzenlenip tamamen yeni bir sorgu seçenekleri grubu oluşturulmuştur. Çıktı üzerinde kullanıcı denetimini tamamen ortadan kaldırmak için IndexOptions yönergesinin IgnoreClient seçeneği kullanılabilir.

Sütun sıralama başlıklarının her biri hedefi kendisi olan birer hiper bağ olup aşağıda sıralanan sorgu seçeneklerini kullanırlar. Bu seçeneklerin her biri her dizin içerik listesi isteğine eklenebilir.

  • C=N dizini dosya adına göre sıralar
  • C=M dizini son değişiklik zamanına ve ardından dosya ismine göre sıralar.
  • C=S dizini boyuta ve ardından dosya adına göre sıralar
  • C=D dizini açıklamaya ve ardından dosya adına göre sıralar.
  • O=A artan sıralama uygulanır.
  • O=D azalan sıralama uygulanır.
  • F=0 listeleme basit listeleme biçiminde yapılır (FancyIndexing seçeneği ile etkinleştirilen biçimde değil)
  • F=1 listeleme FancyIndexing seçeneği ile etkinleştirilen biçimde yapılır
  • F=2 listeleme FancyIndexing ve HTMLTable seçeneği ile etkinleştirilen biçimde yapılır.
  • V=0 sürüme göre sıralama iptal edilir.
  • V=1 sürüme göre sıralama etkin kılınır.
  • P=kalıp sadece belirtilen kalıp ile eşleşen dosyalar istelenir.

P=kalıp sorgu seçeneğinin normalde IndexIgnore yönergesi işleme sokulduktan sonra değerlendirildiğine ve dosya isimlerinin diğer kendiliğinden içerik listeleme koşullarının konusu olmaya devam ettiğine dikkat ediniz. mod_autoindex modülündeki Sorgu Seçenekleri çözümleyicisi tanımadığı bir seçeneğe rastlar rastlamaz işlemi durdurur. Sorgu Seçenekleri yukarıda belirtilene uygun olarak iyi biçimli olmak zorundadır.

Aşağıdaki basit örnekte sorgu seçeneklerinin kullanımı gösterilmiştir. Son satırda bulunan "submit" düğmesindeki tanınmayan "X" girdisine dikkat ediniz. "X=Göster" girdisi tüm seçenekler işlendikten sonra mod_autoindex tarafından son argüman olarak ele alınacak ve çözümleme işlemi o noktada duracaktır.

<form action="" method="get">
  <input type="text" name="P" value="*" /> ile eşleşen
  <select name="C">
    <option value="N" selected="selected">isme</option>
    <option value="M"> değişiklik tarihine</option>
    <option value="S"> boyuta</option>
    <option value="D"> açıklamaya</option>
  </select> göre
  <select name="O">
    <option value="A" selected="selected"> artan</option>
    <option value="D"> azalan</option>
  </select>
  <select name="V">
    <option value="0" selected="selected">normal</option>
    <option value="1"> sürümlü</option>
  </select> sıralamayla bir
  <select name="F">
    <option value="0"> basit liste</option>
    <option value="1" selected="selected"> süslü liste</option>
    <option value="2"> tablolu liste</option>
  </select>
  <input type="submit" name="X" value="Göster" />
</form>

AddAlt Yönergesi

Açıklama: | Dosyaya göre seçilen simgenin yerinde gösterilecek metni belirler.
Sözdizimi: | AddAlt metin dosya [dosya] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

AddAlt yönergesi, FancyIndexing seçeneğiyle üretilen dizin listesinde bir dosya simgesinin yerinde gösterilecek metni belirler. dosya olarak dosya türünü betimleyecek bir dosya uzantısı, dosya isminin bir kısmı, bir dosya ismi kalıbı veya tam yoluyla bir dosya ismi belirtilebilir. Eğer metin boşluk karakterleri içeriyorsa tırnak içine (" veya ') alınmalıdır. Simge metni, simge bulunamadığı veya istemci resim gösteremediği takdirde ya da kullanıcı resim yüklememeyi tercih etmişse gösterilir.

Örnekler

AddAlt "PDF dosya" *.pdf
AddAlt Sıkıştırılmış *.gz *.zip *.Z

AddAltByEncoding Yönergesi

Açıklama: | Dosyanın MIME kodlamasına göre seçilen simgenin yerinde gösterilecek metni belirler.
Sözdizimi: | AddAltByEncoding metin MIME-kodlaması [MIME-kodlaması] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

AddAltByEncoding yönergesi, FancyIndexing seçeneğiyle üretilen dizin listesinde bir dosya simgesinin yerinde gösterilecek metni belirler. MIME-kodlaması olarak x-compress gibi geçerli bir içerik kodlaması belirtilmelidir. Eğer metin boşluk karakterleri içeriyorsa tırnak içine (" veya ') alınmalıdır. Simge metni simge bulunamadığı veya istemci resim gösteremediği takdirde ya da kullanıcı resim yüklememeyi tercih etmişse gösterilir.

Örnek

AddAltByEncoding gzip x-gzip

AddAltByType Yönergesi

Açıklama: | Dosyanın MIME türüne göre seçilen simgenin yerinde gösterilecek metni belirler.
Sözdizimi: | AddAltByType metin MIME-türü [MIME-türü] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

AddAltByType yönergesi, FancyIndexing seçeneğiyle üretilen dizin listesinde bir dosya simgesinin yerinde gösterilecek metni belirler. MIME-türü olarak text/html gibi geçerli bir içerik türü belirtilmelidir. Eğer metin boşluk karakterleri içeriyorsa tırnak içine (" veya ') alınmalıdır. Simge metni simge bulunamadığı veya istemci resim gösteremediği takdirde ya da kullanıcı resim yüklememeyi tercih etmişse gösterilir.

Örnek

AddAltByType 'salt metin' text/plain

AddDescription Yönergesi

Açıklama: | Bir dosya için gösterilecek açıklama belirtilir.
Sözdizimi: | AddDescription metin dosya [dosya] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

Yönerge, FancyIndexing seçeneğiyle üretilen dizin listesinde bir dosya için gösterilecek açıklamayı belirler. dosya olarak dosya türünü betimleyecek bir dosya uzantısı, dosya isminin bir kısmı, bir dosya ismi kalıbı veya tam yoluyla bir dosya ismi belirtilebilir. Eğer dosya açıklamasını içeren metin boşluk karakterleri içeriyorsa çift tırnak (") içine alınmalıdır.

Örnek

AddDescription "Mars Gezegeni" mars.gif
AddDescription "Maraşlı dostum" dostlar/mars.gif

Normalde öntanımlı açıklama alanının genişliği 23 bayttır. IndexOptions SuppressIcon seçeneği buna 6 bayt daha ekler; IndexOptions SuppressSize seçeneği 7 bayt, IndexOptions SuppressLastModified seçeneği ise 19 bayt ekler. Böylece en fazla 55 karakterlik öntanımlı sütun genişliğine ulaşılabilir.

Açıklama sütununun öntanımlı genişliği geçersiz kılınabilir hatta sınırsız açıklama uzunluğu atanabilir. Bu konu için IndexOptions yönergesinin DescriptionWidth seçeneğinin açıklamasına bakınız.

Önemli

AddDescription ile tanımlanan açıklama metni HTML etiketleri ve karakter öğeleri içerebilir. Eğer açıklama sütununun genişlik sınırlamasından dolayı bir HTML etiketinin içeriği kırpılırsa bu durum dizin listesinin kalanını etkileyebilir (örneğin, kalın gösterim listenin kalanına yayılabilir).

Yol bilgisi içeren argümanlar

Mutlak yollar şu an desteklenmemektedir ve çalışma anında hiçbir şeyle eşleşmezler. Normalde sadece htaccess bağlamında kullanılan, göreli yol bilgisi içeren argümanların önüne, kısmen de olsa dizin isimleriyle eşleşmemeleri için örtük olarak '*/' dizgesi eklenir.

AddIcon Yönergesi

Açıklama: | Bir dosya için gösterilecek simgeyi dosya adına göre belirler.
Sözdizimi: | AddIcon simge isim [isim] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

Yönerge, FancyIndexing seçeneğiyle üretilen dizin listesinde adı isim ile biten bir dosya için gösterilecek simgeyi belirler. simge ya simgenin göreli URL’si (% öncelemeli), tam nitelenmiş uzak bir URL ya da (alt-metin,url) biçeminde olmalıdır; buradaki alt-metin simge gösterilemediği durumda tarayıcı tarafından simgenin yerinde gösterilecek metindir.

isim olarak ya (listeyi düzgün biçemlemek amacıyla) dizinler için ^^DIRECTORY^^, boş satırlar için ^^BLANKICON^^ ya da dosya türünü betimleyecek bir dosya uzantısı, dosya isminin bir kısmı, bir dosya ismi kalıbı veya tam yoluyla bir dosya ismi belirtilebilir.

^^BLANKICON^^ sadece biçimleme için kullanılır, dolayısıyla IndexOptions HTMLTable kullanıyorsanız gereksizdir.

Örnekler

AddIcon (IMG,/icons/image.xbm) .gif .jpg .xbm
AddIcon /icons/dir.xbm ^^DIRECTORY^^
AddIcon /icons/backup.xbm *~

Mümkünse AddIcon yerine AddIconByType yönergesi tercih edilmelidir.

AddIconByEncoding Yönergesi

Açıklama: | Bir dosya için gösterilecek simgeyi dosyanın MIME kodlamasına göre belirler.
Sözdizimi: | AddIconByEncoding simge MIME-kodlaması [MIME-kodlaması] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

Yönerge, FancyIndexing seçeneğiyle üretilen dizin listesinde bir dosya için gösterilecek simgeyi belirler. simge ya simgenin göreli URL’si (% öncelemeli), tam nitelenmiş uzak bir URL ya da (alt-metin,url) biçeminde olmalıdır; buradaki alt-metin simge gösterilemediği durumda tarayıcı tarafından simgenin yerinde gösterilecek metindir.

MIME-kodlaması olarak x-compress gibi geçerli bir içerik kodlaması belirtilmelidir.

Örnek

AddIconByEncoding /icons/compress.xbm x-compress

AddIconByType Yönergesi

Açıklama: | Bir dosya için gösterilecek simgeyi dosyanın MIME türüne göre belirler.
Sözdizimi: | AddIconByType simge MIME-türü [MIME-türü] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

Yönerge, FancyIndexing seçeneğiyle üretilen dizin listesinde MIME türü MIME-türü olarak belirtilen bir dosya için gösterilecek simgeyi belirler. simge ya simgenin göreli URL’si (% öncelemeli), tam nitelenmiş uzak bir URL ya da (alt-metin,url) biçeminde olmalıdır; buradaki alt-metin simge gösterilemediği durumda tarayıcı tarafından simgenin yerinde gösterilecek metindir.

MIME-türü MIME türleri ile eşleşen bir dosya kalıbı ifadesi olabilir.

Örnek

AddIconByType (IMG,/icons/image.xbm) image/*

DefaultIcon Yönergesi

Açıklama: | Özel bir simge atanmamış dosyalar için gösterilecek simgeyi belirler.
Sözdizimi: | DefaultIcon URL-yolu
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

The DefaultIcon yönergesi FancyIndexing seçeneğiyle üretilen dizin listesinde özel bir simge atanmamış dosyalar için gösterilecek simgeyi belirler. URL-yolu simgeye bir göreli URL (% öncelemeli) veya tam nitelenmiş uzak bir URL belirtir.

Örnek

DefaultIcon /icon/unknown.xbm

HeaderName Yönergesi

Açıklama: | Dizin listesinin tepesine yerleştirilecek dosyanın ismini belirler.
Sözdizimi: | HeaderName dosya-ismi
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

HeaderName yönergesi, dizin listesinin tepesine yerleştirilecek dosyanın ismini belirler. Dosyanın ismi dosya-ismi ile belirtilir.

Örnek

HeaderName HEADER.html

HeaderName and ReadmeName yönergelerinde dosya-ismi artık içeriği listelenecek dizine erişmek için kullanılan bir göreli URL yolu olarak ele alınmaktadır. Eğer dosya-ismi bir bölü çizgisi ("/") ile başlıyorsa DocumentRoot yönergesinde belirtilen dizine göre belirtildiği varsayılır.

Örnek

HeaderName /include/HEADER.html

dosya-ismi, içerik türü text/* (text/html, text/plain gibi) olan bir belge olarak çözümlenmelidir. Yani, aşağıdaki örnekteki gibi betiğin asıl dosya türü text/html olarak imlenmişse dosya-ismi bir CGI betiğinin ismi bile olabilir:

AddType text/html .cgi

Options ile MultiViews etkin kılınmışsa dosyaya içerik dili uzlaşımı da uygulanabilir. dosya-ismi ile belirtilen dosya text/html türünde durağan bir belge (bir CGI betiği değil) ise ve options ile Includes ve IncludesNOEXEC seçeneklerinden biri belirtilmişse dosya bir SSI sayfası olarak ele alınır (mod_include belgesine bakınız).

Eğer yönergede belirtilen dosya bir HTML belge gibi başlıyorsa (<html>, <head>, vs.) ve bu etiketlerin yinelenmemesini istiyorsanız IndexOptions +SuppressHTMLPreamble ataması yapmanız gerekecektir.

IndexHeadInsert Yönergesi

Açıklama: | Bir dizin sayfasının HEAD bölümüne metin yerleştirir.
Sözdizimi: | IndexHeadInsert "imlenim ..."
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex
Uyumluluk: | Apache 2.2.11 ve sonrasında kullanılabilmektedir.

IndexHeadInsert yönergesi, dizin listesi için üretilen HTML’nin <head> bölümüne yerleştirilecek bir dizge tanımlar.

Example

IndexHeadInsert "<link rel=\"sitemap\" href=\"/sitemap.html\">"

IndexIgnore Yönergesi

Açıklama: | Dizin içerik listesinden gizlenecek dosyaların listesi belirtilir.
Sözdizimi: | IndexIgnore dosya [dosya] ...
Öntanımlı: | IndexIgnore "."
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

IndexIgnore yönergesi, dizin içerik listesinden gizlenecek dosyaların listesini belirtmek için kullanılır. dosya olarak kabuk tarzı bir dosya ismi kalıbı veya tam yoluyla bir dosya ismi belirtilebilir. Evvelce yapılmış bir atamada değişiklik yapmak yerine birden fazla IndexIgnore ataması yapabilirsiniz. Liste öntanımlı olarak içinde bulunulan dizini (./) içerir.

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

Düzenli İfadeler

Bu yönerge, <DirectoryMatch> gibi düzenli ifade bileşenlerine sahip yapılandırma bölümlerinde şu an çalışmamaktadır.

IndexOptions Yönergesi

Açıklama: | Dizin içerik listesini yapılandıracak seçenekler belirtilir.
Sözdizimi: | IndexOptions [+|-]seçenek [[+|-]seçenek] ...
Öntanımlı: | Öntanımlı olarak hiçbir seçenek etkin değildir.
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

IndexOptions yönergesi dizin içerik listesinin davranışını belirler. seçenek olarak şunlar belirtilebilir:

Charset=karakter-kümesi (Apache 2.0.61 ve sonrası)
Charset seçeneği üretilen sayfa için bir karakter kümesi belirtebilmenizi sağlar. Dizinin bulunduğu dosya sisteminin karakter kodlamasına bağlı olarak öntanımlı değeri ya ISO-8859-1 ya da UTF-8’dir.

Örnek

IndexOptions Charset=UTF-8

Type=MIME-türü (Apache 2.0.61 ve sonrası)
Type seçeneği üretilen sayfa için bir MIME türü belirtebilmenizi sağlar. Öntanımlı değer text/html’dir.

Örnek

IndexOptions Type=text/plain

DescriptionWidth=[n | *] (Apache 2.0.23 ve sonrası)

DescriptionWidth seçeneği üretilen sayfada açıklama sütununun genişliğini sizin belirleyebilmenizi sağlar. Bu seçenek kullanılmadığında veya -DescriptionWidth olarak belirtildiğinde uygun genişliği mod_autoindex hesaplar.

DescriptionWidth=n ile açıklama sütununun genişliği n baytla sınırlanır.

DescriptionWidth=* ile açıklama sütununun genişliği en uzun açıklama metni sığacak şekilde arttırılır.

Sütun genişliğinin sabitliği nedeniyle metnin kırpılmasından kaynaklanan sorunlar için AddDescription yönergesinin açıklamasına bakınız.

FancyIndexing
Dizin içerik listesi süslü olur.
FoldersFirst (Apache 2.0.23 ve sonrası)
Bu seçenek etkin kılındığında dizin içerik listesinde alt dizinler dosyalardan önce listelenir. Listelemede genel olarak iki bileşen vardır: Alt dizinler ve dosyalar. Her biri kendi arasında sıraya dizilir ve alt dizinlerin tamamı dosyalardan önce gösterilir. Örneğin sıralama isme göre azalan sırada yapılıyorsa ve FoldersFirst etkinse Zed dizini listede Beta dizininden ve Gamma ve Alpha dosyalarından önce yer alacaktır. Bu seçenek sadece FancyIndexing seçeneği etkinse etkili olacaktır.
HTMLTable (Apache 2.0.23 ve sonrası)
Bu deneysel seçenek FancyIndexing seçeneği ile birlikte süslü listeleme için basit bir tablo oluşturur. UTF-8'in etkin kılndığı platformlarda veya Linux, WinNT gibi sağdan sola veya soldan sağa yazım yönünün UTF-8 karakter koduna göre değiştiği platformlarda dosya isimleri ve açıklamalar için bu seçenek gereklidir.
IconsAreLinks
Bu seçenek FancyIndexing seçeneği ile birlikte süslü listelemede dosya simgesini dosyaya bir hiper bağ haline getirir.
IconHeight[=benek-sayısı]
Bu seçeneğin varlığı IconWidth seçeneği ile kullanıldığında dosya simgesinin img etiketinin height ve width özniteliklerini içermesine sebep olur. Böylece tarayıcının tüm simgelerin yüklenmesini beklemeden sayfa yerleşimi için bir ön hesaplama yapabilmesi mümkün olur. Seçenek bir değer belirtilmeksizin kullanıldığında Apache tarafından atanmış standart simge yüksekliği öntanımlıdır.
IconWidth[=benek-sayısı]
Bu seçeneğin varlığı IconHeight seçeneği ile kullanıldığında dosya simgesinin img etiketinin height ve width özniteliklerini içermesine sebep olur. Böylece tarayıcının tüm simgelerin yüklenmesini beklemeden sayfa yerleşimi için bir ön hesaplama yapabilmesi mümkün olur. Seçenek bir değer belirtilmeksizin kullanıldığında Apache tarafından atanmış standart simge genişliği öntanımlıdır.
IgnoreCase
Bu seçenek etkin kılındığında isimler harf büyüklüğüne duyarsız sıralanır. Örneğin, isme göre artan sıralamada IgnoreCase etkinse Zeta dosyası alfa dosyasından sonra listelenir (Dikkat: GAMMA daima gamma’dan önce listelenir.)
IgnoreClient
Bu seçenek mod_autoindex’in listenin sıralanmasına etki edenler dahil tüm sorgu değişkenlerini yoksaymasına sebep olur (örtük olarak SuppressColumnSorting uygulanır).
NameWidth=[n | *]

NameWidth seçeneği dosya ismi sütunu için bir genişlik belirtebilmenizi mümkün kılar.

Hiç belirtilmediğinde veya -NameWidth biçeminde belirtildiğinde mod_autoindex uygun genişliği kendisi hesaplayacaktır.

NameWidth=n ile sütun genişliği n bayt genişlikte sabitlenir.

NameWidth=* olduğunda ise sütun genişliği en geniş satırın sığacağı kadar arttırılır.

ScanHTMLTitles
Bu seçenek süslü listeleme için HTML belgelerden sayfa başlığının okunmasını sağlar. Dosya için AddDescription ile bir açıklama tanımlanmımışsa httpd belgenin title etiketinin içeriğini okuyacaktır. Bu seçenek işlemciyi ve diski fazla meşgul eder.
ShowForbidden
Alt istek HTTP_UNAUTHORIZED veya HTTP_FORBIDDEN döndürdüğünden dolayı normalde gizli olan dosyalar bu seçenek belirtilmişse listede gösterilir.
SuppressColumnSorting
Bu seçenek belirtilmişse Apache, süslü dizin listesinde sütun başlıklarını sıralama için hiper bağ haline getirmeyecektir. Sütun başlıkları için öntanımlı davranış hiper bağ olmak olup bunlar seçilerek dizin listesinin o sütundaki değerlere göre sıralanması sağlanır. Apache 2.0.23 öncesinde, bu seçenek ayrıca, sıralama dizgesi için sorgu sözcüklerinin çözümlenmesini de iptal ederdi. Bu davranış Apache 2.0.23’ten beri IndexOptions IgnoreClient ile sağlanmaktadır.
SuppressDescription
Süslü listelemede dosya açıklamalarının gösterilmesini engeller. Öntanımlı olarak hiçbir dosya açıklaması tanımlı değildir, dolayısıyla bu seçenek kullanılarak ekran genişliğinden 23 karakterlik yer kazanılabilir. Dosya açıklamalarının nasıl belirlendiğini öğrenmek için AddDescription yönergesinin açıklamasına bakınız. Ayrıca, açıklama sütununun genişliğini ayarlayan DescriptionWidth dizin listeleme seçeneğine de bakınız.
SuppressHTMLPreamble
Eğer dizin aslında HeaderName yönergesi ile belirtilmiş bir dosya içeriyorsa modül normal olarak bu dosyanın içeriğinin öncesine HTML başlangıç etiketlerini (<html>, <head>, vs.) yerleştirir. Bu seçenek bu davranışı iptal ederek modülün dosya içeriğinin başlangıcına bir şey eklememesini sağlar. Bu durumda başlık dosyasının uygun HTML etiketlerini içermesi gerekir. Böyle bir başlık dosyası yoksa normal olarak HTML başlangıç etiketleri üretilir.
SuppressIcon (Apache 2.0.23 ve sonrası)
Süslü dizin listesinde dosya simgelerinin gösterilmesini engeller. Son belirtim, süslü dizin listelemede kullanılan pre etiketinin içeriğinde img ve hr etiketlerinin bulunmasına izin vermediğinden SuppressIcon ve SuppressRules seçenekleri birlikte kullanılarak HTML 3.2 belirtimine uyum sağlanır.
SuppressLastModified
Süslü dizin listelemede son değişiklik tarihinin gösterilmesi engellenir.
SuppressRules (Apache 2.0.23 ve sonrası)
Dizin listelemede hr etiketinin kullanımını engeller. Son belirtim, süslü dizin listelemede kullanılan pre etiketinin içeriğinde img ve hr etiketlerinin bulunmasına izin vermediğinden SuppressIcon ve SuppressRules seçenekleri birlikte kullanılarak HTML 3.2 belirtimine uyum sağlanır.
SuppressSize
Süslü dizin listelemede dosya boyutunun gösterilmesi engellenir.
TrackModified (Apache 2.0.23 ve sonrası)
Bu seçenek listelenen dizin için HTTP başlığında Last-Modified ve ETag alanlarının dönmesini sağlar. Sadece işletim sistemi veya dosya sistemi uygun stat() sonuçlarını döndürüyorsa bu geçerlidir. Bazı Unix sistemleri, OS2’nin JFS’si ve Win32’nin NTFS’i böyledir. Ancak OS2 ve Win32 FAT dosya sistemleri böyle değildir. Bu özellik etkin kılındığında istemci veya vekil HEAD istekleriyle dosya listesindeki değişiklikleri izleyebilirler. Yalnız, bazı işletim sistemlerinin yeni ve silinmiş dosyaların izini iyi sürdüğü halde dizin içindeki dosyaların boyut ve tarih değişikliklerini izlemediklerine dikkat ediniz. Mevcut bir dosyanın boyut ve zaman damgasındaki değişiklikler Last-Modified başlığının güncellenmesini tüm Unix sistemlerinde sağlamaz. Bu gibi durumlarda bu seçeneğin kapalı kalması daha iyidir.
VersionSort (Apache 2.0a3 ve sonrası)
VersionSort seçeneği isimlerinde sürüm numarası bulunan dosyaların sayısal sıralamaya uygun olarak sıralanmalarını sağlar. Normalde sıralama karakter sıralamasına göre yapılır, ardından sürüm numaralı dosyalar veya açıklamalar kendi aralarında sayısal sıralamaya tabi tutulur.

Örnek:

foo-1.7
foo-1.7.2
foo-1.7.12
foo-1.8.2
foo-1.8.2a
foo-1.12

Sıfır ile başlalan numaralara ondalık sayı muamelesi yapılır:

foo-1.001
foo-1.002
foo-1.030
foo-1.04

XHTML (Apache 2.0.49 ve sonrası)
XHTML seçeneği mod_autoindex’in kodu HTML 3.2’ye değil XHTML 1.0’a uygun üretmesini sağlar.
+ veya - Önekli Seçenekler

Apache 1.3.3’te IndexOptions yönergelerinin ele alınışıyla ilgili önemil değişiklikler yapılmıştır. Bunlar:

  • Tek bir dizin için çok sayıda IndexOptions yönergesi belirtilmişse bunlar ayrı ayrı değil birlikte ele alınır. Yani,

    <Directory /foo> IndexOptions HTMLTable
    IndexOptions SuppressColumnsorting     </Directory>

    yapılandırmasındaki IndexOptions yönergeleri

    IndexOptions HTMLTable SuppressColumnsorting

    yönergesine eşdeğerdir.

  • Seçeneklerde + veya - önekleri kullanılabilmektedir.

+ veya - önekli seçeneklere rastlandığında bunlar mevcut (üst dizinden miras alınanlar ve/veya önceki atamalar) IndexOptions yönergelerine uygulanır. Ancak, önek kullanılmamış bir seçeneğe raslandığında, o noktada önceki ve miras alınmış bu tür seçenekler iptal edilir. Şu örneği ele alalım:

IndexOptions +ScanHTMLTitles -IconsAreLinks FancyIndexing
IndexOptions +SuppressSize

Bunun net etkisi IndexOptions FancyIndexing +SuppressSize atamasına eşdeğerdir, çünkü öneksiz FancyIndexing seçeneği kendinden önceki önekli seçenekleri iptal etmiş fakat hemen ardından eklenmelerine izin vermiştir.

Belli bir dizine önceki seçenekleri temizleyerek koşulsuz olarak tamamen yeni seçenekler atamak istiyorsanız IndexOptions yönergesinde seçenekleri + veya - öneklerini kullanmadan belirtiniz.

IndexOrderDefault Yönergesi

Açıklama: | Dizin içerik listesinin öntanımlı sıralamasını belirler.
Sözdizimi: | IndexOrderDefault Ascending|Descending Name|Date|Size|Description
Öntanımlı: | IndexOrderDefault Ascending Name
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

IndexOrderDefault yönergesi FancyIndexing seçeneğinin etkin olduğu durumda işe yarar. Öntanımlı olarak süslü listelemede dizin içeriği dosya ismine göre artan sıralamayla listelenir. IndexOrderDefault yönergesi bu öntanımlı sıralamanın değiştirilmesini mümkün kılar.

IndexOrderDefault yönergesi iki değer alır. İlki sıralama yönünü belirtmek üzere Ascending (küçükten büyüğe) veya Descending (büyükten küçüğe) olmak zorundadır. İkinci değer ise birincil sıralama anahtarını belirtmek üzere Name, Date, Size ve Description sözcüklerinden biri olmalıdır (anlamları sırayla: İsim, Tarih, Boyut, Açıklama). İkincil sıralama anahtarı daima artan sıralamayla dosya ismidir.

İsterseniz, bir istemcinin listeyi yeniden sıralamasını engelleyebilirsiniz. Dizin listesinin belli bir sırada gösterilmesini zorunlu kılmak için yönergeyi SuppressColumnSorting sıralama seçeneği ile birlikte belirtebilirsiniz; buna ek olarak, istemcinin sorgu dizgesine sıralama seçenekleri ekleyerek sıralama tercihlerinizi değiştirmesini engellemek için IgnoreClient seçeneğini de belirtebir, böylece istemcinin farklı sıralamalara sahip içerik isteğini engellemiş olursunuz.

IndexStyleSheet Yönergesi

Açıklama: | Dizin listesine bir biçembent ekler.
Sözdizimi: | IndexStyleSheet url-yolu
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

IndexStyleSheet yönergesi dizin listelemesi için kullanılacak biçembent dosyasının ismini belirtmek için kullanılır.

Örnek

IndexStyleSheet "/css/style.css"

ReadmeName Yönergesi

Açıklama: | Dizin listesinin sonuna yerleştirilecek dosyanın ismini belirler.
Sözdizimi: | ReadmeName dosya-ismi
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_autoindex

ReadmeName yönergesi dizin listesinin sonuna eklenecek dosyanın ismini belirler. dosya-ismi ile listeye dahil edilecek dosyanın ismi listelenen dizine göreli olarak belirtilir. Eğer dosya ismi bir bölü çizgisi ile başlıyorsa DocumentRoot’a göreli belirtildiği varsayılır.

1. Örnek

ReadmeName FOOTER.html

2. Örnek

ReadmeName /include/FOOTER.html

Ayrıca bu davranışın daha ayrıntılı ele alındığı HeaderName yönergesine de bakınız.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_cache - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_cache

Description: | Content cache keyed to URIs.
Status: | Extension
Module Identifier: | cache_module
Source File: | mod_cache.c

Summary

This module should be used with care and can be used to circumvent Allow and Deny directives. You should not enable caching for any content to which you wish to limit access by client host name, address or environment variable.

mod_cache implements an RFC 2616 compliant HTTP content cache that can be used to cache either local or proxied content. mod_cache requires the services of one or more storage management modules. Two storage management modules are included in the base Apache distribution:

mod_disk_cache
implements a disk based storage manager.
mod_mem_cache
implements a memory based storage manager. mod_mem_cache can be configured to operate in two modes: caching open file descriptors or caching objects in heap storage. mod_mem_cache can be used to cache locally generated content or to cache backend server content for mod_proxy when configured using ProxyPass (aka reverse proxy)

Content is stored in and retrieved from the cache using URI based keys. Content with access protection is not cached.

Further details, discussion, and examples, are provided in the Caching Guide.

See also

  • Caching Guide

Related Modules and Directives

Related Modules Related Directives
  • mod_disk_cache
  • mod_mem_cache
  • CacheRoot
  • CacheDirLevels
  • CacheDirLength
  • CacheMinFileSize
  • CacheMaxFileSize
  • MCacheSize
  • MCacheMaxObjectCount
  • MCacheMinObjectSize
  • MCacheMaxObjectSize
  • MCacheRemovalAlgorithm
  • MCacheMaxStreamingBuffer

Sample Configuration

Sample httpd.conf

#
# Sample Cache Configuration
#
LoadModule cache_module modules/mod_cache.so

<IfModule mod_cache.c>
#LoadModule disk_cache_module modules/mod_disk_cache.so
# If you want to use mod_disk_cache instead of mod_mem_cache,
# uncomment the line above and comment out the LoadModule line below.
<IfModule mod_disk_cache.c>
CacheRoot c:/cacheroot
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3
 </IfModule>

LoadModule mem_cache_module modules/mod_mem_cache.so
<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
 </IfModule>

# When acting as a proxy, don't cache the list of security updates
CacheDisable http://security.update.server/update-list/
 </IfModule>

Avoiding the Thundering Herd

When a cached entry becomes stale, mod_cache will submit a conditional request to the backend, which is expected to confirm whether the cached entry is still fresh, and send an updated entity if not.

A small but finite amount of time exists between the time the cached entity becomes stale, and the time the stale entity is fully refreshed. On a busy server, a significant number of requests might arrive during this time, and cause a thundering herd of requests to strike the backend suddenly and unpredictably.

To keep the thundering herd at bay, the CacheLock directive can be used to define a directory in which locks are created for URLs in flight. The lock is used as a hint by other requests to either suppress an attempt to cache (someone else has gone to fetch the entity), or to indicate that a stale entry is being refreshed (stale content will be returned in the mean time).

Initial caching of an entry

When an entity is cached for the first time, a lock will be created for the entity until the response has been fully cached. During the lifetime of the lock, the cache will suppress the second and subsequent attempt to cache the same entity. While this doesn't hold back the thundering herd, it does stop the cache attempting to cache the same entity multiple times simultaneously.

Refreshment of a stale entry

When an entity reaches its freshness lifetime and becomes stale, a lock will be created for the entity until the response has either been confirmed as still fresh, or replaced by the backend. During the lifetime of the lock, the second and subsequent incoming request will cause stale data to be returned, and the thundering herd is kept at bay.

Locks and Cache-Control: no-cache

Locks are used as a hint only to enable the cache to be more gentle on backend servers, however the lock can be overridden if necessary. If the client sends a request with a Cache-Control header forcing a reload, any lock that may be present will be ignored, and the client's request will be honoured immediately and the cached entry refreshed.

As a further safety mechanism, locks have a configurable maximum age. Once this age has been reached, the lock is removed, and a new request is given the opportunity to create a new lock. This maximum age can be set using the CacheLockMaxAge directive, and defaults to 5 seconds.

Example configuration

Enabling the cache lock

#
# Enable the cache lock
#
<IfModule mod_cache.c>
CacheLock on
CacheLockPath /tmp/mod_cache-lock
CacheLockMaxAge 5
 </IfModule>

CacheDefaultExpire Directive

Description: | The default duration to cache a document when no expiry date is specified.
Syntax: | CacheDefaultExpire seconds
Default: | CacheDefaultExpire 3600 (one hour)
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

The CacheDefaultExpire directive specifies a default time, in seconds, to cache a document if neither an expiry date nor last-modified date are provided with the document. The value specified with the CacheMaxExpire directive does not override this setting.

CacheDefaultExpire 86400

CacheDisable Directive

Description: | Disable caching of specified URLs
Syntax: | CacheDisable url-string
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

The CacheDisable directive instructs mod_cache to not cache urls at or below url-string.

Example

CacheDisable /local_files

The no-cache environment variable can be set to disable caching on a finer grained set of resources in versions 2.2.12 and later.

See also

  • Environment Variables in Apache

CacheEnable Directive

Description: | Enable caching of specified URLs using a specified storage manager
Syntax: | CacheEnable cache_type url-string
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

The CacheEnable directive instructs mod_cache to cache urls at or below url-string. The cache storage manager is specified with the cache_type argument. cache_type mem instructs mod_cache to use the memory based storage manager implemented by mod_mem_cache. cache_type disk instructs mod_cache to use the disk based storage manager implemented by mod_disk_cache. cache_type fd instructs mod_cache to use the file descriptor cache implemented by mod_mem_cache.

In the event that the URL space overlaps between different CacheEnable directives (as in the example below), each possible storage manager will be run until the first one that actually processes the request. The order in which the storage managers are run is determined by the order of the CacheEnable directives in the configuration file.

CacheEnable mem /manual
CacheEnable fd /images
CacheEnable disk /

When acting as a forward proxy server, url-string can also be used to specify remote sites and proxy protocols which caching should be enabled for.

# Cache proxied url's
CacheEnable disk /

# Cache FTP-proxied url's
CacheEnable disk ftp://

# Cache content from www.apache.org
CacheEnable disk http://www.apache.org/

The no-cache environment variable can be set to disable caching on a finer grained set of resources in versions 2.2.12 and later.

See also

  • Environment Variables in Apache

CacheIgnoreCacheControl Directive

Description: | Ignore request to not serve cached content to client
Syntax: | CacheIgnoreCacheControl On|Off
Default: | CacheIgnoreCacheControl Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

Ordinarily, requests containing a Cache-Control: no-cache or Pragma: no-cache header value will not be served from the cache. The CacheIgnoreCacheControl directive allows this behavior to be overridden. CacheIgnoreCacheControl On tells the server to attempt to serve the resource from the cache even if the request contains no-cache header values. Resources requiring authorization will never be cached.

CacheIgnoreCacheControl On

Warning:

This directive will allow serving from the cache even if the client has requested that the document not be served from the cache. This might result in stale content being served.

See also

  • CacheStorePrivate
  • CacheStoreNoStore

CacheIgnoreHeaders Directive

Description: | Do not store the given HTTP header(s) in the cache.
Syntax: | CacheIgnoreHeaders header-string [header-string] ...
Default: | CacheIgnoreHeaders None
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

According to RFC 2616, hop-by-hop HTTP headers are not stored in the cache. The following HTTP headers are hop-by-hop headers and thus do not get stored in the cache in any case regardless of the setting of CacheIgnoreHeaders:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailers
  • Transfer-Encoding
  • Upgrade

CacheIgnoreHeaders specifies additional HTTP headers that should not to be stored in the cache. For example, it makes sense in some cases to prevent cookies from being stored in the cache.

CacheIgnoreHeaders takes a space separated list of HTTP headers that should not be stored in the cache. If only hop-by-hop headers not should be stored in the cache (the RFC 2616 compliant behaviour), CacheIgnoreHeaders can be set to None.

Example 1

CacheIgnoreHeaders Set-Cookie

Example 2

CacheIgnoreHeaders None

Warning:

If headers like Expires which are needed for proper cache management are not stored due to a CacheIgnoreHeaders setting, the behaviour of mod_cache is undefined.

CacheIgnoreNoLastMod Directive

Description: | Ignore the fact that a response has no Last Modified header.
Syntax: | CacheIgnoreNoLastMod On|Off
Default: | CacheIgnoreNoLastMod Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

Ordinarily, documents without a last-modified date are not cached. Under some circumstances the last-modified date is removed (during mod_include processing for example) or not provided at all. The CacheIgnoreNoLastMod directive provides a way to specify that documents without last-modified dates should be considered for caching, even without a last-modified date. If neither a last-modified date nor an expiry date are provided with the document then the value specified by the CacheDefaultExpire directive will be used to generate an expiration date.

CacheIgnoreNoLastMod On

CacheIgnoreQueryString Directive

Description: | Ignore query string when caching
Syntax: | CacheIgnoreQueryString On|Off
Default: | CacheIgnoreQueryString Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache
Compatibility: | Available in Apache 2.2.6 and later

Ordinarily, requests with query string parameters are cached separately for each unique query string. This is according to RFC 2616/13.9 done only if an expiration time is specified. The CacheIgnoreQueryString directive tells the cache to cache requests even if no expiration time is specified, and to reply with a cached reply even if the query string differs. From a caching point of view the request is treated as if having no query string when this directive is enabled.

CacheIgnoreQueryString On

CacheIgnoreURLSessionIdentifiers Directive

Description: | Ignore defined session identifiers encoded in the URL when caching
Syntax: | CacheIgnoreURLSessionIdentifiers identifier [identifier] ...
Default: | CacheIgnoreURLSessionIdentifiers None
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

Sometimes applications encode the session identifier into the URL like in the following Examples:

  • /someapplication/image.gif;jsessionid=123456789
  • /someapplication/image.gif?PHPSESSIONID=12345678

This causes cachable resources to be stored separately for each session, which is often not desired. CacheIgnoreURLSessionIdentifiers lets define a list of identifiers that are removed from the key that is used to identify an entity in the cache, such that cachable resources are not stored separately for each session.

CacheIgnoreURLSessionIdentifiers None clears the list of ignored identifiers. Otherwise, each identifier is added to the list.

Example 1

CacheIgnoreURLSessionIdentifiers jsessionid

Example 2

CacheIgnoreURLSessionIdentifiers None

CacheLastModifiedFactor Directive

Description: | The factor used to compute an expiry date based on the LastModified date.
Syntax: | CacheLastModifiedFactor float
Default: | CacheLastModifiedFactor 0.1
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

In the event that a document does not provide an expiry date but does provide a last-modified date, an expiry date can be calculated based on the time since the document was last modified. The CacheLastModifiedFactor directive specifies a factor to be used in the generation of this expiry date according to the following formula: expiry-period = time-since-last-modified-date * factor expiry-date = current-date + expiry-period For example, if the document was last modified 10 hours ago, and factor is 0.1 then the expiry-period will be set to 10*0.1 = 1 hour. If the current time was 3:00pm then the computed expiry-date would be 3:00pm + 1hour = 4:00pm. If the expiry-period would be longer than that set by CacheMaxExpire, then the latter takes precedence.

CacheLastModifiedFactor 0.5

CacheLock Directive

Description: | Enable the thundering herd lock.
Syntax: | CacheLock on|off
Default: | CacheLock off
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache
Compatibility: | Available in Apache 2.2.15 and later

The CacheLock directive enables the thundering herd lock for the given URL space.

In a minimal configuration the following directive is all that is needed to enable the thundering herd lock in the default system temp directory.

# Enable chache lock
CacheLock on

CacheLockMaxAge Directive

Description: | Set the maximum possible age of a cache lock.
Syntax: | CacheLockMaxAge integer
Default: | CacheLockMaxAge 5
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

The CacheLockMaxAge directive specifies the maximum age of any cache lock.

A lock older than this value in seconds will be ignored, and the next incoming request will be given the opportunity to re-establish the lock. This mechanism prevents a slow client taking an excessively long time to refresh an entity.

CacheLockPath Directive

Description: | Set the lock path directory.
Syntax: | CacheLockPath directory
Default: | CacheLockPath /tmp/mod_cache-lock
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

The CacheLockPath directive allows you to specify the directory in which the locks are created. By default, the system's temporary folder is used. Locks consist of empty files that only exist for stale URLs in flight, so is significantly less resource intensive than the traditional disk cache.

CacheMaxExpire Directive

Description: | The maximum time in seconds to cache a document
Syntax: | CacheMaxExpire seconds
Default: | CacheMaxExpire 86400 (one day)
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

The CacheMaxExpire directive specifies the maximum number of seconds for which cachable HTTP documents will be retained without checking the origin server. Thus, documents will be out of date at most this number of seconds. This maximum value is enforced even if an expiry date was supplied with the document.

CacheMaxExpire 604800

CacheStoreNoStore Directive

Description: | Attempt to cache requests or responses that have been marked as no-store.
Syntax: | CacheStoreNoStore On|Off
Default: | CacheStoreNoStore Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

Ordinarily, requests or responses with Cache-Control: no-store header values will not be stored in the cache. The CacheStoreNoStore directive allows this behavior to be overridden. CacheStoreNoStore On tells the server to attempt to cache the resource even if it contains no-store header values. Resources requiring authorization will never be cached.

CacheStoreNoStore On

Warning:

As described in RFC 2616, the no-store directive is intended to "prevent the inadvertent release or retention of sensitive information (for example, on backup tapes)." Enabling this option could store sensitive information in the cache. You are hereby warned.

See also

  • CacheIgnoreCacheControl
  • CacheStorePrivate

CacheStorePrivate Directive

Description: | Attempt to cache responses that the server has marked as private
Syntax: | CacheStorePrivate On|Off
Default: | CacheStorePrivate Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_cache

Ordinarily, responses with Cache-Control: private header values will not be stored in the cache. The CacheStorePrivate directive allows this behavior to be overridden. CacheStorePrivate On tells the server to attempt to cache the resource even if it contains private header values. Resources requiring authorization will never be cached.

CacheStorePrivate On

Warning:

This directive will allow caching even if the upstream server has requested that the resource not be cached. This directive is only ideal for a 'private' cache.

See also

  • CacheIgnoreCacheControl
  • CacheStoreNoStore


mod_cern_meta - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_cern_meta

Description: | CERN httpd metafile semantics
Status: | Extension
Module Identifier: | cern_meta_module
Source File: | mod_cern_meta.c

Summary

Emulate the CERN HTTPD Meta file semantics. Meta files are HTTP headers that can be output in addition to the normal range of headers for each file accessed. They appear rather like the Apache .asis files, and are able to provide a crude way of influencing the Expires: header, as well as providing other curiosities. There are many ways to manage meta information, this one was chosen because there is already a large number of CERN users who can exploit this module.

More information on the CERN metafile semantics is available.

See also

  • mod_headers
  • mod_asis

MetaDir Directive

Description: | Name of the directory to find CERN-style meta information files
Syntax: | MetaDir directory
Default: | MetaDir .web
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Extension
Module: | mod_cern_meta

Specifies the name of the directory in which Apache can find meta information files. The directory is usually a 'hidden' subdirectory of the directory that contains the file being accessed. Set to "." to look in the same directory as the file:

MetaDir .

Or, to set it to a subdirectory of the directory containing the files:

MetaDir .meta

MetaFiles Directive

Description: | Activates CERN meta-file processing
Syntax: | MetaFiles on|off
Default: | MetaFiles off
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Extension
Module: | mod_cern_meta

Turns on/off Meta file processing on a per-directory basis.

MetaSuffix Directive

Description: | File name suffix for the file containg CERN-style meta information
Syntax: | MetaSuffix suffix
Default: | MetaSuffix .meta
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Extension
Module: | mod_cern_meta

Specifies the file name suffix for the file containing the meta information. For example, the default values for the two directives will cause a request to DOCUMENT_ROOT/somedir/index.html to look in DOCUMENT_ROOT/somedir/.web/index.html.meta and will use its contents to generate additional MIME header information.

Example:

MetaSuffix .meta

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_cgi - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_cgi

Description: | Execution of CGI scripts
Status: | Base
Module Identifier: | cgi_module
Source File: | mod_cgi.c

Summary

Any file that has the handler cgi-script will be treated as a CGI script, and run by the server, with its output being returned to the client. Files acquire this handler either by having a name containing an extension defined by the AddHandler directive, or by being in a ScriptAlias directory.

For an introduction to using CGI scripts with Apache, see our tutorial on Dynamic Content With CGI.

When using a multi-threaded MPM under unix, the module mod_cgid should be used in place of this module. At the user level, the two modules are essentially identical.

For backward-compatibility, the cgi-script handler will also be activated for any file with the mime-type application/x-httpd-cgi. The use of the magic mime-type is deprecated.

See also

  • AcceptPathInfo
  • Options
  • ScriptAlias
  • AddHandler
  • Running CGI programs under different user IDs
  • CGI Specification

CGI Environment variables

The server will set the CGI environment variables as described in the CGI specification, with the following provisions:

PATH_INFO
This will not be available if the AcceptPathInfo directive is explicitly set to off. The default behavior, if AcceptPathInfo is not given, is that mod_cgi will accept path info (trailing /more/path/info following the script filename in the URI), while the core server will return a 404 NOT FOUND error for requests with additional path info. Omitting the AcceptPathInfo directive has the same effect as setting it On for mod_cgi requests.
REMOTE_HOST
This will only be set if HostnameLookups is set to on (it is off by default), and if a reverse DNS lookup of the accessing host's address indeed finds a host name.
REMOTE_IDENT
This will only be set if IdentityCheck is set to on and the accessing host supports the ident protocol. Note that the contents of this variable cannot be relied upon because it can easily be faked, and if there is a proxy between the client and the server, it is usually totally useless.
REMOTE_USER
This will only be set if the CGI script is subject to authentication.

CGI Debugging

Debugging CGI scripts has traditionally been difficult, mainly because it has not been possible to study the output (standard output and error) for scripts which are failing to run properly. These directives, included in Apache 1.2 and later, provide more detailed logging of errors when they occur.

CGI Logfile Format

When configured, the CGI error log logs any CGI which does not execute properly. Each CGI script which fails to operate causes several lines of information to be logged. The first two lines are always of the format:

%% [time] request-line
%% HTTP-status CGI-script-filename

If the error is that CGI script cannot be run, the log file will contain an extra two lines:

%%error
error-message

Alternatively, if the error is the result of the script returning incorrect header information (often due to a bug in the script), the following information is logged:

%request
All HTTP request headers received
POST or PUT entity (if any)
%response
All headers output by the CGI script
%stdout
CGI standard output
%stderr
CGI standard error

(The %stdout and %stderr parts may be missing if the script did not output anything on standard output or standard error).

ScriptLog Directive

Description: | Location of the CGI script error logfile
Syntax: | ScriptLog file-path
Context: | server config, virtual host
Status: | Base
Module: | mod_cgi, mod_cgid

The ScriptLog directive sets the CGI script error logfile. If no ScriptLog is given, no error log is created. If given, any CGI errors are logged into the filename given as argument. If this is a relative file or path it is taken relative to the ServerRoot.

Example

ScriptLog logs/cgi_log

This log will be opened as the user the child processes run as, i.e. the user specified in the main User directive. This means that either the directory the script log is in needs to be writable by that user or the file needs to be manually created and set to be writable by that user. If you place the script log in your main logs directory, do NOT change the directory permissions to make it writable by the user the child processes run as.

Note that script logging is meant to be a debugging feature when writing CGI scripts, and is not meant to be activated continuously on running servers. It is not optimized for speed or efficiency, and may have security problems if used in a manner other than that for which it was designed.

ScriptLogBuffer Directive

Description: | Maximum amount of PUT or POST requests that will be recorded in the scriptlog
Syntax: | ScriptLogBuffer bytes
Default: | ScriptLogBuffer 1024
Context: | server config, virtual host
Status: | Base
Module: | mod_cgi, mod_cgid

The size of any PUT or POST entity body that is logged to the file is limited, to prevent the log file growing too big too quickly if large bodies are being received. By default, up to 1024 bytes are logged, but this can be changed with this directive.

ScriptLogLength Directive

Description: | Size limit of the CGI script logfile
Syntax: | ScriptLogLength bytes
Default: | ScriptLogLength 10385760
Context: | server config, virtual host
Status: | Base
Module: | mod_cgi, mod_cgid

ScriptLogLength can be used to limit the size of the CGI script logfile. Since the logfile logs a lot of information per CGI error (all request headers, all script output) it can grow to be a big file. To prevent problems due to unbounded growth, this directive can be used to set an maximum file-size for the CGI logfile. If the file exceeds this size, no more information will be written to it.


mod_cgid - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_cgid

Description: | Execution of CGI scripts using an external CGI daemon
Status: | Base
Module Identifier: | cgid_module
Source File: | mod_cgid.c
Compatibility: | Unix threaded MPMs only

Summary

Except for the optimizations and the additional ScriptSock directive noted below, mod_cgid behaves similarly to mod_cgi. See the mod_cgi summary for additional details about Apache and CGI.

On certain unix operating systems, forking a process from a multi-threaded server is a very expensive operation because the new process will replicate all the threads of the parent process. In order to avoid incurring this expense on each CGI invocation, mod_cgid creates an external daemon that is responsible for forking child processes to run CGI scripts. The main server communicates with this daemon using a unix domain socket.

This module is used by default instead of mod_cgi whenever a multi-threaded MPM is selected during the compilation process. At the user level, this module is identical in configuration and operation to mod_cgi. The only exception is the additional directive ScriptSock which gives the name of the socket to use for communication with the cgi daemon.

See also

  • mod_cgi
  • Running CGI programs under different user IDs

CGIDScriptTimeout Directive

Description: | The length of time to wait for more output from the CGI program
Syntax: | CGIDScriptTimeout time[s|ms]
Default: | value of Timeout directive when unset
Context: | server config, virtual host, directory, .htaccess
Status: | Base
Module: | mod_cgid
Compatibility: | CGIDScriptTimeout defaults to zero in releases 2.4 and earlier

This directive limits the length of time to wait for more output from the CGI program. If the time is exceeded, the request and CGI are terminated.

Example

CGIDScriptTimeout 20

ScriptSock Directive

Description: | The filename prefix of the socket to use for communication with the cgi daemon
Syntax: | ScriptSock file-path
Default: | ScriptSock logs/cgisock
Context: | server config
Status: | Base
Module: | mod_cgid

This directive sets the filename prefix of the socket to use for communication with the CGI daemon, an extension corresponding to the process ID of the server will be appended. The socket will be opened using the permissions of the user who starts Apache (usually root). To maintain the security of communications with CGI scripts, it is important that no other user has permission to write in the directory where the socket is located.

Example

ScriptSock /var/run/cgid.sock

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_charset_lite - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_charset_lite

Description: | Specify character set translation or recoding
Status: | Extension
Module Identifier: | charset_lite_module
Source File: | mod_charset_lite.c

Summary

mod_charset_lite allows the server to change the character set of responses before sending them to the client. In an EBCDIC environment, Apache always translates HTTP protocol content (e.g. response headers) from the code page of the Apache process locale to ISO-8859-1, but not the body of responses. In any environment, mod_charset_lite can be used to specify that response bodies should be translated. For example, if files are stored in EBCDIC, then mod_charset_lite can translate them to ISO-8859-1 before sending them to the client.

This module provides a small subset of configuration mechanisms implemented by Russian Apache and its associated mod_charset.

Common Problems

Invalid character set names

The character set name parameters of CharsetSourceEnc and CharsetDefault must be acceptable to the translation mechanism used by APR on the system where mod_charset_lite is deployed. These character set names are not standardized and are usually not the same as the corresponding values used in http headers. Currently, APR can only use iconv(3), so you can easily test your character set names using the iconv(1) program, as follows:

iconv -f charsetsourceenc-value -t charsetdefault-value

Mismatch between character set of content and translation rules

If the translation rules don't make sense for the content, translation can fail in various ways, including:

  • The translation mechanism may return a bad return code, and the connection will be aborted.
  • The translation mechanism may silently place special characters (e.g., question marks) in the output buffer when it cannot translate the input buffer.

CharsetDefault Directive

Description: | Charset to translate into
Syntax: | CharsetDefault charset
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_charset_lite

The CharsetDefault directive specifies the charset that content in the associated container should be translated to.

The value of the charset argument must be accepted as a valid character set name by the character set support in APR. Generally, this means that it must be supported by iconv.

Example

<Directory /export/home/trawick/apacheinst/htdocs/convert>
CharsetSourceEnc UTF-16BE
CharsetDefault ISO-8859-1
 </Directory>

CharsetOptions Directive

Description: | Configures charset translation behavior
Syntax: | CharsetOptions option [option] ...
Default: | CharsetOptions DebugLevel=0 NoImplicitAdd
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_charset_lite

The CharsetOptions directive configures certain behaviors of mod_charset_lite. Option can be one of

DebugLevel=n
The DebugLevel keyword allows you to specify the level of debug messages generated by mod_charset_lite. By default, no messages are generated. This is equivalent to DebugLevel=0. With higher numbers, more debug messages are generated, and server performance will be degraded. The actual meanings of the numeric values are described with the definitions of the DBGLVL_ constants near the beginning of mod_charset_lite.c.
ImplicitAdd | NoImplicitAdd
The ImplicitAdd keyword specifies that mod_charset_lite should implicitly insert its filter when the configuration specifies that the character set of content should be translated. If the filter chain is explicitly configured using the AddOutputFilter directive, NoImplicitAdd should be specified so that mod_charset_lite doesn't add its filter.
TranslateAllMimeTypes | NoTranslateAllMimeTypes
Normally, mod_charset_lite will only perform translation on a small subset of possible mimetypes. When the TranslateAllMimeTypes keyword is specified for a given configuration section, translation is performed without regard for mimetype.

CharsetSourceEnc Directive

Description: | Source charset of files
Syntax: | CharsetSourceEnc charset
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_charset_lite

The CharsetSourceEnc directive specifies the source charset of files in the associated container.

The value of the charset argument must be accepted as a valid character set name by the character set support in APR. Generally, this means that it must be supported by iconv.

Example

<Directory /export/home/trawick/apacheinst/htdocs/convert>
CharsetSourceEnc UTF-16BE
CharsetDefault ISO-8859-1
 </Directory>

The character set names in this example work with the iconv translation support in Solaris 8.


mod_dav - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_dav

Description: | Distributed Authoring and Versioning (WebDAV) functionality
Status: | Extension
Module Identifier: | dav_module
Source File: | mod_dav.c

Summary

This module provides class 1 and class 2 WebDAV ('Web-based Distributed Authoring and Versioning') functionality for Apache. This extension to the HTTP protocol allows creating, moving, copying, and deleting resources and collections on a remote web server.

See also

  • DavLockDB
  • LimitXMLRequestBody
  • WebDAV Resources

Enabling WebDAV

To enable mod_dav, add the following to a container in your httpd.conf file:

Dav On

This enables the DAV file system provider, which is implemented by the mod_dav_fs module. Therefore, that module must be compiled into the server or loaded at runtime using the LoadModule directive.

In addition, a location for the DAV lock database must be specified in the global section of your httpd.conf file using the DavLockDB directive:

DavLockDB /usr/local/apache2/var/DavLock

The directory containing the lock database file must be writable by the User and Group under which Apache is running.

You may wish to add a <Limit> clause inside the <Location> directive to limit access to DAV-enabled locations. If you want to set the maximum amount of bytes that a DAV client can send at one request, you have to use the LimitXMLRequestBody directive. The "normal" LimitRequestBody directive has no effect on DAV requests.

Full Example

DavLockDB /usr/local/apache2/var/DavLock

<Location /foo>
Order Allow,Deny
Allow from all
Dav On

AuthType Basic
AuthName DAV
AuthUserFile user.passwd

<LimitExcept GET OPTIONS>
Require user admin
 </LimitExcept>
 </Location>

mod_dav is a descendent of Greg Stein's mod_dav for Apache 1.3. More information about the module is available from that site.

Security Issues

Since DAV access methods allow remote clients to manipulate files on the server, you must take particular care to assure that your server is secure before enabling mod_dav.

Any location on the server where DAV is enabled should be protected by authentication. The use of HTTP Basic Authentication is not recommended. You should use at least HTTP Digest Authentication, which is provided by the mod_auth_digest module. Nearly all WebDAV clients support this authentication method. An alternative is Basic Authentication over an SSL enabled connection.

In order for mod_dav to manage files, it must be able to write to the directories and files under its control using the User and Group under which Apache is running. New files created will also be owned by this User and Group. For this reason, it is important to control access to this account. The DAV repository is considered private to Apache; modifying files outside of Apache (for example using FTP or filesystem-level tools) should not be allowed.

mod_dav may be subject to various kinds of denial-of-service attacks. The LimitXMLRequestBody directive can be used to limit the amount of memory consumed in parsing large DAV requests. The DavDepthInfinity directive can be used to prevent PROPFIND requests on a very large repository from consuming large amounts of memory. Another possible denial-of-service attack involves a client simply filling up all available disk space with many large files. There is no direct way to prevent this in Apache, so you should avoid giving DAV access to untrusted users.

Complex Configurations

One common request is to use mod_dav to manipulate dynamic files (PHP scripts, CGI scripts, etc). This is difficult because a GET request will always run the script, rather than downloading its contents. One way to avoid this is to map two different URLs to the content, one of which will run the script, and one of which will allow it to be downloaded and manipulated with DAV.

Alias /phparea /home/gstein/php_files
Alias /php-source /home/gstein/php_files
<Location /php-source> DAV On
ForceType text/plain
 </Location>

With this setup, http://example.com/phparea can be used to access the output of the PHP scripts, and http://example.com/php-source can be used with a DAV client to manipulate them.

Dav Directive

Description: | Enable WebDAV HTTP methods
Syntax: | Dav On|Off|provider-name
Default: | Dav Off
Context: | directory
Status: | Extension
Module: | mod_dav

Use the Dav directive to enable the WebDAV HTTP methods for the given container:

<Location /foo>
Dav On
 </Location>

The value On is actually an alias for the default provider filesystem which is served by the mod_dav_fs module. Note, that once you have DAV enabled for some location, it cannot be disabled for sublocations. For a complete configuration example have a look at the section above.

Do not enable WebDAV until you have secured your server. Otherwise everyone will be able to distribute files on your system.

DavDepthInfinity Directive

Description: | Allow PROPFIND, Depth: Infinity requests
Syntax: | DavDepthInfinity on|off
Default: | DavDepthInfinity off
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_dav

Use the DavDepthInfinity directive to allow the processing of PROPFIND requests containing the header 'Depth: Infinity'. Because this type of request could constitute a denial-of-service attack, by default it is not allowed.

DavMinTimeout Directive

Description: | Minimum amount of time the server holds a lock on a DAV resource
Syntax: | DavMinTimeout seconds
Default: | DavMinTimeout 0
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_dav

When a client requests a DAV resource lock, it can also specify a time when the lock will be automatically removed by the server. This value is only a request, and the server can ignore it or inform the client of an arbitrary value.

Use the DavMinTimeout directive to specify, in seconds, the minimum lock timeout to return to a client. Microsoft Web Folders defaults to a timeout of 120 seconds; the DavMinTimeout can override this to a higher value (like 600 seconds) to reduce the chance of the client losing the lock due to network latency.

Example

<Location /MSWord>
DavMinTimeout 600
 </Location>

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_dav_fs - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_dav_fs

Description: | filesystem provider for mod_dav
Status: | Extension
Module Identifier: | dav_fs_module
Source File: | mod_dav_fs.c

Summary

This module requires the service of mod_dav. It acts as a support module for mod_dav and provides access to resources located in the server's file system. The formal name of this provider is filesystem. mod_dav backend providers will be invoked by using the Dav directive:

Example

Dav filesystem

Since filesystem is the default provider for mod_dav, you may simply use the value On instead.

See also

  • mod_dav

DavLockDB Directive

Description: | Location of the DAV lock database
Syntax: | DavLockDB file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_dav_fs

Use the DavLockDB directive to specify the full path to the lock database, excluding an extension. If the path is not absolute, it will be taken relative to ServerRoot. The implementation of mod_dav_fs uses a SDBM database to track user locks.

Example

DavLockDB var/DavLock

The directory containing the lock database file must be writable by the User and Group under which Apache is running. For security reasons, you should create a directory for this purpose rather than changing the permissions on an existing directory. In the above example, Apache will create files in the var/ directory under the ServerRoot with the base filename DavLock and extension name chosen by the server.


mod_dav_lock - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_dav_lock

Description: | generic locking module for mod_dav
Status: | Extension
Module Identifier: | dav_lock_module
Source File: | mod_dav_lock.c
Compatibility: | Available in version 2.1 and later

Summary

This module implements a generic locking API which can be used by any backend provider of mod_dav. It requires at least the service of mod_dav. But without a backend provider which makes use of it, it's useless and should not be loaded into the server. A sample backend module which actually utilizes mod_dav_lock is mod_dav_svn, the subversion provider module.

Note that mod_dav_fs does not need this generic locking module, because it uses its own more specialized version.

In order to make mod_dav_lock functional, you just have to specify the location of the lock database using the DavGenericLockDB directive described below.

Developer's Note

In order to retrieve the pointer to the locking provider function, you have to use the ap_lookup_provider API with the arguments dav-lock, generic, and 0.

See also

  • mod_dav

DavGenericLockDB Directive

Description: | Location of the DAV lock database
Syntax: | DavGenericLockDB file-path
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_dav_lock

Use the DavGenericLockDB directive to specify the full path to the lock database, excluding an extension. If the path is not absolute, it will be interpreted relative to ServerRoot. The implementation of mod_dav_lock uses a SDBM database to track user locks.

Example

DavGenericLockDB var/DavLock

The directory containing the lock database file must be writable by the User and Group under which Apache is running. For security reasons, you should create a directory for this purpose rather than changing the permissions on an existing directory. In the above example, Apache will create files in the var/ directory under the ServerRoot with the base filename DavLock and an extension added by the server.


mod_dbd - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_dbd

Description: | Manages SQL database connections
Status: | Extension
Module Identifier: | dbd_module
Source File: | mod_dbd.c
Compatibility: | Version 2.1 and later

Summary

mod_dbd manages SQL database connections using APR. It provides database connections on request to modules requiring SQL database functions, and takes care of managing databases with optimal efficiency and scalability for both threaded and non-threaded MPMs. For details, see the APR website and this overview of the Apache DBD Framework by its original developer.

See also

  • Password Formats

Connection Pooling

This module manages database connections, in a manner optimised for the platform. On non-threaded platforms, it provides a persistent connection in the manner of classic LAMP (Linux, Apache, Mysql, Perl/PHP/Python). On threaded platform, it provides an altogether more scalable and efficient connection pool, as described in this article at ApacheTutor. Note that mod_dbd supersedes the modules presented in that article.

Apache DBD API

mod_dbd exports five functions for other modules to use. The API is as follows:

typedef struct {
    apr_dbd_t *handle;
    apr_dbd_driver_t *driver;
    apr_hash_t *prepared;
} ap_dbd_t;

/* Export functions to access the database */

/* acquire a connection that MUST be explicitly closed.
 * Returns NULL on error
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_open(apr_pool_t*, server_rec*);

/* release a connection acquired with ap_dbd_open */
AP_DECLARE(void) ap_dbd_close(server_rec*, ap_dbd_t*);

/* acquire a connection that will have the lifetime of a request
 * and MUST NOT be explicitly closed.  Return NULL on error.
 * This is the preferred function for most applications.
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_acquire(request_rec*);

/* acquire a connection that will have the lifetime of a connection
 * and MUST NOT be explicitly closed.  Return NULL on error.
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_cacquire(conn_rec*);

/* Prepare a statement for use by a client module */
AP_DECLARE(void) ap_dbd_prepare(server_rec*, const char*, const char*);

/* Also export them as optional functions for modules that prefer it */
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_open, (apr_pool_t*, server_rec*));
APR_DECLARE_OPTIONAL_FN(void, ap_dbd_close, (server_rec*, ap_dbd_t*));
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_acquire, (request_rec*));
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_cacquire, (conn_rec*));
APR_DECLARE_OPTIONAL_FN(void, ap_dbd_prepare, (server_rec*, const char*, const char*));

SQL Prepared Statements

mod_dbd supports SQL prepared statements on behalf of modules that may wish to use them. Each prepared statement must be assigned a name (label), and they are stored in a hash: the prepared field of an ap_dbd_t. Hash entries are of type apr_dbd_prepared_t and can be used in any of the apr_dbd prepared statement SQL query or select commands.

It is up to dbd user modules to use the prepared statements and document what statements can be specified in httpd.conf, or to provide their own directives and use ap_dbd_prepare.

Caveat

When using prepared statements with a MySQL database, it is preferred to set reconnect to 0 in the connection string as to avoid errors that arise from the MySQL client reconnecting without properly resetting the prepared statements. If set to 1, any broken connections will be attempted fixed, but as mod_dbd is not informed, the prepared statements will be invalidated.

SECURITY WARNING

Any web/database application needs to secure itself against SQL injection attacks. In most cases, Apache DBD is safe, because applications use prepared statements, and untrusted inputs are only ever used as data. Of course, if you use it via third-party modules, you should ascertain what precautions they may require.

However, the FreeTDS driver is inherently unsafe. The underlying library doesn't support prepared statements, so the driver emulates them, and the untrusted input is merged into the SQL statement.

It can be made safe by untainting all inputs: a process inspired by Perl's taint checking. Each input is matched against a regexp, and only the match is used, according to the Perl idiom:

  $untrusted =~ /([a-z]+)/;
  $trusted = $1;

To use this, the untainting regexps must be included in the prepared statements configured. The regexp follows immediately after the % in the prepared statement, and is enclosed in curly brackets {}. For example, if your application expects alphanumeric input, you can use:

"SELECT foo FROM bar WHERE input = %s"

with other drivers, and suffer nothing worse than a failed query. But with FreeTDS you'd need:

"SELECT foo FROM bar WHERE input = %{([A-Za-z0-9]+)}s"

Now anything that doesn't match the regexp's $1 match is discarded, so the statement is safe.

An alternative to this may be the third-party ODBC driver, which offers the security of genuine prepared statements.

DBDExptime Directive

Description: | Keepalive time for idle connections
Syntax: | DBDExptime time-in-seconds
Default: | DBDExptime 300
Context: | server config, virtual host
Status: | Extension
Module: | mod_dbd

Set the time to keep idle connections alive when the number of connections specified in DBDKeep has been exceeded (threaded platforms only).

DBDKeep Directive

Description: | Maximum sustained number of connections
Syntax: | DBDKeep number
Default: | DBDKeep 2
Context: | server config, virtual host
Status: | Extension
Module: | mod_dbd

Set the maximum number of connections per process to be sustained, other than for handling peak demand (threaded platforms only).

DBDMax Directive

Description: | Maximum number of connections
Syntax: | DBDMax number
Default: | DBDMax 10
Context: | server config, virtual host
Status: | Extension
Module: | mod_dbd

Set the hard maximum number of connections per process (threaded platforms only).

DBDMin Directive

Description: | Minimum number of connections
Syntax: | DBDMin number
Default: | DBDMin 1
Context: | server config, virtual host
Status: | Extension
Module: | mod_dbd

Set the minimum number of connections per process (threaded platforms only).

DBDParams Directive

Description: | Parameters for database connection
Syntax: | DBDParams param1=value1[,param2=value2]
Context: | server config, virtual host
Status: | Extension
Module: | mod_dbd

As required by the underlying driver. Typically this will be used to pass whatever cannot be defaulted amongst username, password, database name, hostname and port number for connection.

Connection string parameters for current drivers include:

FreeTDS (for MSSQL and SyBase - see SECURITY note)
username, password, appname, dbname, host, charset, lang, server
MySQL
host, port, user, pass, dbname, sock, flags, fldsz, group, reconnect
ODBC
datasource, user, password, connect, ctimeout, stimeout, access, txmode, bufsize
Oracle
user, pass, dbname, server
PostgreSQL
The connection string is passed straight through to PQconnectdb
SQLite2
The connection string is split on a colon, and part1:part2 is used as sqlite_open(part1, atoi(part2), NULL)
SQLite3
The connection string is passed straight through to sqlite3_open

DBDPersist Directive

Description: | Whether to use persistent connections
Syntax: | DBDPersist On|Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_dbd

If set to Off, persistent and pooled connections are disabled. A new database connection is opened when requested by a client, and closed immediately on release. This option is for debugging and low-usage servers.

The default is to enable a pool of persistent connections (or a single LAMP-style persistent connection in the case of a non-threaded server), and should almost always be used in operation.

Prior to version 2.2.2, this directive accepted only the values 0 and 1 instead of Off and On, respectively.

DBDPrepareSQL Directive

Description: | Define an SQL prepared statement
Syntax: | DBDPrepareSQL "SQL statement" label
Context: | server config, virtual host
Status: | Extension
Module: | mod_dbd

For modules such as authentication that repeatedly use a single SQL statement, optimum performance is achieved by preparing the statement at startup rather than every time it is used. This directive prepares an SQL statement and assigns it a label.

DBDriver Directive

Description: | Specify an SQL driver
Syntax: | DBDriver name
Context: | server config, virtual host
Status: | Extension
Module: | mod_dbd

Selects an apr_dbd driver by name. The driver must be installed on your system (on most systems, it will be a shared object or dll). For example, DBDriver mysql will select the MySQL driver in apr_dbd_mysql.so.


mod_deflate - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_deflate

Description: | Compress content before it is delivered to the client
Status: | Extension
Module Identifier: | deflate_module
Source File: | mod_deflate.c

Summary

The mod_deflate module provides the DEFLATE output filter that allows output from your server to be compressed before being sent to the client over the network.

See also

  • Filters

Sample Configurations

Compression and TLS

Some web applications are vulnerable to an information disclosure attack when a TLS connection carries deflate compressed data. For more information, review the details of the "BREACH" family of attacks.

This is a simple configuration that compresses common text-based content types.

Compress only a few types

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript

Enabling Compression

Output Compression

Compression is implemented by the DEFLATE filter. The following directive will enable compression for documents in the container where it is placed:

SetOutputFilter DEFLATE

Some popular browsers cannot handle compression of all content so you may want to set the gzip-only-text/html note to 1 to only allow html files to be compressed (see below). If you set this to anything but 1 it will be ignored.

If you want to restrict the compression to particular MIME types in general, you may use the AddOutputFilterByType directive. Here is an example of enabling compression only for the html files of the Apache documentation:

<Directory "/your-server-root/manual">
AddOutputFilterByType DEFLATE text/html
 </Directory>

For browsers that have problems even with compression of all file types, use the BrowserMatch directive to set the no-gzip note for that particular browser so that no compression will be performed. You may combine no-gzip with gzip-only-text/html to get the best results. In that case the former overrides the latter. Take a look at the following excerpt from the configuration example defined in the section above:

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

At first we probe for a User-Agent string that indicates a Netscape Navigator version of 4.x. These versions cannot handle compression of types other than text/html. The versions 4.06, 4.07 and 4.08 also have problems with decompressing html files. Thus, we completely turn off the deflate filter for them.

The third BrowserMatch directive fixes the guessed identity of the user agent, because the Microsoft Internet Explorer identifies itself also as "Mozilla/4" but is actually able to handle requested compression. Therefore we match against the additional string "MSIE" (\b means "word boundary") in the User-Agent Header and turn off the restrictions defined before.

Note

The DEFLATE filter is always inserted after RESOURCE filters like PHP or SSI. It never touches internal subrequests.

Note

There is a environment variable force-gzip, set via SetEnv, which will ignore the accept-encoding setting of your browser and will send compressed output.

Output Decompression

The mod_deflate module also provides a filter for inflating/uncompressing a gzip compressed response body. In order to activate this feature you have to insert the INFLATE filter into the outputfilter chain using SetOutputFilter or AddOutputFilter, for example:

<Location /dav-area>
ProxyPass http://example.com/
SetOutputFilter INFLATE
 </Location>

This Example will uncompress gzip'ed output from example.com, so other filters can do further processing with it.

Input Decompression

The mod_deflate module also provides a filter for decompressing a gzip compressed request body . In order to activate this feature you have to insert the DEFLATE filter into the input filter chain using SetInputFilter or AddInputFilter, for example:

<Location /dav-area>
SetInputFilter DEFLATE
 </Location>

Now if a request contains a Content-Encoding: gzip header, the body will be automatically decompressed. Few browsers have the ability to gzip request bodies. However, some special applications actually do support request compression, for instance some WebDAV clients.

Note on Content-Length

If you evaluate the request body yourself, don't trust the Content-Length header! The Content-Length header reflects the length of the incoming data from the client and not the byte count of the decompressed data stream.

Dealing with proxy servers

The mod_deflate module sends a Vary: Accept-Encoding HTTP response header to alert proxies that a cached response should be sent only to clients that send the appropriate Accept-Encoding request header. This prevents compressed content from being sent to a client that will not understand it.

If you use some special exclusions dependent on, for example, the User-Agent header, you must manually configure an addition to the Vary header to alert proxies of the additional restrictions. For example, in a typical configuration where the addition of the DEFLATE filter depends on the User-Agent, you should add:

Header append Vary User-Agent

If your decision about compression depends on other information than request headers (e.g. HTTP version), you have to set the Vary header to the value *. This prevents compliant proxies from caching entirely.

Example

Header set Vary *

DeflateBufferSize Directive

Description: | Fragment size to be compressed at one time by zlib
Syntax: | DeflateBufferSize value
Default: | DeflateBufferSize 8096
Context: | server config, virtual host
Status: | Extension
Module: | mod_deflate

The DeflateBufferSize directive specifies the size in bytes of the fragments that zlib should compress at one time.

DeflateCompressionLevel Directive

Description: | How much compression do we apply to the output
Syntax: | DeflateCompressionLevel value
Default: | Zlib's default
Context: | server config, virtual host
Status: | Extension
Module: | mod_deflate
Compatibility: | This directive is available since Apache 2.0.45

The DeflateCompressionLevel directive specifies what level of compression should be used, the higher the value, the better the compression, but the more CPU time is required to achieve this.

The value must between 1 (less compression) and 9 (more compression).

DeflateFilterNote Directive

Description: | Places the compression ratio in a note for logging
Syntax: | DeflateFilterNote [type] notename
Context: | server config, virtual host
Status: | Extension
Module: | mod_deflate
Compatibility: | type is available since Apache 2.0.45

The DeflateFilterNote directive specifies that a note about compression ratios should be attached to the request. The name of the note is the value specified for the directive. You can use that note for statistical purposes by adding the value to your access log.

Example

DeflateFilterNote ratio

LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
CustomLog logs/deflate_log deflate

If you want to extract more accurate values from your logs, you can use the type argument to specify the type of data left as note for logging. type can be one of:

Input
Store the byte count of the filter's input stream in the note.
Output
Store the byte count of the filter's output stream in the note.
Ratio
Store the compression ratio (output/input * 100) in the note. This is the default, if the type argument is omitted.

Thus you may log it this way:

Accurate Logging

DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio

LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
CustomLog logs/deflate_log deflate

See also

  • mod_log_config

DeflateInflateLimitRequestBody Directive

Description: | Maximum size of inflated request bodies
Syntax: | DeflateInflateLimitRequestBodyvalue
Default: | None, but LimitRequestBody applies after deflation
Context: | server config, virtual host, directory, .htaccess
Status: | Extension
Module: | mod_deflate
Compatibility: | 2.2.28 and later

The DeflateInflateLimitRequestBody directive specifies the maximum size of an inflated request body. If it is unset, LimitRequestBody is applied to the inflated body.

DeflateInflateRatioBurst Directive

Description: | Maximum number of times the inflation ratio for request bodies can be crossed
Syntax: | DeflateInflateRatioBurst value
Default: | 3
Context: | server config, virtual host, directory, .htaccess
Status: | Extension
Module: | mod_deflate
Compatibility: | 2.2.28 and later

The DeflateInflateRatioBurst directive specifies the maximum number of times the DeflateInflateRatioLimit cab be crossed before terminating the request.

DeflateInflateRatioLimit Directive

Description: | Maximum inflation ratio for request bodies
Syntax: | DeflateInflateRatioLimit value
Default: | 200
Context: | server config, virtual host, directory, .htaccess
Status: | Extension
Module: | mod_deflate
Compatibility: | 2.2.28 and later

The DeflateInflateRatioLimit directive specifies the maximum ratio of deflated to inflated size of an inflated request body. This ratio is checked as the body is streamed in, and if crossed more than DeflateInflateRatioBurst times the request will be terminated.

DeflateMemLevel Directive

Description: | How much memory should be used by zlib for compression
Syntax: | DeflateMemLevel value
Default: | DeflateMemLevel 9
Context: | server config, virtual host
Status: | Extension
Module: | mod_deflate

The DeflateMemLevel directive specifies how much memory should be used by zlib for compression (a value between 1 and 9).

DeflateWindowSize Directive

Description: | Zlib compression window size
Syntax: | DeflateWindowSize value
Default: | DeflateWindowSize 15
Context: | server config, virtual host
Status: | Extension
Module: | mod_deflate

The DeflateWindowSize directive specifies the zlib compression window size (a value between 1 and 15). Generally, the higher the window size, the higher can the compression ratio be expected.


mod_dir - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_dir

Açıklama: | Bölü çizgisiyle biten yönlendirmeleri yapar ve dizin içeriği dosyalarını sunar.
Durum: | Temel
Modül Betimleyici: | dir_module
Kaynak Dosyası: | mod_dir.c

Özet

Bir dizin içerik dosyası şu iki kaynaktan birinden gelebilir:

  • Kullanıcı tarafından yazılmış ve ismi genellikle index.html olan bir dosya. Dosya ismi DirectoryIndex yönergesi ile belirlenir. Bu, mod_dir modülü tarafından denetlenir.
  • Aksi takdirde içerik listesi sunucu tarafından üretilir. Bu, mod_autoindex modülü tarafından sağlanır.

Bu iki işlev tamamen birbirinden ayrıdır, dolayısıyla eğer isterseniz kendiliğinden dizin içerik listesi üretimini tamamen iptal edebilirsiniz.

Sunucu http://sunucum/filanca/birdizin şeklinde bir istek aldığında birdizin bir dizinin ismiyse ‘bölü çizgisiyle biten’ bir yönlendirme söz konusudur. Dizinler URL sonuna bir bölü çizgisi eklenmesini gerektirir, bu bakımdan mod_dir modülü isteği http://sunucum/filanca/birdizin/ şeklinde yönlendirir.

DirectoryIndex Yönergesi

Açıklama: | İstemci bir dizin istediğinde dizin içeriğini listeler.
Sözdizimi: | DirectoryIndex yerel-url [yerel-url] ...
Öntanımlı: | DirectoryIndex index.html
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_dir

DirectoryIndex yönergesi, istemci, dizinin sonuna bir bölü çizgisi ekleyerek dizin içeriğinin listelenmesini istediğinde bakılmak üzere özkaynakları listeler. yerel-url, sunucu üstünde istenen dizine göreli bir belgenin URL’sidir; normal olarak dizin içindeki bir dosyanın ismidir. Çeşitli URL’ler verilebilirse de sunucu daima ilk bulduğuyla dönecektir. Eğer özkaynakların hiçbiri yoksa ve Indexes seçeneği atanmışsa sunucu dizin içeriğinden bir liste üretecektir.

Örnek:

DirectoryIndex index.html

Bu yapılandırmadan sonra yapılan bir http://mesela.dom/belgeler/ isteğine karşılık, sunucu, mevcutsa http://mesela.dom/belgeler/index.html dosyasını döndürecek, değilse ürettiği dizin içerik listesini gönderecektir.

Belgelerin dizine göreli olmasının gerekmediğine dikkat ediniz.

DirectoryIndex index.html index.txt /cgi-bin/index.pl

Bu örnekte ise dizin içinde index.html ne de index.txt mevcut olduğunda /cgi-bin/index.pl CGI betiği çalıştırılacaktır.

Ek Bilgi: Aynı bağlam içinde çok sayıda DirectoryIndex yönergesi varsa bunlar bir öncekini geçersiz kılmayacak, listeye eklenecektir:

# Örnek A: İlk sayfa index.html olsun buna index.php de eklensin.
<Directory /foo>
    DirectoryIndex index.html
    DirectoryIndex index.php
</Directory>

# Örnek B: Tek bir yönerge ile yapılması dışında Örnek A ile aynıdır.
<Directory /foo>
    DirectoryIndex index.html index.php
</Directory>

DirectorySlash Yönergesi

Açıklama: | Bölü çizgisi ile biten yönlendirmeleri açar/kapar.
Sözdizimi: | DirectorySlash On|Off
Öntanımlı: | DirectorySlash On
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_dir
Uyumluluk: | Apache 2.0.51 ve sonrasında mevcuttur.

DirectorySlash yönergesi, bir dizin isteğinde bulunan URL’lerin sonuna mod_dir modülü tarafından bir bölü çizgisi eklenip eklenmeyeceğini belirler.

Normalde, bir kullanıcı sona bir bölü çizgisi eklemeden bir dizin için istekte bulunursa mod_dir zaten onu aynı özkaynağa yönlendirir, fakat isteğin sonuna bir bölü çizgisi eklenmesinin bazı iyi sebepleri vardır:

  • Kullanıcı bunun sonucunda meşru bir URL ile istekte bulunmuş olur.
  • mod_autoindex gerektiği gibi çalışır. Yoksa bağlantıdaki yolu sunamayacağından yanlış yolu gösterirdi.
  • DirectoryIndex yönergesi sadece bölü çizgisi ile biten dizin istekleri için değerlendirilir.
  • HTML sayfa içindeki göreli URL başvuruları gerektiği gibi çalışacaktır.

Siz yine de bu etkiyi istemezseniz ve yukarıdaki sebepler de size uygun değilse yönlendirmeyi aşağıdaki gibi kapatabilirsiniz. Ancak, bunu yapmanın olası bir güvenlik açığını da beraberinde getireceği dikkate alınmalıdır.

# Aşağıdaki güvenlik uyarısına bakınız!
<Location /bir/yol>
DirectorySlash Off
SetHandler bir-eylemci
 </Location>

Güvenlik Uyarı

Bölü çizgisi ile biten yönlendirmelerin kapatılması bir bilginin istemeyek açığa çıkmasına sebep olabilir. mod_autoindex modülünün etkin olduğunu (Options +Indexes) ve DirectoryIndex ile geçerli bir özkaynağın (index.html olsun) atandığını ama bu URL için başka hiçbir özel eylemci tanımlanmadığını varsayalım. Bu durumda bölü çizgisi ile biten bir istek olduğunda index.html dosyası sunulurdu. Fakat bölü çizgisi ile bitmeyen bir istek dizin içeriğinin listelenmesi ile sonuçlanırdı.

FallbackResource Yönergesi

Açıklama: | Bir dosyayla eşleşmeyen istekler için öntanımlı bir URL tanımlar
Sözdizimi: | FallbackResource disabled | yerel-url
Öntanımlı: | None - httpd 404 döndürür (Bulunamadı)
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | Indexes
Durum: | Temel
Modül: | mod_dir
Uyumluluk: | Apache HTTP Server 2.2.16 ve sonrası - disabled değiştirgesi 2.2.24'ten itibaren desteklenmektedir.

Dosya sisteminizdeki hiçbir şey ile eşleşmeyen URL'ler için bir eylemci atamak isterseniz bunı kullanın. Kullanmadığınız takdirde httpd bir HTTP 404 (Bulunamadı) döndürecektir. Örneğin

FallbackResource /not-404.php

yönergesi ile varolmayan dosyalarla ilgili isteklere /not-404.php sayfası gönderilirken varolanlar ile ilgili istekler bundan etkilenmeyecektir.

Çoğunlukla, belli bir dizindeki mevcut dosya ve betiklere yapılan istekler dışındaki tüm isteklere tek bir dosyanın veya belli bir kaynağın yanıt vermesi istenir. Buna 'öndenetleyici' adı verilir.

httpd'nin eski sürümlerinde bunu sağlamak için mod_rewrite ve istenen dosya veya dizinin var olup olmadığını sınamak için -f ve -d kullanımı gerekirdi. Bu artık tek bir yapılandırma satırı ile halledilebilmektedir.

FallbackResource /index.php

Resimler, css dosyaları gibi mevcut dosyalar normal olarak sunulmaya devam edecektir.

Üst dizinden miras alınmasının istenmemesi özelliğini iptal etmek için disabled değiştirgesini kullanın.

http://example.com/blog/ gibi bir alt-URI isteğinde bu alt-URI bir yerel-url olarak sunulabilir:

<Directory /web/example.com/htdocs/blog>
FallbackResource /blog/index.php
 </Directory>
<Directory /web/example.com/htdocs/blog/images>
FallbackResource disabled
 </Directory>

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_disk_cache - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_disk_cache

Description: | Content cache storage manager keyed to URIs
Status: | Extension
Module Identifier: | disk_cache_module
Source File: | mod_disk_cache.c

Summary

mod_disk_cache implements a disk based storage manager. It is primarily of use in conjunction with mod_cache.

Content is stored in and retrieved from the cache using URI based keys. Content with access protection is not cached.

htcacheclean can be used to maintain the cache size at a maximum level.

Note:

mod_disk_cache requires the services of mod_cache.

Note:

mod_disk_cache uses the sendfile feature to serve files from the cache when supported by the platform, and when enabled with EnableSendfile. However, per-directory and .htaccess configuration of EnableSendfile are ignored by mod_disk_cache as the corresponding settings are not available to the module when a request is being served from the cache.

CacheDirLength Directive

Description: | The number of characters in subdirectory names
Syntax: | CacheDirLength length
Default: | CacheDirLength 2
Context: | server config, virtual host
Status: | Extension
Module: | mod_disk_cache

The CacheDirLength directive sets the number of characters for each subdirectory name in the cache hierarchy.

The result of CacheDirLevels* CacheDirLength must not be higher than 20.

CacheDirLength 4

CacheDirLevels Directive

Description: | The number of levels of subdirectories in the cache.
Syntax: | CacheDirLevels levels
Default: | CacheDirLevels 3
Context: | server config, virtual host
Status: | Extension
Module: | mod_disk_cache

The CacheDirLevels directive sets the number of subdirectory levels in the cache. Cached data will be saved this many directory levels below the CacheRoot directory.

The result of CacheDirLevels* CacheDirLength must not be higher than 20.

CacheDirLevels 5

CacheMaxFileSize Directive

Description: | The maximum size (in bytes) of a document to be placed in the cache
Syntax: | CacheMaxFileSize bytes
Default: | CacheMaxFileSize 1000000
Context: | server config, virtual host
Status: | Extension
Module: | mod_disk_cache

The CacheMaxFileSize directive sets the maximum size, in bytes, for a document to be considered for storage in the cache.

CacheMaxFileSize 64000

CacheMinFileSize Directive

Description: | The minimum size (in bytes) of a document to be placed in the cache
Syntax: | CacheMinFileSize bytes
Default: | CacheMinFileSize 1
Context: | server config, virtual host
Status: | Extension
Module: | mod_disk_cache

The CacheMinFileSize directive sets the minimum size, in bytes, for a document to be considered for storage in the cache.

CacheMinFileSize 64

CacheRoot Directive

Description: | The directory root under which cache files are stored
Syntax: | CacheRoot directory
Context: | server config, virtual host
Status: | Extension
Module: | mod_disk_cache

The CacheRoot directive defines the name of the directory on the disk to contain cache files. If the mod_disk_cache module has been loaded or compiled in to the Apache server, this directive must be defined. Failing to provide a value for CacheRoot will result in a configuration file processing error. The CacheDirLevels and CacheDirLength directives define the structure of the directories under the specified root directory.

CacheRoot c:/cacheroot

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_dumpio - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_dumpio

Description: | Dumps all I/O to error log as desired.
Status: | Extension
Module Identifier: | dumpio_module
Source File: | mod_dumpio.c

Summary

mod_dumpio allows for the logging of all input received by Apache and/or all output sent by Apache to be logged (dumped) to the error.log file.

The data logging is done right after SSL decoding (for input) and right before SSL encoding (for output). As can be expected, this can produce extreme volumes of data, and should only be used when debugging problems.

Enabling dumpio Support

To enable the module, it should be compiled and loaded in to your running Apache configuration. Logging can then be enabled or disabled via the below directives.

DumpIOInput Directive

Description: | Dump all input data to the error log
Syntax: | DumpIOInput On|Off
Default: | DumpIOInput Off
Context: | server config
Status: | Extension
Module: | mod_dumpio
Compatibility: | DumpIOInput is only available in Apache 2.1.3 and later.

Enable dumping of all input.

Example

DumpIOInput On

DumpIOLogLevel Directive

Description: | Controls the logging level of the DumpIO output
Syntax: | DumpIOLogLevel level
Default: | DumpIOLogLevel debug
Context: | server config
Status: | Extension
Module: | mod_dumpio
Compatibility: | DumpIOLogLevel is only available in Apache 2.2.4 and later.

Enable dumping of all output at a specific LogLevel level.

Example

DumpIOLogLevel notice

Compatibility

Prior to 2.2.4 mod_dumpio would only dump to the log when LogLevel was set to debug

DumpIOOutput Directive

Description: | Dump all output data to the error log
Syntax: | DumpIOOutput On|Off
Default: | DumpIOOutput Off
Context: | server config
Status: | Extension
Module: | mod_dumpio
Compatibility: | DumpIOOutput is only available in Apache 2.1.3 and later.

Enable dumping of all output.

Example

DumpIOOutput On

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_echo - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_echo

Description: | A simple echo server to illustrate protocol modules
Status: | Experimental
Module Identifier: | echo_module
Source File: | mod_echo.c
Compatibility: | Available in Apache 2.0 and later

Summary

This module provides an example protocol module to illustrate the concept. It provides a simple echo server. Telnet to it and type stuff, and it will echo it.

ProtocolEcho Directive

Description: | Turn the echo server on or off
Syntax: | ProtocolEcho On|Off
Default: | ProtocolEcho Off
Context: | server config, virtual host
Status: | Experimental
Module: | mod_echo
Compatibility: | ProtocolEcho is only available in 2.0 and later.

The ProtocolEcho directive enables or disables the echo server.

Example

ProtocolEcho On

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_env - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_env

Açıklama: | CGI betiklerine ve SSI sayfalarına aktarılan değişkenlere müdahale etmek için kullanılır.
Durum: | Temel
Modül Betimleyici: | env_module
Kaynak Dosyası: | mod_env.c

Özet

Bu modül çeşitli Apache HTTP sunucu modülleri tarafından kullanılan dahili ortam değişkenlerini denetim altına almak için kullanılır. Bu değişkenler ayrıca CGI betiklerinde sistem ortam değişkenleri gibi belirtilebildiği gibi SSI sayfalarında da kullanılabilmektedir. Bundan başka, yapılandırma sürecinde tanımlı veya tanımsız yapılabilirler.

Ayrıca bakınız:

  • Ortam Değişkenleri

PassEnv Yönergesi

Açıklama: | Ortam değişkenlerini kabuktan aktarır.
Sözdizimi: | PassEnv ortam-değişkeni [ortam-değişkeni] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_env

httpd süreci başlatılırken Apache HTTP sunucu modüllerinde, CGI betiklerinde ve SSI sayfalarında dahili ortam değişkenleri olarak kullanılmak üzere bazı sistem ortam değişkenlerini belirtmek için kullanılır.

Örnek

PassEnv LD_LIBRARY_PATH

SetEnv Yönergesi

Açıklama: | Ortam değişkenlerini tanımlar.
Sözdizimi: | SetEnv ortam-değişkeni [değer]
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_env

Apache HTTP sunucu modüllerinde kullanılmak ve CGI betiklerine ve SSI sayfalarına aktarılmak üzere bir ortam değişkeni belirtilebilmesini sağlar.

Örnek

SetEnv SPECIAL_PATH /foo/bin

Bir değer belirtilmezse, değişkene boş dizgi atanır.

Bu yönerge ile atanan dahili ortam değişkenleri, erişim denetimi ve URI'leri dosya isimleri ile eşleştirme gibi daha önceki istek işleme yönergelerinden sonra atanır. Eğer atayacağınız ortam değişkenlerinin RewriteRule yönergelerindeki gibi erken dönem işlem aşamalarında etkili olmasını istiyorsanız bu ortam değişkenlerini SetEnvIf yönergesi ile atamalısınız.

2.2 sürümünde, PATH ortam değişkeni Setenv kullanılarak atanamaz.

Ayrıca bakınız:

  • Ortam Değişkenleri

UnsetEnv Yönergesi

Açıklama: | Ortamdaki değişkenleri tanımsız hale getirir.
Sözdizimi: | UnsetEnv ortam-değişkeni [ortam-değişkeni] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_env

CGI betiklerine ve SSI sayfalarına bir daha aktarılmamak üzere bir dahili ortam değişkenini ortamdan siler.

Örnek

UnsetEnv LD_LIBRARY_PATH

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_example - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_example

Description: | Illustrates the Apache module API
Status: | Experimental
Module Identifier: | example_module
Source File: | mod_example.c

Summary

Some files in the modules/experimental directory under the Apache distribution directory tree are provided as an example to those that wish to write modules that use the Apache API.

The main file is mod_example.c, which illustrates all the different callback mechanisms and call syntaxes. By no means does an add-on module need to include routines for all of the callbacks - quite the contrary!

The example module is an actual working module. If you link it into your server, enable the "example-handler" handler for a location, and then browse to that location, you will see a display of some of the tracing the example module did as the various callbacks were made.

Compiling the example module

To include the example module in your server, follow the steps below:

  1. Run configure with --enable-example option.
  2. Make the server (run "make").

To add another module of your own:

  1. cp modules/experimental/mod_example.c modules/new_module/mod_myexample.c
  2. Modify the file.
  3. Create modules/new_module/config.m4.
    1. Add APACHE_MODPATH_INIT(new_module).
    2. Copy APACHE_MODULE line with "example" from modules/experimental/config.m4.
    3. Replace the first argument "example" with myexample.
    4. Replace the second argument with brief description of your module. It will be used in configure --help.
    5. If your module needs additional C compiler flags, linker flags or libraries, add them to CFLAGS, LDFLAGS and LIBS accordingly. See other config.m4 files in modules directory for examples.
    6. Add APACHE_MODPATH_FINISH.
  4. Create module/new_module/Makefile.in. If your module doesn't need special build instructions, all you need to have in that file is include $(top_srcdir)/build/special.mk.
  5. Run ./buildconf from the top-level directory.
  6. Build the server with --enable-myexample

Using the mod_example Module

To activate the example module, include a block similar to the following in your httpd.conf file:

<Location /example-info>
SetHandler example-handler
</Location>

As an alternative, you can put the following into a .htaccess file and then request the file "test.example" from that location:

AddHandler example-handler .example

After reloading/restarting your server, you should be able to browse to this location and see the brief display mentioned earlier.

Example Directive

Description: | Demonstration directive to illustrate the Apache module API
Syntax: | Example
Context: | server config, virtual host, directory, .htaccess
Status: | Experimental
Module: | mod_example

The Example directive just sets a demonstration flag which the example module's content handler displays. It takes no arguments. If you browse to an URL to which the example content-handler applies, you will get a display of the routines within the module and how and in what order they were called to service the document request. The effect of this directive one can observe under the point "Example directive declared here: YES/NO".


mod_expires - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_expires

Description: | Generation of Expires and Cache-Control HTTP headers according to user-specified criteria
Status: | Extension
Module Identifier: | expires_module
Source File: | mod_expires.c

Summary

This module controls the setting of the Expires HTTP header and the max-age directive of the Cache-Control HTTP header in server responses. The expiration date can set to be relative to either the time the source file was last modified, or to the time of the client access.

These HTTP headers are an instruction to the client about the document's validity and persistence. If cached, the document may be fetched from the cache rather than from the source until this time has passed. After that, the cache copy is considered "expired" and invalid, and a new copy must be obtained from the source.

To modify Cache-Control directives other than max-age (see RFC 2616 section 14.9), you can use the Header directive.

When the Expires header is already part of the response generated by the server, for example when generated by a CGI script or proxied from an origin server, this module does not change or add an Expires or Cache-Control header.

Alternate Interval Syntax

The ExpiresDefault and ExpiresByType directives can also be defined in a more readable syntax of the form:

ExpiresDefault "base [plus num type] [num type] ..."
ExpiresByType type/encoding "base [plus num type] [num type] ..."

where base is one of:

  • access
  • now (equivalent to 'access')
  • modification

The plus keyword is optional. num should be an integer value [acceptable to atoi()], and type is one of:

  • years
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds

For example, any of the following directives can be used to make documents expire 1 month after being accessed, by default:

ExpiresDefault "access plus 1 month"
ExpiresDefault "access plus 4 weeks"
ExpiresDefault "access plus 30 days"

The expiry time can be fine-tuned by adding several 'num type' clauses:

ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"

Note that if you use a modification date based setting, the Expires header will not be added to content that does not come from a file on disk. This is due to the fact that there is no modification time for such content.

ExpiresActive Directive

Description: | Enables generation of Expires headers
Syntax: | ExpiresActive On|Off
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Extension
Module: | mod_expires

This directive enables or disables the generation of the Expires and Cache-Control headers for the document realm in question. (That is, if found in an .htaccess file, for instance, it applies only to documents generated from that directory.) If set to Off, the headers will not be generated for any document in the realm (unless overridden at a lower level, such as an .htaccess file overriding a server config file). If set to On, the headers will be added to served documents according to the criteria defined by the ExpiresByType and ExpiresDefault directives (q.v.).

Note that this directive does not guarantee that an Expires or Cache-Control header will be generated. If the criteria aren't met, no header will be sent, and the effect will be as though this directive wasn't even specified.

ExpiresByType Directive

Description: | Value of the Expires header configured by MIME type
Syntax: | ExpiresByType MIME-type <code>seconds
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Extension
Module: | mod_expires

This directive defines the value of the Expires header and the max-age directive of the Cache-Control header generated for documents of the specified type (e.g., text/html). The second argument sets the number of seconds that will be added to a base time to construct the expiration date. The Cache-Control: max-age is calculated by subtracting the request time from the expiration date and expressing the result in seconds.

The base time is either the last modification time of the file, or the time of the client's access to the document. Which should be used is specified by the <code> field; M means that the file's last modification time should be used as the base time, and A means the client's access time should be used.

The difference in effect is subtle. If M is used, all current copies of the document in all caches will expire at the same time, which can be good for something like a weekly notice that's always found at the same URL. If A is used, the date of expiration is different for each client; this can be good for image files that don't change very often, particularly for a set of related documents that all refer to the same images (i.e., the images will be accessed repeatedly within a relatively short timespan).

Example:

# enable expirations
ExpiresActive On
# expire GIF images after a month in the client's cache
ExpiresByType image/gif A2592000
# HTML documents are good for a week from the
# time they were changed
ExpiresByType text/html M604800

Note that this directive only has effect if ExpiresActive On has been specified. It overrides, for the specified MIME type only, any expiration date set by the ExpiresDefault directive.

You can also specify the expiration time calculation using an alternate syntax, described earlier in this document.

ExpiresDefault Directive

Description: | Default algorithm for calculating expiration time
Syntax: | ExpiresDefault <code>seconds
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Extension
Module: | mod_expires

This directive sets the default algorithm for calculating the expiration time for all documents in the affected realm. It can be overridden on a type-by-type basis by the ExpiresByType directive. See the description of that directive for details about the syntax of the argument, and the alternate syntax description as well.


mod_ext_filter - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_ext_filter

Description: | Pass the response body through an external program before delivery to the client
Status: | Extension
Module Identifier: | ext_filter_module
Source File: | mod_ext_filter.c

Summary

mod_ext_filter presents a simple and familiar programming model for filters. With this module, a program which reads from stdin and writes to stdout (i.e., a Unix-style filter command) can be a filter for Apache. This filtering mechanism is much slower than using a filter which is specially written for the Apache API and runs inside of the Apache server process, but it does have the following benefits:

  • the programming model is much simpler
  • any programming/scripting language can be used, provided that it allows the program to read from standard input and write to standard output
  • existing programs can be used unmodified as Apache filters

Even when the performance characteristics are not suitable for production use, mod_ext_filter can be used as a prototype environment for filters.

See also

  • Filters

Examples

Generating HTML from some other type of response

# mod_ext_filter directive to define a filter
# to HTML-ize text/c files using the external
# program /usr/bin/enscript, with the type of
# the result set to text/html
ExtFilterDefine c-to-html mode=output \
intype=text/c outtype=text/html \
cmd="/usr/bin/enscript --color -W html -Ec -o - -"
<Directory "/export/home/trawick/apacheinst/htdocs/c">
# core directive to cause the new filter to
# be run on output
SetOutputFilter c-to-html

# mod_mime directive to set the type of .c
# files to text/c
AddType text/c .c

# mod_ext_filter directive to set the debug
# level just high enough to see a log message
# per request showing the configuration in force
ExtFilterOptions DebugLevel=1
 </Directory>

Implementing a content encoding filter

Note: this gzip example is just for the purposes of illustration. Please refer to mod_deflate for a practical implementation.

# mod_ext_filter directive to define the external filter
ExtFilterDefine gzip mode=output cmd=/bin/gzip

<Location /gzipped>
# core directive to cause the gzip filter to be
# run on output
SetOutputFilter gzip

# mod_header directive to add
# "Content-Encoding: gzip" header field
Header set Content-Encoding gzip
 </Location>

Slowing down the server

# mod_ext_filter directive to define a filter
# which runs everything through cat; cat doesn't
# modify anything; it just introduces extra pathlength
# and consumes more resources
ExtFilterDefine slowdown mode=output cmd=/bin/cat \
preservescontentlength
<Location />
# core directive to cause the slowdown filter to
# be run several times on output
#
SetOutputFilter slowdown;slowdown;slowdown
 </Location>

Using sed to replace text in the response

# mod_ext_filter directive to define a filter which
# replaces text in the response
#
ExtFilterDefine fixtext mode=output intype=text/html \
cmd="/bin/sed s/verdana/arial/g"
<Location />
# core directive to cause the fixtext filter to
# be run on output
SetOutputFilter fixtext
 </Location>

Tracing another filter

# Trace the data read and written by mod_deflate
# for a particular client (IP 192.168.1.31)
# experiencing compression problems.
# This filter will trace what goes into mod_deflate.
ExtFilterDefine tracebefore \
cmd="/bin/tracefilter.pl /tmp/tracebefore" \
EnableEnv=trace_this_client
# This filter will trace what goes after mod_deflate.
# Note that without the ftype parameter, the default
# filter type of AP_FTYPE_RESOURCE would cause the
# filter to be placed *before* mod_deflate in the filter
# chain. Giving it a numeric value slightly higher than
# AP_FTYPE_CONTENT_SET will ensure that it is placed
# after mod_deflate.
ExtFilterDefine traceafter \
cmd="/bin/tracefilter.pl /tmp/traceafter" \
EnableEnv=trace_this_client ftype=21
<Directory /usr/local/docs>
SetEnvIf Remote_Addr 192.168.1.31 trace_this_client
SetOutputFilter tracebefore;deflate;traceafter
 </Directory>

Here is the filter which traces the data:

#!/usr/local/bin/perl -w
use strict;

open(SAVE, ">$ARGV[0]")
or die "can't open $ARGV[0]: $?";
while (<STDIN>) {
print SAVE $_;
print $_;
 }

close(SAVE);

ExtFilterDefine Directive

Description: | Define an external filter
Syntax: | ExtFilterDefine filtername parameters
Context: | server config
Status: | Extension
Module: | mod_ext_filter

The ExtFilterDefine directive defines the characteristics of an external filter, including the program to run and its arguments.

filtername specifies the name of the filter being defined. This name can then be used in SetOutputFilter directives. It must be unique among all registered filters. At the present time, no error is reported by the register-filter API, so a problem with duplicate names isn't reported to the user.

Subsequent parameters can appear in any order and define the external command to run and certain other characteristics. The only required parameter is cmd=. These parameters are:

cmd=cmdline
The cmd= keyword allows you to specify the external command to run. If there are arguments after the program name, the command line should be surrounded in quotation marks (e.g., cmd="/bin/mypgm arg1 arg2".) Normal shell quoting is not necessary since the program is run directly, bypassing the shell. Program arguments are blank-delimited. A backslash can be used to escape blanks which should be part of a program argument. Any backslashes which are part of the argument must be escaped with backslash themselves. In addition to the standard CGI environment variables, DOCUMENT_URI, DOCUMENT_PATH_INFO, and QUERY_STRING_UNESCAPED will also be set for the program.
mode=mode
Use mode=output (the default) for filters which process the response. Use mode=input for filters which process the request. mode=input is available in Apache 2.1 and later.
intype=imt
This parameter specifies the internet media type (i.e., MIME type) of documents which should be filtered. By default, all documents are filtered. If intype= is specified, the filter will be disabled for documents of other types.
outtype=imt
This parameter specifies the internet media type (i.e., MIME type) of filtered documents. It is useful when the filter changes the internet media type as part of the filtering operation. By default, the internet media type is unchanged.
PreservesContentLength
The PreservesContentLength keyword specifies that the filter preserves the content length. This is not the default, as most filters change the content length. In the event that the filter doesn't modify the length, this keyword should be specified.
ftype=filtertype
This parameter specifies the numeric value for filter type that the filter should be registered as. The default value, AP_FTYPE_RESOURCE, is sufficient in most cases. If the filter needs to operate at a different point in the filter chain than resource filters, then this parameter will be necessary. See the AP_FTYPE_foo definitions in util_filter.h for appropriate values.
disableenv=env
This parameter specifies the name of an environment variable which, if set, will disable the filter.
enableenv=env
This parameter specifies the name of an environment variable which must be set, or the filter will be disabled.

ExtFilterOptions Directive

Description: | Configure mod_ext_filter options
Syntax: | ExtFilterOptions option [option] ...
Default: | ExtFilterOptions DebugLevel=0 NoLogStderr
Context: | directory
Status: | Extension
Module: | mod_ext_filter

The ExtFilterOptions directive specifies special processing options for mod_ext_filter. Option can be one of

DebugLevel=n
The DebugLevel keyword allows you to specify the level of debug messages generated by mod_ext_filter. By default, no debug messages are generated. This is equivalent to DebugLevel=0. With higher numbers, more debug messages are generated, and server performance will be degraded. The actual meanings of the numeric values are described with the definitions of the DBGLVL_ constants near the beginning of mod_ext_filter.c.

Note: The core directive LogLevel should be used to cause debug messages to be stored in the Apache error log.

LogStderr | NoLogStderr
The LogStderr keyword specifies that messages written to standard error by the external filter program will be saved in the Apache error log. NoLogStderr disables this feature.
Onfail=[abort|remove] (new in httpd version 2.2.12).
Determines how to proceed if the external filter program cannot be started. With abort (the default value) the request will be aborted. With remove, the filter is removed and the request continues without it.

Example

ExtFilterOptions LogStderr DebugLevel=0

Messages written to the filter's standard error will be stored in the Apache error log. No debug messages will be generated by mod_ext_filter.


mod_file_cache - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_file_cache

Description: | Caches a static list of files in memory
Status: | Experimental
Module Identifier: | file_cache_module
Source File: | mod_file_cache.c

Summary

This module should be used with care. You can easily create a broken site using mod_file_cache, so read this document carefully.

Caching frequently requested files that change very infrequently is a technique for reducing server load. mod_file_cache provides two techniques for caching frequently requested static files. Through configuration directives, you can direct mod_file_cache to either open then mmap() a file, or to pre-open a file and save the file's open file handle. Both techniques reduce server load when processing requests for these files by doing part of the work (specifically, the file I/O) for serving the file when the server is started rather than during each request.

Notice: You cannot use this for speeding up CGI programs or other files which are served by special content handlers. It can only be used for regular files which are usually served by the Apache core content handler.

This module is an extension of and borrows heavily from the mod_mmap_static module in Apache 1.3.

Using mod_file_cache

mod_file_cache caches a list of statically configured files via MMapFile or CacheFile directives in the main server configuration.

Not all platforms support both directives. You will receive an error message in the server error log if you attempt to use an unsupported directive. If given an unsupported directive, the server will start but the file will not be cached. On platforms that support both directives, you should experiment with both to see which works best for you.

MMapFile Directive

The MMapFile directive of mod_file_cache maps a list of statically configured files into memory through the system call mmap(). This system call is available on most modern Unix derivates, but not on all. There are sometimes system-specific limits on the size and number of files that can be mmap()ed, experimentation is probably the easiest way to find out.

This mmap()ing is done once at server start or restart, only. So whenever one of the mapped files changes on the filesystem you have to restart the server (see the Stopping and Restarting documentation). To reiterate that point: if the files are modified in place without restarting the server you may end up serving requests that are completely bogus. You should update files by unlinking the old copy and putting a new copy in place. Most tools such as rdist and mv do this. The reason why this modules doesn't take care of changes to the files is that this check would need an extra stat() every time which is a waste and against the intent of I/O reduction.

CacheFile Directive

The CacheFile directive of mod_file_cache opens an active handle or file descriptor to the file (or files) listed in the configuration directive and places these open file handles in the cache. When the file is requested, the server retrieves the handle from the cache and passes it to the sendfile() (or TransmitFile() on Windows), socket API.

This file handle caching is done once at server start or restart, only. So whenever one of the cached files changes on the filesystem you have to restart the server (see the Stopping and Restarting documentation). To reiterate that point: if the files are modified in place without restarting the server you may end up serving requests that are completely bogus. You should update files by unlinking the old copy and putting a new copy in place. Most tools such as rdist and mv do this.

Note

Don't bother asking for a directive which recursively caches all the files in a directory. Try this instead... See the Include directive, and consider this command:

find /www/htdocs -type f -print \
| sed -e 's/.*/mmapfile &/' > /www/conf/mmap.conf

CacheFile Directive

Description: | Cache a list of file handles at startup time
Syntax: | CacheFile file-path [file-path] ...
Context: | server config
Status: | Experimental
Module: | mod_file_cache

The CacheFile directive opens handles to one or more files (given as whitespace separated arguments) and places these handles into the cache at server startup time. Handles to cached files are automatically closed on a server shutdown. When the files have changed on the filesystem, the server should be restarted to re-cache them.

Be careful with the file-path arguments: They have to literally match the filesystem path Apache's URL-to-filename translation handlers create. We cannot compare inodes or other stuff to match paths through symbolic links etc. because that again would cost extra stat() system calls which is not acceptable. This module may or may not work with filenames rewritten by mod_alias or mod_rewrite.

Example

CacheFile /usr/local/apache/htdocs/index.html

MMapFile Directive

Description: | Map a list of files into memory at startup time
Syntax: | MMapFile file-path [file-path] ...
Context: | server config
Status: | Experimental
Module: | mod_file_cache

The MMapFile directive maps one or more files (given as whitespace separated arguments) into memory at server startup time. They are automatically unmapped on a server shutdown. When the files have changed on the filesystem at least a HUP or USR1 signal should be send to the server to re-mmap() them.

Be careful with the file-path arguments: They have to literally match the filesystem path Apache's URL-to-filename translation handlers create. We cannot compare inodes or other stuff to match paths through symbolic links etc. because that again would cost extra stat() system calls which is not acceptable. This module may or may not work with filenames rewritten by mod_alias or mod_rewrite.

Example

MMapFile /usr/local/apache/htdocs/index.html


mod_filter - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_filter

Description: | Context-sensitive smart filter configuration module
Status: | Base
Module Identifier: | filter_module
Source File: | mod_filter.c
Compatibility: | Version 2.1 and later

Summary

This module enables smart, context-sensitive configuration of output content filters. For example, apache can be configured to process different content-types through different filters, even when the content-type is not known in advance (e.g. in a proxy).

mod_filter works by introducing indirection into the filter chain. Instead of inserting filters in the chain, we insert a filter harness which in turn dispatches conditionally to a filter provider. Any content filter may be used as a provider to mod_filter; no change to existing filter modules is required (although it may be possible to simplify them).

Smart Filtering

In the traditional filtering model, filters are inserted unconditionally using AddOutputFilter and family. Each filter then needs to determine whether to run, and there is little flexibility available for server admins to allow the chain to be configured dynamically.

mod_filter by contrast gives server administrators a great deal of flexibility in configuring the filter chain. In fact, filters can be inserted based on any Request Header, Response Header or Environment Variable. This generalises the limited flexibility offered by AddOutputFilterByType, and fixes it to work correctly with dynamic content, regardless of the content generator. The ability to dispatch based on Environment Variables offers the full flexibility of configuration with mod_rewrite to anyone who needs it.

Filter Declarations, Providers and Chains

[This image displays the traditional filter model]
Figure 1: The traditional filter model

In the traditional model, output filters are a simple chain from the content generator (handler) to the client. This works well provided the filter chain can be correctly configured, but presents problems when the filters need to be configured dynamically based on the outcome of the handler.

[This image shows the mod_filter model]
Figure 2: The mod_filter model

mod_filter works by introducing indirection into the filter chain. Instead of inserting filters in the chain, we insert a filter harness which in turn dispatches conditionally to a filter provider. Any content filter may be used as a provider to mod_filter; no change to existing filter modules is required (although it may be possible to simplify them). There can be multiple providers for one filter, but no more than one provider will run for any single request.

A filter chain comprises any number of instances of the filter harness, each of which may have any number of providers. A special case is that of a single provider with unconditional dispatch: this is equivalent to inserting the provider filter directly into the chain.

Configuring the Chain

There are three stages to configuring a filter chain with mod_filter. For details of the directives, see below.

Declare Filters
The FilterDeclare directive declares a filter, assigning it a name and filter type. Required only if the filter is not the default type AP_FTYPE_RESOURCE.
Register Providers
The FilterProvider directive registers a provider with a filter. The filter may have been declared with FilterDeclare; if not, FilterProvider will implicitly declare it with the default type AP_FTYPE_RESOURCE. The provider must have been registered with ap_register_output_filter by some module. The remaining arguments to FilterProvider are a dispatch criterion and a match string. The former may be an HTTP request or response header, an environment variable, or the Handler used by this request. The latter is matched to it for each request, to determine whether this provider will be used to implement the filter for this request.
Configure the Chain
The above directives build components of a smart filter chain, but do not configure it to run. The FilterChain directive builds a filter chain from smart filters declared, offering the flexibility to insert filters at the beginning or end of the chain, remove a filter, or clear the chain.

Filtering and Response Status

mod_filter normally only runs filters on responses with HTTP status 200 (OK). If you want to filter documents with other response statuses, you can set the filter-errordocs environment variable, and it will work on all responses regardless of status. To refine this further, you can use expression conditions with FilterProvider.

Examples

Server side Includes (SSI)
A simple case of using mod_filter in place of AddOutputFilterByType

FilterDeclare SSI
FilterProvider SSI INCLUDES resp=Content-Type $text/html
FilterChain SSI

Server side Includes (SSI)
The same as the above but dispatching on handler (classic SSI behaviour; .shtml files get processed).

FilterProvider SSI INCLUDES Handler server-parsed
FilterChain SSI

Emulating mod_gzip with mod_deflate
Insert INFLATE filter only if "gzip" is NOT in the Accept-Encoding header. This filter runs with ftype CONTENT_SET.

FilterDeclare gzip CONTENT_SET
FilterProvider gzip inflate req=Accept-Encoding !$gzip
FilterChain gzip

Image Downsampling
Suppose we want to downsample all web images, and have filters for GIF, JPEG and PNG.

FilterProvider unpack jpeg_unpack Content-Type $image/jpeg
FilterProvider unpack gif_unpack Content-Type $image/gif
FilterProvider unpack png_unpack Content-Type $image/png

FilterProvider downsample downsample_filter Content-Type $image
FilterProtocol downsample "change=yes"

FilterProvider repack jpeg_pack Content-Type $image/jpeg
FilterProvider repack gif_pack Content-Type $image/gif
FilterProvider repack png_pack Content-Type $image/png
<Location /image-filter>
FilterChain unpack downsample repack
 </Location>

Protocol Handling

Historically, each filter is responsible for ensuring that whatever changes it makes are correctly represented in the HTTP response headers, and that it does not run when it would make an illegal change. This imposes a burden on filter authors to re-implement some common functionality in every filter:

  • Many filters will change the content, invalidating existing content tags, checksums, hashes, and lengths.
  • Filters that require an entire, unbroken response in input need to ensure they don't get byteranges from a backend.
  • Filters that transform output in a filter need to ensure they don't violate a Cache-Control: no-transform header from the backend.
  • Filters may make responses uncacheable.

mod_filter aims to offer generic handling of these details of filter implementation, reducing the complexity required of content filter modules. This is work-in-progress; the FilterProtocol implements some of this functionality for back-compatibility with Apache 2.0 modules. For httpd 2.1 and later, the ap_register_output_filter_protocol and ap_filter_protocol API enables filter modules to declare their own behaviour.

At the same time, mod_filter should not interfere with a filter that wants to handle all aspects of the protocol. By default (i.e. in the absence of any FilterProtocol directives), mod_filter will leave the headers untouched.

At the time of writing, this feature is largely untested, as modules in common use are designed to work with 2.0. Modules using it should test it carefully.

FilterChain Directive

Description: | Configure the filter chain
Syntax: | FilterChain [+=-@!]filter-name ...
Context: | server config, virtual host, directory, .htaccess
Override: | Options
Status: | Base
Module: | mod_filter

This configures an actual filter chain, from declared filters. FilterChain takes any number of arguments, each optionally preceded with a single-character control that determines what to do:

+filter-name
Add filter-name to the end of the filter chain
@filter-name
Insert filter-name at the start of the filter chain
-filter-name
Remove filter-name from the filter chain
=filter-name
Empty the filter chain and insert filter-name
!
Empty the filter chain
filter-name
Equivalent to +filter-name

FilterDeclare Directive

Description: | Declare a smart filter
Syntax: | FilterDeclare filter-name [type]
Context: | server config, virtual host, directory, .htaccess
Override: | Options
Status: | Base
Module: | mod_filter

This directive declares an output filter together with a header or environment variable that will determine runtime configuration. The first argument is a filter-name for use in FilterProvider, FilterChain and FilterProtocol directives.

The final (optional) argument is the type of filter, and takes values of ap_filter_type - namely RESOURCE (the default), CONTENT_SET, PROTOCOL, TRANSCODE, CONNECTION or NETWORK.

FilterProtocol Directive

Description: | Deal with correct HTTP protocol handling
Syntax: | FilterProtocol filter-name [provider-name] proto-flags
Context: | server config, virtual host, directory, .htaccess
Override: | Options
Status: | Base
Module: | mod_filter

This directs mod_filter to deal with ensuring the filter doesn't run when it shouldn't, and that the HTTP response headers are correctly set taking into account the effects of the filter.

There are two forms of this directive. With three arguments, it applies specifically to a filter-name and a provider-name for that filter. With two arguments it applies to a filter-name whenever the filter runs any provider.

proto-flags is one or more of

change=yes
The filter changes the content, including possibly the content length
change=1:1
The filter changes the content, but will not change the content length
byteranges=no
The filter cannot work on byteranges and requires complete input
proxy=no
The filter should not run in a proxy context
proxy=transform
The filter transforms the response in a manner incompatible with the HTTP Cache-Control: no-transform header.
cache=no
The filter renders the output uncacheable (eg by introducing randomised content changes)

FilterProvider Directive

Description: | Register a content filter
Syntax: | FilterProvider filter-name provider-name [req|resp|env]=dispatch match
Context: | server config, virtual host, directory, .htaccess
Override: | Options
Status: | Base
Module: | mod_filter

This directive registers a provider for the smart filter. The provider will be called if and only if the match declared here matches the value of the header or environment variable declared as dispatch.

provider-name must have been registered by loading a module that registers the name with ap_register_output_filter.

The dispatch argument is a string with optional req=, resp= or env= prefix causing it to dispatch on (respectively) the request header, response header, or environment variable named. In the absence of a prefix, it defaults to a response header. A special case is the word handler, which causes mod_filter to dispatch on the content handler.

The match argument specifies a match that will be applied to the filter's dispatch criterion. The match may be a string match (exact match or substring), a regex, an integer (greater, lessthan or equals), or unconditional. The first characters of the match argument determines this:

First, if the first character is an exclamation mark (!), this reverses the rule, so the provider will be used if and only if the match fails.

Second, it interprets the first character excluding any leading ! as follows:

Character | Description
(none) | exact match
$ | substring match
/ | regex match (delimited by a second /)
= | integer equality
< | integer less-than
<= | integer less-than or equal
> | integer greater-than
>= | integer greater-than or equal
* | Unconditional match

FilterTrace Directive

Description: | Get debug/diagnostic information from mod_filter
Syntax: | FilterTrace filter-name level
Context: | server config, virtual host, directory
Status: | Base
Module: | mod_filter

This directive generates debug information from mod_filter. It is designed to help test and debug providers (filter modules), although it may also help with mod_filter itself.

The debug output depends on the level set:

0 (default)
No debug information is generated.
1
mod_filter will record buckets and brigades passing through the filter to the error log, before the provider has processed them. This is similar to the information generated by mod_diagnostics.
2 (not yet implemented)
Will dump the full data passing through to a tempfile before the provider. For single-user debug only; this will not support concurrent hits.


mod_headers - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_headers

Description: | Customization of HTTP request and response headers
Status: | Extension
Module Identifier: | headers_module
Source File: | mod_headers.c

Summary

This module provides directives to control and modify HTTP request and response headers. Headers can be merged, replaced or removed.

Order of Processing

The directives provided by mod_headers can occur almost anywhere within the server configuration, and can be limited in scope by enclosing them in configuration sections.

Order of processing is important and is affected both by the order in the configuration file and by placement in configuration sections. These two directives have a different effect if reversed:

RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID

This way round, the MirrorID header is not set. If reversed, the MirrorID header is set to "mirror 12".

Early and Late Processing

mod_headers can be applied either early or late in the request. The normal mode is late, when Request Headers are set immediately before running the content generator and Response Headers just as the response is sent down the wire. Always use Late mode in an operational server.

Early mode is designed as a test/debugging aid for developers. Directives defined using the early keyword are set right at the beginning of processing the request. This means they can be used to simulate different requests and set up test cases, but it also means that headers may be changed at any time by other modules before generating a Response.

Because early directives are processed before the request path's configuration is traversed, early headers can only be set in a main server or virtual host context. Early directives cannot depend on a request path, so they will fail in contexts such as <Directory> or <Location>.

Examples

  1. Copy all request headers that begin with "TS" to the response headers:

    Header echo ^TS

  2. Add a header, MyHeader, to the response including a timestamp for when the request was received and how long it took to begin serving the request. This header can be used by the client to intuit load on the server or in isolating bottlenecks between the client and the server.

    Header set MyHeader "%D %t"

    results in this header being added to the response:

    MyHeader: D=3775428 t=991424704447256

  3. Say hello to Joe

    Header set MyHeader "Hello Joe. It took %D microseconds \
    for Apache to serve this request."

    results in this header being added to the response:

    MyHeader: Hello Joe. It took D=3775428 microseconds for Apache to serve this request.

  4. Conditionally send MyHeader on the response if and only if header MyRequestHeader is present on the request. This is useful for constructing headers in response to some client stimulus. Note that this example requires the services of the mod_setenvif module.

    SetEnvIf MyRequestHeader myvalue HAVE_MyRequestHeader
    Header set MyHeader "%D %t mytext" env=HAVE_MyRequestHeader

    If the header MyRequestHeader: myvalue is present on the HTTP request, the response will contain the following header:

    MyHeader: D=3775428 t=991424704447256 mytext

  5. Enable DAV to work with Apache running HTTP through SSL hardware (problem description) by replacing https: with http: in the Destination header:

    RequestHeader edit Destination ^https: http: early

  6. Set the same header value under multiple nonexclusive conditions, but do not duplicate the value in the final header. If all of the following conditions applied to a request (i.e., if the CGI, NO_CACHE and NO_STORE environment variables all existed for the request):

    Header merge Cache-Control no-cache env=CGI
    Header merge Cache-Control no-cache env=NO_CACHE
    Header merge Cache-Control no-store env=NO_STORE

    then the response would contain the following header:

    Cache-Control: no-cache, no-store

    If append was used instead of merge, then the response would contain the following header:

    Cache-Control: no-cache, no-cache, no-store

Header Directive

Description: | Configure HTTP response headers
Syntax: | Header [condition] set|append|merge|add|unset|echo|edit header [value] [replacement] [early|env=[!]variable]
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_headers
Compatibility: | The merge argument is available in version 2.2.9 and later. The edit argument is available in version 2.2.4 and later.

This directive can replace, merge or remove HTTP response headers. The header is modified just after the content handler and output filters are run, allowing outgoing headers to be modified.

The optional condition argument determines which internal table of responses headers this directive will operate against. Other components of the server may have stored their response headers in either the table that corresponds to onsuccess or the table that corresponds to always. "Always" in this context refers to whether headers you add will be sent during both a successful and unsucessful response, but if your action is a function of an existing header, you will have to read on for further complications.

The default value of onsuccess may need to be changed to always under the circumstances similar to those listed below. Note also that repeating this directive with both conditions makes sense in some scenarios because always is not a superset of onsuccess with respect to existing headers:

  • You're adding a header to a non-success (non-2xx) response, such as a redirect, in which case only the table corresponding to always is used in the ultimate response.
  • You're modifying or removing a header generated by a CGI script, in which case the CGI scripts are in the table corresponding to always and not in the default table.
  • You're modifying or removing a header generated by some piece of the server but that header is not being found by the default onsuccess condition.

The action it performs is determined by the first argument (second argument if a condition is specified). This can be one of the following values:

set
The response header is set, replacing any previous header with this name. The value may be a format string.
append
The response header is appended to any existing header of the same name. When a new value is merged onto an existing header it is separated from the existing header with a comma. This is the HTTP standard way of giving a header multiple values.
merge
The response header is appended to any existing header of the same name, unless the value to be appended already appears in the header's comma-delimited list of values. When a new value is merged onto an existing header it is separated from the existing header with a comma. This is the HTTP standard way of giving a header multiple values. Values are compared in a case sensitive manner, and after all format specifiers have been processed. Values in double quotes are considered different from otherwise identical unquoted values. Available in version 2.2.9 and later.
add
The response header is added to the existing set of headers, even if this header already exists. This can result in two (or more) headers having the same name. This can lead to unforeseen consequences, and in general set, append or merge should be used instead.
unset
The response header of this name is removed, if it exists. If there are multiple headers of the same name, all will be removed. value must be omitted.
echo
Request headers with this name are echoed back in the response headers. header may be a regular expression. value must be omitted.
edit
If this response header exists, its value is transformed according to a regular expression search-and-replace. The value argument is a regular expression, and the replacement is a replacement string, which may contain backreferences. Available in version 2.2.4 and later.

This argument is followed by a header name, which can include the final colon, but it is not required. Case is ignored for set, append, merge, add, unset and edit. The header name for echo is case sensitive and may be a regular expression.

For set, append, merge and add a value is specified as the next argument. If value contains spaces, it should be surrounded by double quotes. value may be a character string, a string containing format specifiers or a combination of both. The following format specifiers are supported in value:

Format | Description
%% | The percent sign
%t | The time the request was received in Universal Coordinated Time since the epoch (Jan. 1, 1970) measured in microseconds. The value is preceded by t=.
%D | The time from when the request was received to the time the headers are sent on the wire. This is a measure of the duration of the request. The value is preceded by D=. The value is measured in microseconds.
%{FOOBAR}e | The contents of the environment variable FOOBAR.
%{FOOBAR}s | The contents of the SSL environment variable FOOBAR, if mod_ssl is enabled.

Note

The %s format specifier is only available in Apache 2.1 and later; it can be used instead of %e to avoid the overhead of enabling SSLOptions +StdEnvVars. If SSLOptions +StdEnvVars must be enabled anyway for some other reason, %e will be more efficient than %s.

For edit there is both a value argument which is a regular expression, and an additional replacement string.

The Header directive may be followed by an an additional argument, which may be used to specify conditions under which the action will be taken, or may be the keyword early to specify early processing. If the environment variable specified in the env=... argument exists (or if the environment variable does not exist and env=!... is specified) then the action specified by the Header directive will take effect. Otherwise, the directive will have no effect on the request.

Except in early mode, the Header directives are processed just before the response is sent to the network. This means that it is possible to set and/or override most headers, except for some headers added by the HTTP header filter. Prior to 2.2.12, it was not possible to change the Content-Type header with this directive.

RequestHeader Directive

Description: | Configure HTTP request headers
Syntax: | RequestHeader set|append|merge|add|unset|edit header [value] [replacement] [early|env=[!]variable]
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_headers
Compatibility: | The merge argument is available in version 2.2.9 and later. The edit argument is available in version 2.2.4 and later.

This directive can replace, merge, change or remove HTTP request headers. The header is modified just before the content handler is run, allowing incoming headers to be modified. The action it performs is determined by the first argument. This can be one of the following values:

set
The request header is set, replacing any previous header with this name
append
The request header is appended to any existing header of the same name. When a new value is merged onto an existing header it is separated from the existing header with a comma. This is the HTTP standard way of giving a header multiple values.
merge
The request header is appended to any existing header of the same name, unless the value to be appended already appears in the existing header's comma-delimited list of values. When a new value is merged onto an existing header it is separated from the existing header with a comma. This is the HTTP standard way of giving a header multiple values. Values are compared in a case sensitive manner, and after all format specifiers have been processed. Values in double quotes are considered different from otherwise identical unquoted values. Available in version 2.2.9 and later.
add
The request header is added to the existing set of headers, even if this header already exists. This can result in two (or more) headers having the same name. This can lead to unforeseen consequences, and in general set, append or merge should be used instead.
unset
The request header of this name is removed, if it exists. If there are multiple headers of the same name, all will be removed. value must be omitted.
edit
If this request header exists, its value is transformed according to a regular expression search-and-replace. The value argument is a regular expression, and the replacement is a replacement string, which may contain backreferences. Available in version 2.2.4 and later.

This argument is followed by a header name, which can include the final colon, but it is not required. Case is ignored. For set, append, merge and add a value is given as the third argument. If a value contains spaces, it should be surrounded by double quotes. For unset, no value should be given. value may be a character string, a string containing format specifiers or a combination of both. The supported format specifiers are the same as for the Header, please have a look there for details. For edit both a value and a replacement are required, and are a regular expression and a replacement string respectively.

The RequestHeader directive may be followed by an additional argument, which may be used to specify conditions under which the action will be taken, or may be the keyword early to specify early processing. If the environment variable specified in the env=... argument exists (or if the environment variable does not exist and env=!... is specified) then the action specified by the RequestHeader directive will take effect. Otherwise, the directive will have no effect on the request.

Except in early mode, the RequestHeader directive is processed just before the request is run by its handler in the fixup phase. This should allow headers generated by the browser, or by Apache input filters to be overridden or modified.


mod_ident - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_ident

Description: | RFC 1413 ident lookups
Status: | Extension
Module Identifier: | ident_module
Source File: | mod_ident.c
Compatibility: | Available in Apache 2.1 and later

Summary

This module queries an RFC 1413 compatible daemon on a remote host to look up the owner of a connection.

See also

  • mod_log_config

IdentityCheck Directive

Description: | Enables logging of the RFC 1413 identity of the remote user
Syntax: | IdentityCheck On|Off
Default: | IdentityCheck Off
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_ident
Compatibility: | Moved out of core in Apache 2.1

This directive enables RFC 1413-compliant logging of the remote user name for each connection, where the client machine runs identd or something similar. This information is logged in the access log using the %...l format string.

The information should not be trusted in any way except for rudimentary usage tracking.

Note that this can cause serious latency problems accessing your server since every request requires one of these lookups to be performed. When firewalls or proxy servers are involved, each lookup might possibly fail and add a latency duration as defined by the IdentityCheckTimeout directive to each hit. So in general this is not very useful on public servers accessible from the Internet.

IdentityCheckTimeout Directive

Description: | Determines the timeout duration for ident requests
Syntax: | IdentityCheckTimeout seconds
Default: | IdentityCheckTimeout 30
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_ident

This directive specifies the timeout duration of an ident request. The default value of 30 seconds is recommended by RFC 1413, mainly because of possible network latency. However, you may want to adjust the timeout value according to your local network speed.


mod_imagemap - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_imagemap

Description: | Server-side imagemap processing
Status: | Base
Module Identifier: | imagemap_module
Source File: | mod_imagemap.c

Summary

This module processes .map files, thereby replacing the functionality of the imagemap CGI program. Any directory or document type configured to use the handler imap-file (using either AddHandler or SetHandler) will be processed by this module.

The following directive will activate files ending with .map as imagemap files:

AddHandler imap-file map

Note that the following is still supported:

AddType application/x-httpd-imap map

However, we are trying to phase out "magic MIME types" so we are deprecating this method.

New Features

The imagemap module adds some new features that were not possible with previously distributed imagemap programs.

  • URL references relative to the Referer: information.
  • Default <base> assignment through a new map directive base.
  • No need for imagemap.conf file.
  • Point references.
  • Configurable generation of imagemap menus.

Imagemap File

The lines in the imagemap files can have one of several formats:

directive value [x,y ...]
directive value "Menu text" [x,y ...]
directive value x,y ... "Menu text"

The directive is one of base, default, poly, circle, rect, or point. The value is an absolute or relative URL, or one of the special values listed below. The coordinates are x,y pairs separated by whitespace. The quoted text is used as the text of the link if a imagemap menu is generated. Lines beginning with '#' are comments.

Imagemap File Directives

There are six directives allowed in the imagemap file. The directives can come in any order, but are processed in the order they are found in the imagemap file.

base Directive

Has the effect of <base href="value"> . The non-absolute URLs of the map-file are taken relative to this value. The base directive overrides ImapBase as set in a .htaccess file or in the server configuration files. In the absence of an ImapBase configuration directive, base defaults to http://server_name/.

base_uri is synonymous with base. Note that a trailing slash on the URL is significant.

default Directive
The action taken if the coordinates given do not fit any of the poly, circle or rect directives, and there are no point directives. Defaults to nocontent in the absence of an ImapDefault configuration setting, causing a status code of 204 No Content to be returned. The client should keep the same page displayed.
poly Directive
Takes three to one-hundred points, and is obeyed if the user selected coordinates fall within the polygon defined by these points.
circle
Takes the center coordinates of a circle and a point on the circle. Is obeyed if the user selected point is with the circle.
rect Directive
Takes the coordinates of two opposing corners of a rectangle. Obeyed if the point selected is within this rectangle.
point Directive
Takes a single point. The point directive closest to the user selected point is obeyed if no other directives are satisfied. Note that default will not be followed if a point directive is present and valid coordinates are given.

Values

The values for each of the directives can be any of the following:

a URL

The URL can be relative or absolute URL. Relative URLs can contain '..' syntax and will be resolved relative to the base value.

base itself will not be resolved according to the current value. A statement base mailto: will work properly, though.

map
Equivalent to the URL of the imagemap file itself. No coordinates are sent with this, so a menu will be generated unless ImapMenu is set to none.
menu
Synonymous with map.
referer
Equivalent to the URL of the referring document. Defaults to http://servername/ if no Referer: header was present.
nocontent
Sends a status code of 204 No Content, telling the client to keep the same page displayed. Valid for all but base.
error
Fails with a 500 Server Error. Valid for all but base, but sort of silly for anything but default.

Coordinates

0,0 200,200
A coordinate consists of an x and a y value separated by a comma. The coordinates are separated from each other by whitespace. To accommodate the way Lynx handles imagemaps, should a user select the coordinate 0,0, it is as if no coordinate had been selected.

Quoted Text

"Menu Text"

After the value or after the coordinates, the line optionally may contain text within double quotes. This string is used as the text for the link if a menu is generated:

<a href="http://example.com/">Menu text</a>

If no quoted text is present, the name of the link will be used as the text:

<a href="http://example.com/">http://example.com</a>

If you want to use double quotes within this text, you have to write them as &quot;.

Example Mapfile

#Comments are printed in a 'formatted' or 'semiformatted' menu.
#And can contain html tags. <hr>
base referer
poly map "Could I have a menu, please?" 0,0 0,10 10,10 10,0
rect .. 0,0 77,27 "the directory of the referer"
circle http://www.inetnebr.example.com/lincoln/feedback/ 195,0 305,27
rect another_file "in same directory as referer" 306,0 419,27
point http://www.zyzzyva.example.com/ 100,100
point http://www.tripod.example.com/ 200,200
rect mailto:nate@tripod.example.com 100,150 200,0 "Bugs?"

Referencing your mapfile

HTML example

<a href="/maps/imagemap1.map">
<img ismap src="/images/imagemap1.gif">
 </a>

XHTML example

<a href="/maps/imagemap1.map">
<img ismap="ismap" src="/images/imagemap1.gif" />
 </a>

ImapBase Directive

Description: | Default base for imagemap files
Syntax: | ImapBase map|referer|URL
Default: | ImapBase http://servername/
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Base
Module: | mod_imagemap

The ImapBase directive sets the default base used in the imagemap files. Its value is overridden by a base directive within the imagemap file. If not present, the base defaults to http://servername/.

See also

  • UseCanonicalName

ImapDefault Directive

Description: | Default action when an imagemap is called with coordinates that are not explicitly mapped
Syntax: | ImapDefault error|nocontent|map|referer|URL
Default: | ImapDefault nocontent
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Base
Module: | mod_imagemap

The ImapDefault directive sets the default default used in the imagemap files. Its value is overridden by a default directive within the imagemap file. If not present, the default action is nocontent, which means that a 204 No Content is sent to the client. In this case, the client should continue to display the original page.

ImapMenu Directive

Description: | Action if no coordinates are given when calling an imagemap
Syntax: | ImapMenu none|formatted|semiformatted|unformatted
Context: | server config, virtual host, directory, .htaccess
Override: | Indexes
Status: | Base
Module: | mod_imagemap

The ImapMenu directive determines the action taken if an imagemap file is called without valid coordinates.

none
If ImapMenu is none, no menu is generated, and the default action is performed.
formatted
A formatted menu is the simplest menu. Comments in the imagemap file are ignored. A level one header is printed, then an hrule, then the links each on a separate line. The menu has a consistent, plain look close to that of a directory listing.
semiformatted
In the semiformatted menu, comments are printed where they occur in the imagemap file. Blank lines are turned into HTML breaks. No header or hrule is printed, but otherwise the menu is the same as a formatted menu.
unformatted
Comments are printed, blank lines are ignored. Nothing is printed that does not appear in the imagemap file. All breaks and headers must be included as comments in the imagemap file. This gives you the most flexibility over the appearance of your menus, but requires you to treat your map files as HTML instead of plaintext.


mod_include - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_include

Description: | Server-parsed html documents (Server Side Includes)
Status: | Base
Module Identifier: | include_module
Source File: | mod_include.c
Compatibility: | Implemented as an output filter since Apache 2.0

Summary

This module provides a filter which will process files before they are sent to the client. The processing is controlled by specially formatted SGML comments, referred to as elements. These elements allow conditional text, the inclusion of other files or programs, as well as the setting and printing of environment variables.

See also

  • Options
  • AcceptPathInfo
  • Filters
  • SSI Tutorial

Enabling Server-Side Includes

Server Side Includes are implemented by the INCLUDES filter. If documents containing server-side include directives are given the extension .shtml, the following directives will make Apache parse them and assign the resulting document the mime type of text/html:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

The following directive must be given for the directories containing the shtml files (typically in a <Directory> section, but this directive is also valid in .htaccess files if AllowOverride Options is set):

Options +Includes

For backwards compatibility, the server-parsed handler also activates the INCLUDES filter. As well, Apache will activate the INCLUDES filter for any document with mime type text/x-server-parsed-html or text/x-server-parsed-html3 (and the resulting output will have the mime type text/html).

For more information, see our Tutorial on Server Side Includes.

PATH_INFO with Server Side Includes

Files processed for server-side includes no longer accept requests with PATH_INFO (trailing pathname information) by default. You can use the AcceptPathInfo directive to configure the server to accept requests with PATH_INFO.

Basic Elements

The document is parsed as an HTML document, with special commands embedded as SGML comments. A command has the syntax:

<!--#element attribute=value attribute=value ... -->

The value will often be enclosed in double quotes, but single quotes (') and backticks (`) are also possible. Many commands only allow a single attribute-value pair. Note that the comment terminator (-->) should be preceded by whitespace to ensure that it isn't considered part of an SSI token. Note that the leading <!--# is one token and may not contain any whitespaces.

The allowed elements are listed in the following table:

Element | Description
config | configure output formats
echo | print variables
exec | execute external programs
fsize | print size of a file
flastmod | print last modification time of a file
include | include a file
printenv | print all available variables
set | set a value of a variable

SSI elements may be defined by modules other than mod_include. In fact, the exec element is provided by mod_cgi, and will only be available if this module is loaded.

The config Element

This command controls various aspects of the parsing. The valid attributes are:

echomsg (Apache 2.1 and later)
The value is a message that is sent back to the client if the echo element attempts to echo an undefined variable. This overrides any SSIUndefinedEcho directives.
errmsg
The value is a message that is sent back to the client if an error occurs while parsing the document. This overrides any SSIErrorMsg directives.
sizefmt
The value sets the format to be used when displaying the size of a file. Valid values are bytes for a count in bytes, or abbrev for a count in Kb or Mb as appropriate, for example a size of 1024 bytes will be printed as "1K".
timefmt
The value is a string to be used by the strftime(3) library routine when printing dates.

The echo Element

This command prints one of the include variables defined below. If the variable is unset, the result is determined by the SSIUndefinedEcho directive. Any dates printed are subject to the currently configured timefmt.

Attributes:

var
The value is the name of the variable to print.
encoding

Specifies how Apache should encode special characters contained in the variable before outputting them. If set to none, no encoding will be done. If set to url, then URL encoding (also known as %-encoding; this is appropriate for use within URLs in links, etc.) will be performed. At the start of an echo element, the default is set to entity, resulting in entity encoding (which is appropriate in the context of a block-level HTML element, e.g. a paragraph of text). This can be changed by adding an encoding attribute, which will remain in effect until the next encoding attribute is encountered or the element ends, whichever comes first.

The encoding attribute must precede the corresponding var attribute to be effective, and only special characters as defined in the ISO-8859-1 character encoding will be encoded. This encoding process may not have the desired result if a different character encoding is in use.

In order to avoid cross-site scripting issues, you should always encode user supplied data.

The exec Element

The exec command executes a given shell command or CGI script. It requires mod_cgi to be present in the server. If Options IncludesNOEXEC is set, this command is completely disabled. The valid attributes are:

cgi

The value specifies a (%-encoded) URL-path to the CGI script. If the path does not begin with a slash (/), then it is taken to be relative to the current document. The document referenced by this path is invoked as a CGI script, even if the server would not normally recognize it as such. However, the directory containing the script must be enabled for CGI scripts (with ScriptAlias or Options ExecCGI).

The CGI script is given the PATH_INFO and query string (QUERY_STRING) of the original request from the client; these cannot be specified in the URL path. The include variables will be available to the script in addition to the standard CGI environment.

Example

<!--#exec cgi="/cgi-bin/example.cgi" -->

If the script returns a Location: header instead of output, then this will be translated into an HTML anchor.

The include virtual element should be used in preference to exec cgi. In particular, if you need to pass additional arguments to a CGI program, using the query string, this cannot be done with exec cgi, but can be done with include virtual, as shown here:

<!--#include virtual="/cgi-bin/example.cgi?argument=value" -->

cmd

The server will execute the given string using /bin/sh. The include variables are available to the command, in addition to the usual set of CGI variables.

The use of #include virtual is almost always prefered to using either #exec cgi or #exec cmd. The former (#include virtual) uses the standard Apache sub-request mechanism to include files or scripts. It is much better tested and maintained.

In addition, on some platforms, like Win32, and on unix when using suexec, you cannot pass arguments to a command in an exec directive, or otherwise include spaces in the command. Thus, while the following will work under a non-suexec configuration on unix, it will not produce the desired result under Win32, or when running suexec:

<!--#exec cmd="perl /path/to/perlscript arg1 arg2" -->

The fsize Element

This command prints the size of the specified file, subject to the sizefmt format specification. Attributes:

file
The value is a path relative to the directory containing the current document being parsed.
virtual
The value is a (%-encoded) URL-path. If it does not begin with a slash (/) then it is taken to be relative to the current document. Note, that this does not print the size of any CGI output, but the size of the CGI script itself.

The flastmod Element

This command prints the last modification date of the specified file, subject to the timefmt format specification. The attributes are the same as for the fsize command.

The include Element

This command inserts the text of another document or file into the parsed file. Any included file is subject to the usual access control. If the directory containing the parsed file has Options IncludesNOEXEC set, then only documents with a text MIME-type (text/plain, text/html etc.) will be included. Otherwise CGI scripts are invoked as normal using the complete URL given in the command, including any query string.

An attribute defines the location of the document; the inclusion is done for each attribute given to the include command. The valid attributes are:

file
The value is a path relative to the directory containing the current document being parsed. It cannot contain ../, nor can it be an absolute path. Therefore, you cannot include files that are outside of the document root, or above the current document in the directory structure. The virtual attribute should always be used in preference to this one.
virtual

The value is a (%-encoded) URL-path. The URL cannot contain a scheme or hostname, only a path and an optional query string. If it does not begin with a slash (/) then it is taken to be relative to the current document.

A URL is constructed from the attribute, and the output the server would return if the URL were accessed by the client is included in the parsed output. Thus included files can be nested.

If the specified URL is a CGI program, the program will be executed and its output inserted in place of the directive in the parsed file. You may include a query string in a CGI url:

<!--#include virtual="/cgi-bin/example.cgi?argument=value" -->

include virtual should be used in preference to exec cgi to include the output of CGI programs into an HTML document.

The printenv Element

This prints out a listing of all existing variables and their values. Special characters are entity encoded (see the echo element for details) before being output. There are no attributes.

Example

<!--#printenv -->

The set Element

This sets the value of a variable. Attributes:

var
The name of the variable to set.
value
The value to give a variable.

Example

<!--#set var="category" value="help" -->

Include Variables

In addition to the variables in the standard CGI environment, these are available for the echo command, for if and elif, and to any program invoked by the document.

DATE_GMT
The current date in Greenwich Mean Time.
DATE_LOCAL
The current date in the local time zone.
DOCUMENT_NAME
The filename (excluding directories) of the document requested by the user.
DOCUMENT_URI
The (%-decoded) URL path of the document requested by the user. Note that in the case of nested include files, this is not the URL for the current document. Note also that if the URL is modified internally (e.g. by an alias or directoryindex), the modified URL is shown.
LAST_MODIFIED
The last modification date of the document requested by the user.
QUERY_STRING_UNESCAPED
If a query string is present, this variable contains the (%-decoded) query string, which is escaped for shell usage (special characters like & etc. are preceded by backslashes).

Variable Substitution

Variable substitution is done within quoted strings in most cases where they may reasonably occur as an argument to an SSI directive. This includes the config, exec, flastmod, fsize, include, echo, and set directives, as well as the arguments to conditional operators. You can insert a literal dollar sign into the string using backslash quoting:

<!--#if expr="$a = \$test" -->

If a variable reference needs to be substituted in the middle of a character sequence that might otherwise be considered a valid identifier in its own right, it can be disambiguated by enclosing the reference in braces, a la shell substitution:

<!--#set var="Zed" value="${REMOTE_HOST}_${REQUEST_METHOD}" -->

This will result in the Zed variable being set to "X_Y" if REMOTE_HOST is "X" and REQUEST_METHOD is "Y".

The below example will print "in foo" if the DOCUMENT_URI is /foo/file.html, "in bar" if it is /bar/file.html and "in neither" otherwise:

<!--#if expr='"$DOCUMENT_URI" = "/foo/file.html"' -->
in foo
 <!--#elif expr='"$DOCUMENT_URI" = "/bar/file.html"' -->
in bar
 <!--#else -->
in neither
 <!--#endif -->

Flow Control Elements

The basic flow control elements are:

<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->

The if element works like an if statement in a programming language. The test condition is evaluated and if the result is true, then the text until the next elif, else or endif element is included in the output stream.

The elif or else statements are used to put text into the output stream if the original test_condition was false. These elements are optional.

The endif element ends the if element and is required.

test_condition is one of the following:

string
true if string is not empty
-A string

true if the URL represented by the string is accessible by configuration, false otherwise. This test only has an effect if SSIEnableAccess is on. This is useful where content on a page is to be hidden from users who are not authorized to view the URL, such as a link to that URL. Note that the URL is only tested for whether access would be granted, not whether the URL exists.

Example

<!--#if expr="-A /private" -->
Click <a href="/private">here</a> to access private information.
 <!--#endif -->

string1 = string2
string1 == string2
string1 != string2

Compare string1 with string2. If string2 has the form /string2/ then it is treated as a regular expression. Regular expressions are implemented by the PCRE engine and have the same syntax as those in perl 5. Note that == is just an alias for = and behaves exactly the same way.

If you are matching positive (= or ==), you can capture grouped parts of the regular expression. The captured parts are stored in the special variables $1 .. $9.

Example

<!--#if expr="$QUERY_STRING = /^sid=([a-zA-Z0-9]+)/" -->
<!--#set var="session" value="$1" -->
 <!--#endif -->

string1 < string2
string1 <= string2
string1 > string2
string1 >= string2
Compare string1 with string2. Note, that strings are compared literally (using strcmp(3)). Therefore the string "100" is less than "20".
( test_condition )
true if test_condition is true
! test_condition
true if test_condition is false
test_condition1 && test_condition2
true if both test_condition1 and test_condition2 are true
test_condition1 || test_condition2
true if either test_condition1 or test_condition2 is true

"=" and "!=" bind more tightly than "&&" and "||". "!" binds most tightly. Thus, the following are equivalent:

<!--#if expr="$a = test1 && $b = test2" -->
<!--#if expr="($a = test1) && ($b = test2)" -->

The boolean operators && and || share the same priority. So if you want to bind such an operator more tightly, you should use parentheses.

Anything that's not recognized as a variable or an operator is treated as a string. Strings can also be quoted: 'string'. Unquoted strings can't contain whitespace (blanks and tabs) because it is used to separate tokens such as variables. If multiple strings are found in a row, they are concatenated using blanks. So,

string1    string2 results in string1 string2

and

'string1    string2' results in string1    string2.

Optimization of Boolean Expressions

If the expressions become more complex and slow down processing significantly, you can try to optimize them according to the evaluation rules:

  • Expressions are evaluated from left to right
  • Binary boolean operators (&& and ||) are short circuited wherever possible. In conclusion with the rule above that means, mod_include evaluates at first the left expression. If the left result is sufficient to determine the end result, processing stops here. Otherwise it evaluates the right side and computes the end result from both left and right results.
  • Short circuit evaluation is turned off as long as there are regular expressions to deal with. These must be evaluated to fill in the backreference variables ($1 .. $9).

If you want to look how a particular expression is handled, you can recompile mod_include using the -DDEBUG_INCLUDE compiler option. This inserts for every parsed expression tokenizer information, the parse tree and how it is evaluated into the output sent to the client.

Escaping slashes in regex strings

All slashes which are not intended to act as delimiters in your regex must be escaped. This is regardless of their meaning to the regex engine.

SSIEnableAccess Directive

Description: | Enable the -A flag during conditional flow control processing.
Syntax: | SSIEnableAccess on|off
Default: | SSIEnableAccess off
Context: | directory, .htaccess
Status: | Base
Module: | mod_include

The SSIEnableAccess directive controls whether the -A test is enabled during conditional flow control processing. SSIEnableAccess can take on the following values:

off
<!--#if expr="-A /foo"--> will be interpreted as a series of string and regular expression tokens, the -A has no special meaning.
on
<!--#if expr="-A /foo"--> will evaluate to false if the URL /foo is inaccessible by configuration, or true otherwise.

SSIEndTag Directive

Description: | String that ends an include element
Syntax: | SSIEndTag tag
Default: | SSIEndTag "-->"
Context: | server config, virtual host
Status: | Base
Module: | mod_include
Compatibility: | Available in version 2.0.30 and later.

This directive changes the string that mod_include looks for to mark the end of an include element.

Example

SSIEndTag "%>"

See also

  • SSIStartTag

SSIErrorMsg Directive

Description: | Error message displayed when there is an SSI error
Syntax: | SSIErrorMsg message
Default: | SSIErrorMsg "[an error occurred while processing this directive]"
Context: | server config, virtual host, directory, .htaccess
Override: | All
Status: | Base
Module: | mod_include
Compatibility: | Available in version 2.0.30 and later.

The SSIErrorMsg directive changes the error message displayed when mod_include encounters an error. For production servers you may consider changing the default error message to "<!-- Error -->" so that the message is not presented to the user.

This directive has the same effect as the <!--#config errmsg=message --> element.

Example

SSIErrorMsg "<!-- Error -->"

SSIETag Directive

Description: | Controls whether ETags are generated by the server.
Syntax: | SSIETag on|off
Default: | SSIETag off
Context: | directory, .htaccess
Status: | Base
Module: | mod_include
Compatibility: | Available in version 2.2.15 and later.

Under normal circumstances, a file filtered by mod_include may contain elements that are either dynamically generated, or that may have changed independently of the original file. As a result, by default the server is asked not to generate an ETag header for the response by adding no-etag to the request notes.

The SSIETag directive suppresses this behaviour, and allows the server to generate an ETag header. This can be used to enable caching of the output. Note that a backend server or dynamic content generator may generate an ETag of its own, ignoring no-etag, and this ETag will be passed by mod_include regardless of the value of this setting. SSIETag can take on the following values:

off
no-etag will be added to the request notes, and the server is asked not to generate an ETag. Where a server ignores the value of no-etag and generates an ETag anyway, the ETag will be respected.
on
Existing ETags will be respected, and ETags generated by the server will be passed on in the response.

SSILastModified Directive

Description: | Controls whether Last-Modified headers are generated by the server.
Syntax: | SSILastModified on|off
Default: | SSILastModified off
Context: | directory, .htaccess
Status: | Base
Module: | mod_include
Compatibility: | Available in version 2.2.15 and later.

Under normal circumstances, a file filtered by mod_include may contain elements that are either dynamically generated, or that may have changed independently of the original file. As a result, by default the Last-Modified header is stripped from the response.

The SSILastModified directive overrides this behaviour, and allows the Last-Modified header to be respected if already present, or set if the header is not already present. This can be used to enable caching of the output. SSILastModified can take on the following values:

off
The Last-Modified header will be stripped from responses, unless the XBitHack directive is set to full as described below.
on
The Last-Modified header will be respected if already present in a response, and added to the response if the response is a file and the header is missing. The SSILastModified directive takes precedence over XBitHack.

SSIStartTag Directive

Description: | String that starts an include element
Syntax: | SSIStartTag tag
Default: | SSIStartTag "<!--#"
Context: | server config, virtual host
Status: | Base
Module: | mod_include
Compatibility: | Available in version 2.0.30 and later.

This directive changes the string that mod_include looks for to mark an include element to process.

You may want to use this option if you have 2 servers parsing the output of a file each processing different commands (possibly at different times).

Example

SSIStartTag "<%"
SSIEndTag "%>"

The example given above, which also specifies a matching SSIEndTag, will allow you to use SSI directives as shown in the example below:

SSI directives with alternate start and end tags

<%printenv %>

See also

  • SSIEndTag

SSITimeFormat Directive

Description: | Configures the format in which date strings are displayed
Syntax: | SSITimeFormat formatstring
Default: | SSITimeFormat "%A, %d-%b-%Y %H:%M:%S %Z"
Context: | server config, virtual host, directory, .htaccess
Override: | All
Status: | Base
Module: | mod_include
Compatibility: | Available in version 2.0.30 and later.

This directive changes the format in which date strings are displayed when echoing DATE environment variables. The formatstring is as in strftime(3) from the C standard library.

This directive has the same effect as the <!--#config timefmt=formatstring --> element.

Example

SSITimeFormat "%R, %B %d, %Y"

The above directive would cause times to be displayed in the format "22:26, June 14, 2002".

SSIUndefinedEcho Directive

Description: | String displayed when an unset variable is echoed
Syntax: | SSIUndefinedEcho string
Default: | SSIUndefinedEcho "(none)"
Context: | server config, virtual host, directory, .htaccess
Override: | All
Status: | Base
Module: | mod_include
Compatibility: | Available in version 2.0.34 and later.

This directive changes the string that mod_include displays when a variable is not set and "echoed".

Example

SSIUndefinedEcho "<!-- undef -->"

XBitHack Directive

Description: | Parse SSI directives in files with the execute bit set
Syntax: | XBitHack on|off|full
Default: | XBitHack off
Context: | server config, virtual host, directory, .htaccess
Override: | Options
Status: | Base
Module: | mod_include

The XBitHack directive controls the parsing of ordinary html documents. This directive only affects files associated with the MIME-type text/html. XBitHack can take on the following values:

off
No special treatment of executable files.
on
Any text/html file that has the user-execute bit set will be treated as a server-parsed html document.
full
As for on but also test the group-execute bit. If it is set, then set the Last-modified date of the returned file to be the last modified time of the file. If it is not set, then no last-modified date is sent. Setting this bit allows clients and proxies to cache the result of the request.

Note

You would not want to use the full option, unless you assure the group-execute bit is unset for every SSI script which might #include a CGI or otherwise produces different output on each hit (or could potentially change on subsequent requests).

The SSILastModified directive takes precedence over the XBitHack directive when SSILastModified is set to on.


mod_info - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_info

Description: | Provides a comprehensive overview of the server configuration
Status: | Extension
Module Identifier: | info_module
Source File: | mod_info.c

Summary

To configure mod_info, add the following to your httpd.conf file.

<Location /server-info>
SetHandler server-info
 </Location>

You may wish to use mod_authz_host inside the <Location> directive to limit access to your server configuration information:

<Location /server-info>
SetHandler server-info
Order deny,allow
Deny from all
Allow from yourcompany.com
 </Location>

Once configured, the server information is obtained by accessing http://your.host.example.com/server-info

Security Issues

Once mod_info is loaded into the server, its handler capability is available in all configuration files, including per-directory files (e.g., .htaccess). This may have security-related ramifications for your site.

In particular, this module can leak sensitive information from the configuration directives of other Apache modules such as system paths, usernames/passwords, database names, etc. Therefore, this module should only be used in a controlled environment and always with caution.

You will probably want to use mod_authz_host to limit access to your server configuration information.

Access control

<Location /server-info>
SetHandler server-info
Order allow,deny
# Allow access from server itself
Allow from 127.0.0.1
# Additionally, allow access from local workstation
Allow from 192.168.1.17
 </Location>

Selecting the information shown

By default, the server information includes a list of all enabled modules, and for each module, a description of the directives understood by that module, the hooks implemented by that module, and the relevant directives from the current configuration.

Other views of the configuration information are available by appending a query to the server-info request. For example, http://your.host.example.com/server-info?config will show all configuration directives.

?<module-name>
Only information relevant to the named module
?config
Just the configuration directives, not sorted by module
?hooks
Only the list of Hooks each module is attached to
?list
Only a simple list of enabled modules
?server
Only the basic server information

Known Limitations

mod_info provides its information by reading the parsed configuration, rather than reading the original configuration file. There are a few limitations as a result of the way the parsed configuration tree is created:

  • Directives which are executed immediately rather than being stored in the parsed configuration are not listed. These include ServerRoot, LoadModule, and LoadFile.
  • Directives which control the configuration file itself, such as Include, <IfModule> and <IfDefine> are not listed, but the included configuration directives are.
  • Comments are not listed. (This may be considered a feature.)
  • Configuration directives from .htaccess files are not listed (since they do not form part of the permanent server configuration).
  • Container directives such as <Directory> are listed normally, but mod_info cannot figure out the line number for the closing </Directory>.
  • Directives generated by third party modules such as mod_perl might not be listed.

AddModuleInfo Directive

Description: | Adds additional information to the module information displayed by the server-info handler
Syntax: | AddModuleInfo module-name string
Context: | server config, virtual host
Status: | Extension
Module: | mod_info
Compatibility: | Apache 1.3 and above

This allows the content of string to be shown as HTML interpreted, Additional Information for the module module-name. Example:

AddModuleInfo mod_deflate.c 'See <a \
href="http://www.apache.org/docs/2.2/mod/mod_deflate.html">\
http://www.apache.org/docs/2.2/mod/mod_deflate.html</a>'


mod_isapi - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_isapi

Description: | ISAPI Extensions within Apache for Windows
Status: | Base
Module Identifier: | isapi_module
Source File: | mod_isapi.c
Compatibility: | Win32 only

Summary

This module implements the Internet Server extension API. It allows Internet Server extensions (e.g. ISAPI .dll modules) to be served by Apache for Windows, subject to the noted restrictions.

ISAPI extension modules (.dll files) are written by third parties. The Apache Group does not author these modules, so we provide no support for them. Please contact the ISAPI's author directly if you are experiencing problems running their ISAPI extension. Please do not post such problems to Apache's lists or bug reporting pages.

Usage

In the server configuration file, use the AddHandler directive to associate ISAPI files with the isapi-handler handler, and map it to them with their file extensions. To enable any .dll file to be processed as an ISAPI extension, edit the httpd.conf file and add the following line:

AddHandler isapi-handler .dll

In older versions of the Apache server, isapi-isa was the proper handler name, rather than isapi-handler. For compatibility, configurations may continue using isapi-isa through all versions of Apache prior to 2.3.0.

There is no capability within the Apache server to leave a requested module loaded. However, you may preload and keep a specific module loaded by using the following syntax in your httpd.conf:

ISAPICacheFile c:/WebWork/Scripts/ISAPI/mytest.dll

Whether or not you have preloaded an ISAPI extension, all ISAPI extensions are governed by the same permissions and restrictions as CGI scripts. That is, Options ExecCGI must be set for the directory that contains the ISAPI .dll file.

Review the Additional Notes and the Programmer's Journal for additional details and clarification of the specific ISAPI support offered by mod_isapi.

Additional Notes

Apache's ISAPI implementation conforms to all of the ISAPI 2.0 specification, except for some "Microsoft-specific" extensions dealing with asynchronous I/O. Apache's I/O model does not allow asynchronous reading and writing in a manner that the ISAPI could access. If an ISA tries to access unsupported features, including async I/O, a message is placed in the error log to help with debugging. Since these messages can become a flood, the directive ISAPILogNotSupported Off exists to quiet this noise.

Some servers, like Microsoft IIS, load the ISAPI extension into the server and keep it loaded until memory usage is too high, or unless configuration options are specified. Apache currently loads and unloads the ISAPI extension each time it is requested, unless the ISAPICacheFile directive is specified. This is inefficient, but Apache's memory model makes this the most effective method. Many ISAPI modules are subtly incompatible with the Apache server, and unloading these modules helps to ensure the stability of the server.

Also, remember that while Apache supports ISAPI Extensions, it does not support ISAPI Filters. Support for filters may be added at a later date, but no support is planned at this time.

Programmer's Journal

If you are programming Apache 2.0 mod_isapi modules, you must limit your calls to ServerSupportFunction to the following directives:

HSE_REQ_SEND_URL_REDIRECT_RESP
Redirect the user to another location.
This must be a fully qualified URL (e.g. http://server/location).
HSE_REQ_SEND_URL
Redirect the user to another location.
This cannot be a fully qualified URL, you are not allowed to pass the protocol or a server name (e.g. simply /location).
This redirection is handled by the server, not the browser.

Warning

In their recent documentation, Microsoft appears to have abandoned the distinction between the two HSE_REQ_SEND_URL functions. Apache continues to treat them as two distinct functions with different requirements and behaviors.

HSE_REQ_SEND_RESPONSE_HEADER
Apache accepts a response body following the header if it follows the blank line (two consecutive newlines) in the headers string argument. This body cannot contain NULLs, since the headers argument is NULL terminated.
HSE_REQ_DONE_WITH_SESSION
Apache considers this a no-op, since the session will be finished when the ISAPI returns from processing.
HSE_REQ_MAP_URL_TO_PATH
Apache will translate a virtual name to a physical name.
HSE_APPEND_LOG_PARAMETER
This logged message may be captured in any of the following logs:
  • in the \"%{isapi-parameter}n\" component in a CustomLog directive
  • in the %q log component with the ISAPIAppendLogToQuery On directive
  • in the error log with the ISAPIAppendLogToErrors On directive

The first option, the %{isapi-parameter}n component, is always available and preferred.

HSE_REQ_IS_KEEP_CONN
Will return the negotiated Keep-Alive status.
HSE_REQ_SEND_RESPONSE_HEADER_EX
Will behave as documented, although the fKeepConn flag is ignored.
HSE_REQ_IS_CONNECTED
Will report false if the request has been aborted.

Apache returns FALSE to any unsupported call to ServerSupportFunction, and sets the GetLastError value to ERROR_INVALID_PARAMETER.

ReadClient retrieves the request body exceeding the initial buffer (defined by ISAPIReadAheadBuffer). Based on the ISAPIReadAheadBuffer setting (number of bytes to buffer prior to calling the ISAPI handler) shorter requests are sent complete to the extension when it is invoked. If the request is longer, the ISAPI extension must use ReadClient to retrieve the remaining request body.

WriteClient is supported, but only with the HSE_IO_SYNC flag or no option flag (value of 0). Any other WriteClient request will be rejected with a return value of FALSE, and a GetLastError value of ERROR_INVALID_PARAMETER.

GetServerVariable is supported, although extended server variables do not exist (as defined by other servers.) All the usual Apache CGI environment variables are available from GetServerVariable, as well as the ALL_HTTP and ALL_RAW values.

Apache 2.0 mod_isapi supports additional features introduced in later versions of the ISAPI specification, as well as limited emulation of async I/O and the TransmitFile semantics. Apache also supports preloading ISAPI .dlls for performance, neither of which were not available under Apache 1.3 mod_isapi.

ISAPIAppendLogToErrors Directive

Description: | Record HSE_APPEND_LOG_PARAMETER requests from ISAPI extensions to the error log
Syntax: | ISAPIAppendLogToErrors on|off
Default: | ISAPIAppendLogToErrors off
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_isapi

Record HSE_APPEND_LOG_PARAMETER requests from ISAPI extensions to the server error log.

ISAPIAppendLogToQuery Directive

Description: | Record HSE_APPEND_LOG_PARAMETER requests from ISAPI extensions to the query field
Syntax: | ISAPIAppendLogToQuery on|off
Default: | ISAPIAppendLogToQuery on
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_isapi

Record HSE_APPEND_LOG_PARAMETER requests from ISAPI extensions to the query field (appended to the CustomLog %q component).

ISAPICacheFile Directive

Description: | ISAPI .dll files to be loaded at startup
Syntax: | ISAPICacheFile file-path [file-path] ...
Context: | server config, virtual host
Status: | Base
Module: | mod_isapi

Specifies a space-separated list of file names to be loaded when the Apache server is launched, and remain loaded until the server is shut down. This directive may be repeated for every ISAPI .dll file desired. The full path name of each file should be specified. If the path name is not absolute, it will be treated relative to ServerRoot.

ISAPIFakeAsync Directive

Description: | Fake asynchronous support for ISAPI callbacks
Syntax: | ISAPIFakeAsync on|off
Default: | ISAPIFakeAsync off
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_isapi

While set to on, asynchronous support for ISAPI callbacks is simulated.

ISAPILogNotSupported Directive

Description: | Log unsupported feature requests from ISAPI extensions
Syntax: | ISAPILogNotSupported on|off
Default: | ISAPILogNotSupported off
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_isapi

Logs all requests for unsupported features from ISAPI extensions in the server error log. This may help administrators to track down problems. Once set to on and all desired ISAPI modules are functioning, it should be set back to off.

ISAPIReadAheadBuffer Directive

Description: | Size of the Read Ahead Buffer sent to ISAPI extensions
Syntax: | ISAPIReadAheadBuffer size
Default: | ISAPIReadAheadBuffer 49152
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_isapi

Defines the maximum size of the Read Ahead Buffer sent to ISAPI extensions when they are initially invoked. All remaining data must be retrieved using the ReadClient callback; some ISAPI extensions may not support the ReadClient function. Refer questions to the ISAPI extension's author.


mod_ldap - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_ldap

Description: | LDAP connection pooling and result caching services for use by other LDAP modules
Status: | Extension
Module Identifier: | ldap_module
Source File: | util_ldap.c
Compatibility: | Available in version 2.0.41 and later

Summary

This module was created to improve the performance of websites relying on backend connections to LDAP servers. In addition to the functions provided by the standard LDAP libraries, this module adds an LDAP connection pool and an LDAP shared memory cache.

To enable this module, LDAP support must be compiled into apr-util. This is achieved by adding the --with-ldap flag to the configure script when building Apache.

SSL/TLS support is dependent on which LDAP toolkit has been linked to APR. As of this writing, APR-util supports: OpenLDAP SDK (2.x or later), Novell LDAP SDK, Mozilla LDAP SDK, native Solaris LDAP SDK (Mozilla based), native Microsoft LDAP SDK, or the iPlanet (Netscape) SDK. See the APR website for details.

Example Configuration

The following is an example configuration that uses mod_ldap to increase the performance of HTTP Basic authentication provided by mod_authnz_ldap.

# Enable the LDAP connection pool and shared
# memory cache. Enable the LDAP cache status
# handler. Requires that mod_ldap and mod_authnz_ldap
# be loaded. Change the "yourdomain.example.com" to
# match your domain.

LDAPSharedCacheSize 500000
LDAPCacheEntries 1024
LDAPCacheTTL 600
LDAPOpCacheEntries 1024
LDAPOpCacheTTL 600

<Location /ldap-status>
SetHandler ldap-status
Order deny,allow
Deny from all
Allow from yourdomain.example.com
AuthLDAPURL ldap://127.0.0.1/dc=example,dc=com?uid?one
AuthzLDAPAuthoritative off
Require valid-user
 </Location>

LDAP Connection Pool

LDAP connections are pooled from request to request. This allows the LDAP server to remain connected and bound ready for the next request, without the need to unbind/connect/rebind. The performance advantages are similar to the effect of HTTP keepalives.

On a busy server it is possible that many requests will try and access the same LDAP server connection simultaneously. Where an LDAP connection is in use, Apache will create a new connection alongside the original one. This ensures that the connection pool does not become a bottleneck.

There is no need to manually enable connection pooling in the Apache configuration. Any module using this module for access to LDAP services will share the connection pool.

LDAP Cache

For improved performance, mod_ldap uses an aggressive caching strategy to minimize the number of times that the LDAP server must be contacted. Caching can easily double or triple the throughput of Apache when it is serving pages protected with mod_authnz_ldap. In addition, the load on the LDAP server will be significantly decreased.

mod_ldap supports two types of LDAP caching during the search/bind phase with a search/bind cache and during the compare phase with two operation caches. Each LDAP URL that is used by the server has its own set of these three caches.

The Search/Bind Cache

The process of doing a search and then a bind is the most time-consuming aspect of LDAP operation, especially if the directory is large. The search/bind cache is used to cache all searches that resulted in successful binds. Negative results (i.e., unsuccessful searches, or searches that did not result in a successful bind) are not cached. The rationale behind this decision is that connections with invalid credentials are only a tiny percentage of the total number of connections, so by not caching invalid credentials, the size of the cache is reduced.

mod_ldap stores the username, the DN retrieved, the password used to bind, and the time of the bind in the cache. Whenever a new connection is initiated with the same username, mod_ldap compares the password of the new connection with the password in the cache. If the passwords match, and if the cached entry is not too old, mod_ldap bypasses the search/bind phase.

The search and bind cache is controlled with the LDAPCacheEntries and LDAPCacheTTL directives.

Operation Caches

During attribute and distinguished name comparison functions, mod_ldap uses two operation caches to cache the compare operations. The first compare cache is used to cache the results of compares done to test for LDAP group membership. The second compare cache is used to cache the results of comparisons done between distinguished names.

The behavior of both of these caches is controlled with the LDAPOpCacheEntries and LDAPOpCacheTTL directives.

Monitoring the Cache

mod_ldap has a content handler that allows administrators to monitor the cache performance. The name of the content handler is ldap-status, so the following directives could be used to access the mod_ldap cache information:

<Location /server/cache-info>
SetHandler ldap-status
 </Location>

By fetching the URL http://servername/cache-info, the administrator can get a status report of every cache that is used by mod_ldap cache. Note that if Apache does not support shared memory, then each httpd instance has its own cache, so reloading the URL will result in different information each time, depending on which httpd instance processes the request.

Using SSL/TLS

The ability to create an SSL and TLS connections to an LDAP server is defined by the directives LDAPTrustedGlobalCert, LDAPTrustedClientCert and LDAPTrustedMode. These directives specify the CA and optional client certificates to be used, as well as the type of encryption to be used on the connection (none, SSL or TLS/STARTTLS).

# Establish an SSL LDAP connection on port 636. Requires that
# mod_ldap and mod_authnz_ldap be loaded. Change the
# "yourdomain.example.com" to match your domain.

LDAPTrustedGlobalCert CA_DER /certs/certfile.der

<Location /ldap-status>
SetHandler ldap-status
Order deny,allow
Deny from all
Allow from yourdomain.example.com
AuthLDAPURL ldaps://127.0.0.1/dc=example,dc=com?uid?one
AuthzLDAPAuthoritative off
Require valid-user
 </Location>

# Establish a TLS LDAP connection on port 389. Requires that
# mod_ldap and mod_authnz_ldap be loaded. Change the
# "yourdomain.example.com" to match your domain.

LDAPTrustedGlobalCert CA_DER /certs/certfile.der

<Location /ldap-status>
SetHandler ldap-status
Order deny,allow
Deny from all
Allow from yourdomain.example.com
AuthLDAPURL ldap://127.0.0.1/dc=example,dc=com?uid?one TLS
AuthzLDAPAuthoritative off
Require valid-user
 </Location>

SSL/TLS Certificates

The different LDAP SDKs have widely different methods of setting and handling both CA and client side certificates.

If you intend to use SSL or TLS, read this section CAREFULLY so as to understand the differences between configurations on the different LDAP toolkits supported.

Netscape/Mozilla/iPlanet SDK

CA certificates are specified within a file called cert7.db. The SDK will not talk to any LDAP server whose certificate was not signed by a CA specified in this file. If client certificates are required, an optional key3.db file may be specified with an optional password. The secmod file can be specified if required. These files are in the same format as used by the Netscape Communicator or Mozilla web browsers. The easiest way to obtain these files is to grab them from your browser installation.

Client certificates are specified per connection using the LDAPTrustedClientCert directive by referring to the certificate "nickname". An optional password may be specified to unlock the certificate's private key.

The SDK supports SSL only. An attempt to use STARTTLS will cause an error when an attempt is made to contact the LDAP server at runtime.

# Specify a Netscape CA certificate file
LDAPTrustedGlobalCert CA_CERT7_DB /certs/cert7.db
# Specify an optional key3.db file for client certificate support
LDAPTrustedGlobalCert CERT_KEY3_DB /certs/key3.db
# Specify the secmod file if required
LDAPTrustedGlobalCert CA_SECMOD /certs/secmod
<Location /ldap-status>
SetHandler ldap-status
Order deny,allow
Deny from all
Allow from yourdomain.example.com
LDAPTrustedClientCert CERT_NICKNAME <nickname> [password]
AuthLDAPURL ldaps://127.0.0.1/dc=example,dc=com?uid?one
AuthzLDAPAuthoritative off
Require valid-user
 </Location>

Novell SDK

One or more CA certificates must be specified for the Novell SDK to work correctly. These certificates can be specified as binary DER or Base64 (PEM) encoded files.

Note: Client certificates are specified globally rather than per connection, and so must be specified with the LDAPTrustedGlobalCert directive as below. Trying to set client certificates via the LDAPTrustedClientCert directive will cause an error to be logged when an attempt is made to connect to the LDAP server..

The SDK supports both SSL and STARTTLS, set using the LDAPTrustedMode parameter. If an ldaps:// URL is specified, SSL mode is forced, override this directive.

# Specify two CA certificate files
LDAPTrustedGlobalCert CA_DER /certs/cacert1.der
LDAPTrustedGlobalCert CA_BASE64 /certs/cacert2.pem
# Specify a client certificate file and key
LDAPTrustedGlobalCert CERT_BASE64 /certs/cert1.pem
LDAPTrustedGlobalCert KEY_BASE64 /certs/key1.pem [password]
# Do not use this directive, as it will throw an error
#LDAPTrustedClientCert CERT_BASE64 /certs/cert1.pem

OpenLDAP SDK

One or more CA certificates must be specified for the OpenLDAP SDK to work correctly. These certificates can be specified as binary DER or Base64 (PEM) encoded files.

Client certificates are specified per connection using the LDAPTrustedClientCert directive.

The documentation for the SDK claims to support both SSL and STARTTLS, however STARTTLS does not seem to work on all versions of the SDK. The SSL/TLS mode can be set using the LDAPTrustedMode parameter. If an ldaps:// URL is specified, SSL mode is forced. The OpenLDAP documentation notes that SSL (ldaps://) support has been deprecated to be replaced with TLS, although the SSL functionality still works.

# Specify two CA certificate files
LDAPTrustedGlobalCert CA_DER /certs/cacert1.der
LDAPTrustedGlobalCert CA_BASE64 /certs/cacert2.pem
<Location /ldap-status>
SetHandler ldap-status
Order deny,allow
Deny from all
Allow from yourdomain.example.com
LDAPTrustedClientCert CERT_BASE64 /certs/cert1.pem
LDAPTrustedClientCert KEY_BASE64 /certs/key1.pem
AuthLDAPURL ldaps://127.0.0.1/dc=example,dc=com?uid?one
AuthzLDAPAuthoritative off
Require valid-user
 </Location>

Solaris SDK

SSL/TLS for the native Solaris LDAP libraries is not yet supported. If required, install and use the OpenLDAP libraries instead.

Microsoft SDK

SSL/TLS certificate configuration for the native Microsoft LDAP libraries is done inside the system registry, and no configuration directives are required.

Both SSL and TLS are supported by using the ldaps:// URL format, or by using the LDAPTrustedMode directive accordingly.

Note: The status of support for client certificates is not yet known for this toolkit.

LDAPCacheEntries Directive

Description: | Maximum number of entries in the primary LDAP cache
Syntax: | LDAPCacheEntries number
Default: | LDAPCacheEntries 1024
Context: | server config
Status: | Extension
Module: | mod_ldap

Specifies the maximum size of the primary LDAP cache. This cache contains successful search/binds. Set it to 0 to turn off search/bind caching. The default size is 1024 cached searches.

LDAPCacheTTL Directive

Description: | Time that cached items remain valid
Syntax: | LDAPCacheTTL seconds
Default: | LDAPCacheTTL 600
Context: | server config
Status: | Extension
Module: | mod_ldap

Specifies the time (in seconds) that an item in the search/bind cache remains valid. The default is 600 seconds (10 minutes).

LDAPConnectionTimeout Directive

Description: | Specifies the socket connection timeout in seconds
Syntax: | LDAPConnectionTimeout seconds
Context: | server config
Status: | Extension
Module: | mod_ldap

This directive configures the LDAP_OPT_NETWORK_TIMEOUT option in the underlying LDAP client library, when available. This value typically controls how long the LDAP client library will wait for the TCP connection to the LDAP server to complete.

If a connection is not successful with the timeout period, either an error will be returned or the LDAP client library will attempt to connect to a secondary LDAP server if one is specified (via a space-separated list of hostnames in the AuthLDAPURL).

The default is 10 seconds, if the LDAP client library linked with the server supports the LDAP_OPT_NETWORK_TIMEOUT option.

LDAPConnectionTimeout is only available when the LDAP client library linked with the server supports the LDAP_OPT_NETWORK_TIMEOUT option, and the ultimate behavior is dictated entirely by the LDAP client library.

LDAPOpCacheEntries Directive

Description: | Number of entries used to cache LDAP compare operations
Syntax: | LDAPOpCacheEntries number
Default: | LDAPOpCacheEntries 1024
Context: | server config
Status: | Extension
Module: | mod_ldap

This specifies the number of entries mod_ldap will use to cache LDAP compare operations. The default is 1024 entries. Setting it to 0 disables operation caching.

LDAPOpCacheTTL Directive

Description: | Time that entries in the operation cache remain valid
Syntax: | LDAPOpCacheTTL seconds
Default: | LDAPOpCacheTTL 600
Context: | server config
Status: | Extension
Module: | mod_ldap

Specifies the time (in seconds) that entries in the operation cache remain valid. The default is 600 seconds.

LDAPSharedCacheFile Directive

Description: | Sets the shared memory cache file
Syntax: | LDAPSharedCacheFile directory-path/filename
Context: | server config
Status: | Extension
Module: | mod_ldap

Specifies the directory path and file name of the shared memory cache file. If not set, anonymous shared memory will be used if the platform supports it.

LDAPSharedCacheSize Directive

Description: | Size in bytes of the shared-memory cache
Syntax: | LDAPSharedCacheSize bytes
Default: | LDAPSharedCacheSize 500000
Context: | server config
Status: | Extension
Module: | mod_ldap

Specifies the number of bytes to allocate for the shared memory cache. The default is 500kb. If set to 0, shared memory caching will not be used.

LDAPTrustedClientCert Directive

Description: | Sets the file containing or nickname referring to a per connection client certificate. Not all LDAP toolkits support per connection client certificates.
Syntax: | LDAPTrustedClientCert type directory-path/filename/nickname [password]
Context: | server config, virtual host, directory, .htaccess
Status: | Extension
Module: | mod_ldap

It specifies the directory path, file name or nickname of a per connection client certificate used when establishing an SSL or TLS connection to an LDAP server. Different locations or directories may have their own independent client certificate settings. Some LDAP toolkits (notably Novell) do not support per connection client certificates, and will throw an error on LDAP server connection if you try to use this directive (Use the LDAPTrustedGlobalCert directive instead for Novell client certificates - See the SSL/TLS certificate guide above for details). The type specifies the kind of certificate parameter being set, depending on the LDAP toolkit being used. Supported types are:

  • CERT_DER - binary DER encoded client certificate
  • CERT_BASE64 - PEM encoded client certificate
  • CERT_NICKNAME - Client certificate "nickname" (Netscape SDK)
  • KEY_DER - binary DER encoded private key
  • KEY_BASE64 - PEM encoded private key

LDAPTrustedGlobalCert Directive

Description: | Sets the file or database containing global trusted Certificate Authority or global client certificates
Syntax: | LDAPTrustedGlobalCert type directory-path/filename [password]
Context: | server config
Status: | Extension
Module: | mod_ldap

It specifies the directory path and file name of the trusted CA certificates and/or system wide client certificates mod_ldap should use when establishing an SSL or TLS connection to an LDAP server. Note that all certificate information specified using this directive is applied globally to the entire server installation. Some LDAP toolkits (notably Novell) require all client certificates to be set globally using this directive. Most other toolkits require clients certificates to be set per Directory or per Location using LDAPTrustedClientCert. If you get this wrong, an error may be logged when an attempt is made to contact the LDAP server, or the connection may silently fail (See the SSL/TLS certificate guide above for details). The type specifies the kind of certificate parameter being set, depending on the LDAP toolkit being used. Supported types are:

  • CA_DER - binary DER encoded CA certificate
  • CA_BASE64 - PEM encoded CA certificate
  • CA_CERT7_DB - Netscape cert7.db CA certificate database file
  • CA_SECMOD - Netscape secmod database file
  • CERT_DER - binary DER encoded client certificate
  • CERT_BASE64 - PEM encoded client certificate
  • CERT_KEY3_DB - Netscape key3.db client certificate database file
  • CERT_NICKNAME - Client certificate "nickname" (Netscape SDK)
  • CERT_PFX - PKCS#12 encoded client certificate (Novell SDK)
  • KEY_DER - binary DER encoded private key
  • KEY_BASE64 - PEM encoded private key
  • KEY_PFX - PKCS#12 encoded private key (Novell SDK)

LDAPTrustedMode Directive

Description: | Specifies the SSL/TLS mode to be used when connecting to an LDAP server.
Syntax: | LDAPTrustedMode type
Context: | server config, virtual host
Status: | Extension
Module: | mod_ldap

The following modes are supported:

  • NONE - no encryption
  • SSL - ldaps:// encryption on default port 636
  • TLS - STARTTLS encryption on default port 389

Not all LDAP toolkits support all the above modes. An error message will be logged at runtime if a mode is not supported, and the connection to the LDAP server will fail.

If an ldaps:// URL is specified, the mode becomes SSL and the setting of LDAPTrustedMode is ignored.

LDAPVerifyServerCert Directive

Description: | Force server certificate verification
Syntax: | LDAPVerifyServerCert On|Off
Default: | LDAPVerifyServerCert On
Context: | server config
Status: | Extension
Module: | mod_ldap

Specifies whether to force the verification of a server certificate when establishing an SSL connection to the LDAP server.


mod_log_config - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_log_config

Bu çeviri güncel olmayabilir. Son değişiklikler için İngilizce sürüm geçerlidir.
Açıklama: | Sunucuya yapılan isteklerin günlük kayıtlarının tutulması
Durum: | Temel
Modül Betimleyici: | log_config_module
Kaynak Dosyası: | mod_log_config.c

Özet

Bu modül istemci isteklerinin esnek şekilde günlüklenmesi ile ilgilidir. Günlükler kişiselleştirilebilir biçemdedir ve doğrudan bir dosyaya yazılabileceği gibi boru üzerinden harici bir sürece de yazılabilir. İsteğin özelliklerine bağlı olarak bazı isteklerin günlüklere kaydedilmesi veya kaydedilmemesi mümkün kılınmıştır.

Bu modül üç yönerge içermektedir: Bir günlük dosyası oluşturmak için TransferLog, günlük biçemini kişiselleştirmek için LogFormat ve tek başına bir günlük dosyasını hem tanımlayıp hem de biçemleyen CustomLog yönergesi. Her isteğin çok sayıda dosyaya günlüklenmesini sağlamak için yapılandırma dosyasında her sunucu için birden fazla TransferLog ve CustomLog yönergesi belirtilebilir.

Ayrıca bakınız:

  • Apache Günlük Dosyaları

Günlük Girdilerinin Kişiselleştirilmesi

LogFormat ve CustomLog yönergelerinin biçem argümanı bir dizgedir. Bu dizge her isteği günlük dosyasına günlüklemek için kullanılır. Doğrudan günlük dosyalarına kopyalanmak üzere dizgesel sabitler içerebileceği gibi satırsonu ve sekme karakterleri olarak C tarzı "\n" ve "\t" denetim karakterlerini de içerebilir. Dizgesel sabit olarak kullanılan tırnak ve tersbölü imlerinin tersbölü ile öncelenmesi gerekir.

İstek özellikleri biçem dizgesine “%” imli belirteçler yerleştirilerek günlüklenir. Bu belirteçler ve anlamları:

Belirteç | Açıklama
%% Yüzde imi
%a | Uzak IP adresi
%A | Yerel IP adresi
%B | HTTP başlıkları hariç, yanıtın bayt cinsinden uzunluğu.
%b | HTTP başlıkları hariç, yanıtın bayt cinsinden uzunluğu. OGB biçeminde hiç bayt gönderilmemişse günlüğe '-' yerine '0' çıktılanır.
%{Fesmekan}C | İstek içinde sunucuya gönderilen Fesmekan çerezinin içeriği. Sadece 0. sürüm çerezler tam olarak desteklenir.
%D | Mikrosaniye cinsinden isteği sunmak için harcanan zaman.
%{FALANCA}e | FALANCA ortam değişkeninin içeriği.
%f | Dosya ismi
%h | Uzak konak
%H | İstek Protokolü
%{Filanca}i | İstekle birlikte sunucuya gönderilen Filanca: başlık satır(lar)ının içeriği. Diğer modüllerde (örn. mod_headers) yapılan değişikliklerden etkilenir. Çok sayıda modülün istek başlığını değişikliğe uğrattığı durumda istek başlığında başta neyin geldiği ile ilgileniyorsanız, başlığı mod_setenvif ile bir ortam değişkenine kopyalayıp yukarıda açıklandığı gibi %{FALANCA}e ile bu değeri günlükte kullanabilirsiniz.
%k | Bu bağlantıda işlenen isteklerin sayısı; yani örneğin, '1' değeri bağlantı kurulduktan sonraki ilk kalıcı bağlantıyı, '2', ikinci bağlantıyı, ..., vb. gösterir; KeepAlive kullanılmışsa değer anlamlıdır; aksi takdirde değer daima (ilk isteği belirten) 0’dır. 2.2.11 sürümünden beri kullanılabilmektedir.
%l | Uzak kullanıcı kimliği (sağlanmışsa, identd üzerinden). mod_ident modülü mevcut ve IdentityCheck yönergesine değer olarak On atanmış olmadıkça bu belirteç için günlüğe tire imi yazılır.
%m | İstek yöntemi
%{Filanca}n | Diğer modüldeki Filanca bilgisinin içeriği.
%{Filanca}o | Yanıttaki Filanca: başlık satır(lar)ının içeriği.
%p | Sunucunun isteği sunduğu meşru port
%{biçem}p | Sunucunun veya istemcinin gerçek portu veya sunucunun isteği sunduğu meşru port. Geçerli biçemler: canonical, local ve remote (anlamları sırasıyla: meşru, yerel ve uzak).
%P | İsteği sunan çocuk sürecin süreç kimliği.
%{biçem}P | İsteği sunan çocuk sürecin süreç kimliği (pid) veya evre kimliği (tid). Geçerli biçemler: pid, tid, hextid. hextid için APR 1.2.0 veya üstü gerekir.
%q | Sorgu dizgesi (bir sorgu dizgesi mevcutsa önüne bir ? eklenir yoksa hiçbir şey eklenmez).
%r | İsteğin ilk satırı.
%R | Yanıt varsa yanıtı üreten eylemci.
%s | Durum. Dahili olarak yönlendirilen istekler için isteğin *özgün* durumudur --- isteğin son durumu için %>s kullanınız.
%t | İsteğin alındığı tarih ve saat (standart ingiliz biçemi).
%{biçem}t | İsteğin alındığı tarih ve saat; biçem strftime(3) biçeminde belirtilmelidir (genelde yerelleştirme amaçlı).
%T | Saniye cinsinden, isteği sunmak için harcanan zaman.
%u | Uzak kullanıcı (kimlik doğrulaması istenmişse vardır; durum kodu (%s) 401 ise yanlış olabilir).
%U | Herhangi bir sorgu dizgesi içermeksizin istenen URL yolu.
%v | İsteği sunan sunucunun meşru sunucu ismi (ServerName).
%V | UseCanonicalName ayarı ile ilgili sunucu ismi.
%X Yanıt tamamlandığında bağlantı durumu:
X = | Yanıt tamamlanmadan bağlantı koptu.
+ = | Yanıt gönderildikten sonra bağlantı canlı kalabilir.
- = | Yanıt gönderildikten sonra bağlantı kapatılacak.

(Apache 1.3’ün son sürümlerinde bu belirteç %c idi fakat geçmişe yönelik olarak %{isim}c ssl sözdizimi ile çelişiyordu.)

%I | İstek ve başlıklar dahil alınan bayt sayısı; sıfır olamaz. Bunu kullanmak için mod_logio etkin olmalıdır.
%O | Başlıklar dahil gönderilen bayt sayısı; sıfır olamaz.Bunu kullanmak için mod_logio etkin olmalıdır.

Değiştiriciler

Belli öğelerin sadece belli durum kodlarıyla ilgili yanıtlarla basılabilmesi için bu durum kodları % iminden hemen sonra virgüllerle ayrılmış olarak yazılabilir. Örneğin, "%400,501{User-agent}i" belirteci, User-agent başlığını sadece 400 ve 501 hatalarında günlüğe kaydeder. Diğer durum kodları için günlüğe "-" yazılır. Durum kodlarını olumsuzlamak için başa bir "!" konabilir. Örneğin, "%!200,304,302{Referer}i" belirteci, 200,304,302 durum kodlarından biriyle dönmeyen tüm istekler için Referer başlığını durum koduyla birlikte günlüğe kaydedecektir.

İsteğin dahili olarak yönlendirilmesinde özgün durumunun mu yoksa son durumunun mu hesaba katılacağı "<" ve ">" değiştiricileri ile belirtilebilir. Öntanımlı olarak %s, %U, %T, %D, ve %r belirteçleri isteğin özgün durumuna bakarken diğerleri son durumuna bakarlar. Bu bakımdan örneğin, %>s belirteci, özgün istekteki kimliği doğrulanmış kullanıcının, dahili olarak kimlik doğrulaması gerekmeyen bir özkaynağa yönlendirilmesi halinde isteğin son durumunu kaydetmekte kullanılabilir.

Bazı Bilgiler

Güvenlik nedeniyle, 2.0.46 sürümünden itibaren %r, %i ve %o belirteçlerinde basılamayan karakterler ve diğer özel karakterler \xhh dizilimleri biçeminde öncelenmektedir. Burada hh yerine karakter numarasının onaltılık gösterimi yazılır. Bir tersbölü ile öncelenmesi gereken " ve \ ile \n, \t gibi C tarzı gösterimler bu kuralın dışındadır. 2.0.46 sürümünün öncesinde bu dizgeler öncelenmezdi ve ham günlük dosyalarıyla çalışırken dikkatli olmak gerekirdi.

2.0 sürümünde 1.3 sürümünün aksine %b ve %B biçem belirteçleri, istemciye gönderilen bayt sayısını değil, HTTP yanıtının bayt sayısını ifade ederdi (bu yanıt, örneğin, SSL kullanıldığında veya bağlantı koptuğunda farklı uzunlukta olur). Artık, ağa gönderilen gerçek bayt sayısını günlüğe kaydetmek için mod_logio modülü tarafından sağlanan %O biçem belirteci kullanılmaktadır.

Dikkat: mod_cache standart bir eylemci olarak değil hızlandırılmış bir eylemci olarak gerçeklenmştir. Bu bakımdan %R biçem dizgesi içerik önbelleklemesi ile ilgili herhangi bir eylemci bilgisi döndürmeyecektir.

Örnekler

Genelde herkesçe kullanılan günlük kaydı biçemleme dizgelerinden bazıları:

Ortak Günlük Biçemi (OGB)
"%h %l %u %t \"%r\" %>s %b"
Sanal Konaklı Ortak Günlük Biçemi
"%v %h %l %u %t \"%r\" %>s %b"
NCSA uzun/birleşik günlük biçemi
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
Referer başlığını içeren günlük biçemi
"%{Referer}i -> %U"
User-agent başlığını içeren günlük biçemi
"%{User-agent}i"

Güvenlik Kaygıları

Günlük dosyarının kaydedildiği dizine sunucuyu başlatan kullanıcı dışında diğer kullanıcılar tarafından yazılabiliyor olması halinde güvenliğinizden nasıl feragat etmiş olacağınız güvenlik ipuçları belgesinde açıklanmıştır.

BufferedLogs Yönergesi

Açıklama: | Günlük girdilerini diske yazmadan önce bellekte tamponlar
Sözdizimi: | BufferedLogs On|Off
Öntanımlı: | BufferedLogs Off
Bağlam: | sunucu geneli
Durum: | Temel
Modül: | mod_log_config
Uyumluluk: | 2.0.41 ve sonrasında mevcuttur.

BufferedLogs yönergesi, mod_log_config modülünün çeşitli günlük girdilerini her isteğin hemen ardından tek tek değil, bir bütün halinde diske yazılmak üzere bellekte saklanmasını sağlar. Bu, bazı sistemlerde daha verimli disk erişimi, dolayısıyla daha yüksek başarım sağlayabilir. Sadece sunucu geneli için belirtilebilir, sanal konaklar için ayrı ayrı yapılandırılamaz.

Bu yönerge deneyseldir ve dikkatli kullanılmalıdır.

CookieLog Yönergesi

Açıklama: | Çerezleri günlüğe kaydetmek için dosya ismi belirtmekte kullanılır.
Sözdizimi: | CookieLog dosya-adı
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_log_config
Uyumluluk: | Bu yönergenin kullanımı önerilmemektedir.

CookieLog yönergesi çerezleri günlüğe kaydetmek için dosya ismi belirtir. Dosya isminin ServerRoot değerine göre belirtildiği varsayılır. Yönerge mod_cookies ile uyumluluk için vardır ve kullanımı önerilmemektedir.

CustomLog Yönergesi

Açıklama: | Günlük dosyasın ismini ve girdi biçemini belirler.
Sözdizimi: | CustomLog dosya|borulu-süreç biçem|takma-ad [env=[!]ortam-değişkeni]
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_log_config

CustomLog yönergesi istekleri günlüğe kaydetmek için kullanılır. Yönerge ile bir günlük biçemi belirtilebilir ve günlük kaydı isteğin özelliklerine bağlı olarak ortam değişkenleri vasıtasıyla şarta bağlı kılınabilir.

İlk argümanda günlüğün yazılacağı yer belirtilir. İki tür yer belirtilebilir:

dosya
ServerRoot yönergesinin değerine göreli bir dosya ismi.
borulu-süreç
"|" boru karakteri ile öncelenmiş olarak günlük bilgisini standart girdisinden kabul edecek sürecin ismi (veya komut satırı) Daha fazla bilgi için borulu günlükler ile ilgili ek bilgilere bakın.

Güvenlik:

Bir borulu süreç kullanılmışsa, süreç httpd’yi başlatan kullanıcı tarafından başlatılacaktır. Sunucu root tarafından başlatılıyorsa bu root olacaktır; bu bakımdan günlük kaydını alacak programın güvenilir olması önemlidir.

Bilginize

Dosya yolunu belirtirken tersbölü çizgisi kullanılan Unix dışı platformlarda bile yapılandırma dosyasında bu amaçla normal bölü çizgilerini kullanmaya özen gösterilmelidir.

İkinci argümanda günlüğe ne yazılacağı belirtilir. Ya evvelce LogFormat yönergesi ile tanımlanmış bir takma-ad ya da içeriği Günlük Girdilerinin Kişiselleştirilmesi bölümünde açıklanmış bir biçem dizgesi olabilir.

Örneğin, aşağıdaki iki yönerge kümesi aynı etkiye sahiptir:

# Biçem dizgesi yerine takma ad içeren CustomLog
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common

# Biçem dizgesinin kendisini içeren CustomLog
CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b"

Üçüncü argüman isteğe bağlı olup, sunucu ortamında belli bir değişkenin varlığına bağlı olarak belli bir isteğin günlüğe kaydedilip kaydedilmeyeceğini belirler. Eğer istek için belirtilen ortam değişkeni mevcutsa (veya 'env=!değişken' durumunda mevcut değilse) istek günlüğe kaydedilir.

Ortam değişkenleri mod_setenvif ve/veya mod_rewrite modülleri kullanılarak her istek için ayrı ayrı atanabilir. Örneğin, GIF biçemli resimler için yapılan istekleri ana günlük dosyasına değil de başka bir dosyaya kaydetmek isterseniz:

SetEnvIf Request_URI \.gif$ gif-image
CustomLog gif-requests.log common env=gif-image
CustomLog nongif-requests.log common env=!gif-image

Veya eski RefererIgnore yönergesinin davranışını taklit etmek isterseniz:

SetEnvIf Referer example\.com yerel-atif
CustomLog referer.log referer env=!yerel-atif

LogFormat Yönergesi

Açıklama: | Bir günlük dosyasında kullanılmak üzere girdi biçemi tanımlar.
Sözdizimi: | LogFormat biçem|takma-ad [takma-ad]
Öntanımlı: | LogFormat "%h %l %u %t \"%r\" %>s %b"
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_log_config

Bu yönerge erişim günlüğü dosyasının girdi biçemini belirler.

LogFormat yönergesi iki şekilde kullanılabilir. Tek argüman belirtilebilen ilkinde daha sonra TransferLog yönergelerinde belirtilen günlüklerde kullanılmak üzere günlük biçemini belirler. Bu günlük biçemi yukarıda açıklanan biçem belirteçlerinden oluşur. Bu tek argüman yerine aşağıda açıklandığı gibi önceki bir LogFormat yönergesinde tanımlanmış bir günlük biçemine atıf yapan bir takma-ad da belirtilebilir.

LogFormat yönergesinin ikinci kullanım şeklinde biçem bir takma-ad için tanımlanır. Bu takma ad daha sonraki LogFormat veya CustomLog yönergelerinde aynı biçem dizgesini uzun uzadıya yazmamak için takma-ad olarak kullanılır. Bir LogFormat yönergesi bir takma ad tanımlamaktan başka bir şey yapmaz; yani, yaptığı iş sadece bir takma ad tanımlamaktan ibarettir, biçemi uygulamaz veya biçemi öntanımlı hale getirmez. Bu bakımdan sonraki TransferLog yönergelerini de etkilemeyecektir. Ayrıca, LogFormat yönergesi bir takma ada başka bir takma ad tanımlamakta da kullanılamaz. Bir takma adın yüzde imi (%) içeremeyeceğine de dikkat ediniz.

Örnek

LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common

TransferLog Yönergesi

Açıklama: | Bir günlük dosyasının yerini belirtir.
Sözdizimi: | TransferLog dosya|borulu-süreç [takma-ad]
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_log_config

Bir günlük biçemi tanımlanmasını ve şarta bağlı günlük kaydını mümkün kılmaması haricinde CustomLog yönergesi gibidir. Günlük biçemi yerine kendinden önce yer alan bir LogFormat yönergesinde tanımlanan bir takma ad kullanılır. Açıkça bir günlük biçemi takma adı belirtilmedikçe Ortak Günlük Biçemi öntanımlıdır.

Örnek

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
TransferLog logs/access_log

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_log_forensic - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_log_forensic

Açıklama: | Sunucuya yapılan isteklerin adli günlük kayıtlarının tutulması
Durum: | Eklenti
Modül Betimleyici: | log_forensic_module
Kaynak Dosyası: | mod_log_forensic.c
Uyumluluk: | 2.1 sürümünden beri mod_unique_id gerekmemektedir.

Özet

Bu modül istemci isteklerinin adli günlük kayıtlarının tutulmasını sağlar. Günlük kaydı bir istek işlenmeden önce ve sonra olmak üzere iki kere yapılır, böylece günlükte her istek için iki girdi bulunur. Adli günlükleyici çok sıkı kurallara tabidir, yani:

  • Biçem sabittir. Günlük kayıt biçemi çalışma anında değiştirilemez.
  • Veriyi yazamadığı takdirde çocuk süreç beklemeksizin çıkar ve (CoreDumpDirectory yapılandırmasına bağlı olarak) bir core dosyası dökümler.

Dağıtımın support dizininde bulunan check_forensic betiği adli günlük dosyalarının değerlendirilmesinde yardımcı olabilir.

Ayrıca bakınız:

  • Apache Günlük Dosyaları
  • mod_log_config

Adli Günlük Biçemi

Her istek günlüğe iki defa kaydedilir. İlki, işlemin başlangıcında (yani, başlıklar alındıktan hemen sonra), ikincisi ise istek işlem gördükten sonra normal günlüklemenin yapıldığı sırada yapılır.

Her isteği betimlemek için eşsiz bir istek kimliği atanır. Bu adli kimliğin normal günlüğe de yazılması istenirse bu %{forensic-id}n biçem dizgesi ile yapılabilir. mod_unique_id kullanılıyorsa, onun ürettiği kimlik kullanılır.

İlk satır günlüğe, adli kimliği, istek satırını ve alınan tüm başlıkları boru karakterleri (|) ile ayrılmış olarak kaydeder. Aşağıda bir örneğe yer verilmiştir (hepsi bir satırdadır):

+yQtJf8CoAB4AAFNXBIEAAAAA|GET /manual/de/images/down.gif HTTP/1.1|Host:localhost%3a8080|User-Agent:Mozilla/5.0 (X11; U; Linux i686; en-US; rv%3a1.6) Gecko/20040216 Firefox/0.8|Accept:image/png, etc...

Başlangıçtaki artı imi bu günlük satırının istekle ilgili ilk günlük kaydı olduğunu belirtir. İkinci satırda bunun yerini bir eksi imi alır:

-yQtJf8CoAB4AAFNXBIEAAAAA

check_forensic betiği komut satırı argümanı olarak günlük dosyasının ismini alır. Bu +/- kimlik çiftlerine bakarak tamamlanmamış istekler varsa bunlar hakkında uyarır.

Güvenlik Kaygıları

Günlük dosyarının kaydedildiği dizine sunucuyu başlatan kullanıcı dışında diğer kullanıcılar tarafından yazılabiliyor olması halinde güvenliğinizden nasıl feragat etmiş olacağınız güvenlik ipuçları belgesinde açıklanmıştır.

Günlük dosyaları Authorization: başlıklarının içeriği (örn, parolalar) gibi hassas veriler içerebilir, bu bakımdan sunucuyu başlatan kullanıcı dışında hiç kimse bu dosyaları okuyamamalıdır.

ForensicLog Yönergesi

Açıklama: | Adli günlük için dosya ismini belirler.
Sözdizimi: | ForensicLog dosya-adı|borulu-süreç
Bağlam: | sunucu geneli, sanal konak
Durum: | Eklenti
Modül: | mod_log_forensic

ForensicLog yönergesi adli inceleme için sunucuya yapılan istekleri günlüğe kaydetmekte kullanılır. Her günlük girdisine, normal CustomLog yönergesinde kullanılarak istekle ilişkilendirilebilen eşsiz bir kimlik atanır. mod_log_forensic modülü, aktarım günlüğünün biçem dizgesinde %{forensic-id}n şeklinde kullanılmak üzere forensic-id adı verilen bir dizgecik oluşturur.

Günlüğün yazılacağı yeri belirleyen argüman şu iki değerden birini alabilir:

dosya-adı
ServerRoot yönergesinin değerine göreli bir dosya ismi.
borulu-süreç
"|" boru karakteri ile öncelenmiş olarak günlük bilgisini standart girdisinden kabul edecek sürecin ismi (veya komut satırı). Program adının ServerRoot yönergesinin değerine göre belirtildiği varsayılır.

Güvenlik:

Bir borulu süreç kullanılmışsa, süreç httpd’yi başlatan kullanıcı tarafından başlatılacaktır. Sunucu root tarafından başlatılıyorsa bu root olacaktır; bu bakımdan günlük kaydını alacak programın güvenilir olması veya daha az yetkili bir kullanıcıya geçiş yapması önemlidir.

Bilginize

Dosya yolunu belirtirken tersbölü çizgisi kullanılan Unix dışı platformlarda bile yapılandırma dosyasında bu amaçla normal bölü çizgilerini kullanmaya özen gösterilmelidir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_logio - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_logio

Açıklama: | Her isteğin girdi ve çıktı uzunluklarının günlüklenmesi.
Durum: | Eklenti
Modül Betimleyici: | logio_module
Kaynak Dosyası: | mod_logio.c

Özet

Bu modül her istekte alınan ve gönderilen bayt sayısının günlüklenmesini sağlar. Sayılar, istekte ve yanıtta yer alan başlıklar ve gövdeleri hesaba dahil ederek ağ üzerinde gerçekte gidip gelen bayt sayısını gösterir. Bayt sayımı, girdide SSL/TLS öncesinde ve çıktıda SSL/TLS sonrasında yapılır, böylece sayıların, şifrelemeyle herhangi bir değişikliği doğru olarak yansıtması sağlanmış olur.

Bu modül mod_log_config modülünü gerektirir.

SSL ile KeepAlive bağlantılar kullanıldığında, SSL uzlaşımının ek yükü, bağlantı üzerinden yapılan ilk isteğin bayt sayısını yansıtır. Her dizin için yeniden uzlaşım gerektiği takdirde bayt sayısı yeniden uzlaşımı tetikleyen istekle ilişkilendirilir.

Ayrıca bakınız:

  • mod_log_config
  • Apache Günlük Dosyaları

Özel Günlük Biçemleri

İsteğin belirgin özellikleri için, biçem dizgesinde yer alan % imli biçem belirteçlerinin yerine günlük dosyasında değerleri yazılır. Bu modül iki yeni biçem belirteci ekler:

Biçem Belirteci | Açıklama
%...I | İstek gövdesi ve başlıklar dahil alınan bayt sayısı; sıfır olamaz.
%...O | Başlıklar dahil gönderilen bayt sayısı; sıfır olamaz.

Genel olarak, işlevsellik şöyle kullanılır:

Birleşik G/Ç günlükleme biçemi:
"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %I %O"

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_mem_cache - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_mem_cache

Description: | Content cache keyed to URIs
Status: | Extension
Module Identifier: | mem_cache_module
Source File: | mod_mem_cache.c

Summary

This module requires the service of mod_cache. It acts as a support module for mod_cache and provides a memory based storage manager. mod_mem_cache can be configured to operate in two modes: caching open file descriptors or caching objects in heap storage. mod_mem_cache is most useful when used to cache locally generated content or to cache backend server content for mod_proxy configured for ProxyPass (aka reverse proxy).

Content is stored in and retrieved from the cache using URI based keys. Content with access protection is not cached.

Note

In most cases mod_disk_cache should be the preferred choice. This is explained further in the Caching Guide. In particular, this module's cache is per-process, which can be partially mitigated by configuring threaded MPMs to use fewer child processes via configuration of larger values for ThreadsPerChild. This module's cache is also limited to storing a single variant (see HTTP Vary: header) of each resource in the cache.

See also

  • mod_cache
  • mod_disk_cache

MCacheMaxObjectCount Directive

Description: | The maximum number of objects allowed to be placed in the cache
Syntax: | MCacheMaxObjectCount value
Default: | MCacheMaxObjectCount 1009
Context: | server config
Status: | Extension
Module: | mod_mem_cache

The MCacheMaxObjectCount directive sets the maximum number of objects to be cached. The value is used to create the open hash table. If a new object needs to be inserted in the cache and the maximum number of objects has been reached, an object will be removed to allow the new object to be cached. The object to be removed is selected using the algorithm specified by MCacheRemovalAlgorithm.

Example

MCacheMaxObjectCount 13001

MCacheMaxObjectSize Directive

Description: | The maximum size (in bytes) of a document allowed in the cache
Syntax: | MCacheMaxObjectSize bytes
Default: | MCacheMaxObjectSize 10000
Context: | server config
Status: | Extension
Module: | mod_mem_cache

The MCacheMaxObjectSize directive sets the maximum allowable size, in bytes, of a document for it to be considered cacheable.

Example

MCacheMaxObjectSize 6400000

Note

The value of MCacheMaxObjectSize must be greater than the value specified by the MCacheMinObjectSize directive.

MCacheMaxStreamingBuffer Directive

Description: | Maximum amount of a streamed response to buffer in memory before declaring the response uncacheable
Syntax: | MCacheMaxStreamingBuffer size_in_bytes
Default: | MCacheMaxStreamingBuffer the smaller of 100000 or MCacheMaxObjectSize
Context: | server config
Status: | Extension
Module: | mod_mem_cache

The MCacheMaxStreamingBuffer directive specifies the maximum number of bytes of a streamed response to buffer before deciding that the response is too big to cache. A streamed response is one in which the entire content is not immediately available and in which the Content-Length may not be known. Sources of streaming responses include proxied responses and the output of CGI scripts. By default, a streamed response will not be cached unless it has a Content-Length header. The reason for this is to avoid using a large amount of memory to buffer a partial response that might end up being too large to fit in the cache. The MCacheMaxStreamingBuffer directive allows buffering of streamed responses that don't contain a Content-Length up to the specified maximum amount of space. If the maximum buffer space is reached, the buffered content is discarded and the attempt to cache is abandoned.

Note:

Using a nonzero value for MCacheMaxStreamingBuffer will not delay the transmission of the response to the client. As soon as mod_mem_cache copies a block of streamed content into a buffer, it sends the block on to the next output filter for delivery to the client.

# Enable caching of streamed responses up to 64KB:
MCacheMaxStreamingBuffer 65536

MCacheMinObjectSize Directive

Description: | The minimum size (in bytes) of a document to be allowed in the cache
Syntax: | MCacheMinObjectSize bytes
Default: | MCacheMinObjectSize 1
Context: | server config
Status: | Extension
Module: | mod_mem_cache

The MCacheMinObjectSize directive sets the minimum size in bytes of a document for it to be considered cacheable.

Example

MCacheMinObjectSize 10000

MCacheRemovalAlgorithm Directive

Description: | The algorithm used to select documents for removal from the cache
Syntax: | MCacheRemovalAlgorithm LRU|GDSF
Default: | MCacheRemovalAlgorithm GDSF
Context: | server config
Status: | Extension
Module: | mod_mem_cache

The MCacheRemovalAlgorithm directive specifies the algorithm used to select documents for removal from the cache. Two choices are available:

LRU (Least Recently Used)
LRU removes the documents that have not been accessed for the longest time.
GDSF (GreadyDual-Size)
GDSF assigns a priority to cached documents based on the cost of a cache miss and the size of the document. Documents with the lowest priority are removed first.

Example

MCacheRemovalAlgorithm GDSF
MCacheRemovalAlgorithm LRU

MCacheSize Directive

Description: | The maximum amount of memory used by the cache in KBytes
Syntax: | MCacheSize KBytes
Default: | MCacheSize 100
Context: | server config
Status: | Extension
Module: | mod_mem_cache

The MCacheSize directive sets the maximum amount of memory to be used by the cache, in KBytes (1024-byte units). If a new object needs to be inserted in the cache and the size of the object is greater than the remaining memory, objects will be removed until the new object can be cached. The object to be removed is selected using the algorithm specified by MCacheRemovalAlgorithm.

Example

MCacheSize 700000

Note

The MCacheSize value must be greater than the value specified by the MCacheMaxObjectSize directive.


mod_mime - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_mime

Description: | Associates the requested filename's extensions with the file's behavior (handlers and filters) and content (mime-type, language, character set and encoding)
Status: | Base
Module Identifier: | mime_module
Source File: | mod_mime.c

Summary

This module is used to associate various bits of "meta information" with files by their filename extensions. This information relates the filename of the document to its mime-type, language, character set and encoding. This information is sent to the browser, and participates in content negotiation, so the user's preferences are respected when choosing one of several possible files to serve. See mod_negotiation for more information about content negotiation.

The directives AddCharset, AddEncoding, AddLanguage and AddType are all used to map file extensions onto the meta-information for that file. Respectively they set the character set, content-encoding, content-language, and MIME-type (content-type) of documents. The directive TypesConfig is used to specify a file which also maps extensions onto MIME types.

In addition, mod_mime may define the handler and filters that originate and process content. The directives AddHandler, AddOutputFilter, and AddInputFilter control the modules or scripts that serve the document. The MultiviewsMatch directive allows mod_negotiation to consider these file extensions to be included when testing Multiviews matches.

While mod_mime associates meta-information with filename extensions, the core server provides directives that are used to associate all the files in a given container (e.g., <Location>, <Directory>, or <Files>) with particular meta-information. These directives include ForceType, SetHandler, SetInputFilter, and SetOutputFilter. The core directives override any filename extension mappings defined in mod_mime.

Note that changing the meta-information for a file does not change the value of the Last-Modified header. Thus, previously cached copies may still be used by a client or proxy, with the previous headers. If you change the meta-information (language, content type, character set or encoding) you may need to 'touch' affected files (updating their last modified date) to ensure that all visitors are receive the corrected content headers.

See also

  • MimeMagicFile
  • AddDefaultCharset
  • ForceType
  • DefaultType
  • SetHandler
  • SetInputFilter
  • SetOutputFilter

Files with Multiple Extensions

Files can have more than one extension, and the order of the extensions is normally irrelevant. For example, if the file welcome.html.fr maps onto content type text/html and language French then the file welcome.fr.html will map onto exactly the same information. If more than one extension is given that maps onto the same type of meta-information, then the one to the right will be used, except for languages and content encodings. For example, if .gif maps to the MIME-type image/gif and .html maps to the MIME-type text/html, then the file welcome.gif.html will be associated with the MIME-type text/html.

Languages and content encodings are treated accumulative, because one can assign more than one language or encoding to a particular resource. For example, the file welcome.html.en.de will be delivered with Content-Language: en, de and Content-Type: text/html.

Care should be taken when a file with multiple extensions gets associated with both a MIME-type and a handler. This will usually result in the request being handled by the module associated with the handler. For example, if the .imap extension is mapped to the handler imap-file (from mod_imagemap) and the .html extension is mapped to the MIME-type text/html, then the file world.imap.html will be associated with both the imap-file handler and text/html MIME-type. When it is processed, the imap-file handler will be used, and so it will be treated as a mod_imagemap imagemap file.

If you would prefer only the last dot-separated part of the filename to be mapped to a particular piece of meta-data, then do not use the Add* directives. For example, if you wish to have the file foo.html.cgi processed as a CGI script, but not the file bar.cgi.html, then instead of using AddHandler cgi-script .cgi, use

Configure handler based on final extension only

<FilesMatch \.cgi$> SetHandler cgi-script </FilesMatch>

Content encoding

A file of a particular MIME-type can additionally be encoded a particular way to simplify transmission over the Internet. While this usually will refer to compression, such as gzip, it can also refer to encryption, such a pgp or to an encoding such as UUencoding, which is designed for transmitting a binary file in an ASCII (text) format.

The HTTP/1.1 RFC, section 14.11 puts it this way:

The Content-Encoding entity-header field is used as a modifier to the media-type. When present, its value indicates what additional content codings have been applied to the entity-body, and thus what decoding mechanisms must be applied in order to obtain the media-type referenced by the Content-Type header field. Content-Encoding is primarily used to allow a document to be compressed without losing the identity of its underlying media type.

By using more than one file extension (see section above about multiple file extensions), you can indicate that a file is of a particular type, and also has a particular encoding.

For example, you may have a file which is a Microsoft Word document, which is pkzipped to reduce its size. If the .doc extension is associated with the Microsoft Word file type, and the .zip extension is associated with the pkzip file encoding, then the file Resume.doc.zip would be known to be a pkzip'ed Word document.

Apache sends a Content-encoding header with the resource, in order to tell the client browser about the encoding method.

Content-encoding: pkzip

Character sets and languages

In addition to file type and the file encoding, another important piece of information is what language a particular document is in, and in what character set the file should be displayed. For example, the document might be written in the Vietnamese alphabet, or in Cyrillic, and should be displayed as such. This information, also, is transmitted in HTTP headers.

The character set, language, encoding and mime type are all used in the process of content negotiation (See mod_negotiation) to determine which document to give to the client, when there are alternative documents in more than one character set, language, encoding or mime type. All filename extensions associations created with AddCharset, AddEncoding, AddLanguage and AddType directives (and extensions listed in the MimeMagicFile) participate in this select process. Filename extensions that are only associated using the AddHandler, AddInputFilter or AddOutputFilter directives may be included or excluded from matching by using the MultiviewsMatch directive.

Charset

To convey this further information, Apache optionally sends a Content-Language header, to specify the language that the document is in, and can append additional information onto the Content-Type header to indicate the particular character set that should be used to correctly render the information.

Content-Language: en, fr
Content-Type: text/plain; charset=ISO-8859-1

The language specification is the two-letter abbreviation for the language. The charset is the name of the particular character set which should be used.

AddCharset Directive

Description: | Maps the given filename extensions to the specified content charset
Syntax: | AddCharset charset extension [extension] ...
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

The AddCharset directive maps the given filename extensions to the specified content charset. charset is the MIME charset parameter of filenames containing extension. This mapping is added to any already in force, overriding any mappings that already exist for the same extension.

Example

AddLanguage ja .ja
AddCharset EUC-JP .euc
AddCharset ISO-2022-JP .jis
AddCharset SHIFT_JIS .sjis

Then the document xxxx.ja.jis will be treated as being a Japanese document whose charset is ISO-2022-JP (as will the document xxxx.jis.ja). The AddCharset directive is useful for both to inform the client about the character encoding of the document so that the document can be interpreted and displayed appropriately, and for content negotiation, where the server returns one from several documents based on the client's charset preference.

The extension argument is case-insensitive and can be specified with or without a leading dot. Filenames may have multiple extensions and the extension argument will be compared against each of them.

See also

  • mod_negotiation
  • AddDefaultCharset

AddEncoding Directive

Description: | Maps the given filename extensions to the specified encoding type
Syntax: | AddEncoding MIME-enc extension [extension] ...
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

The AddEncoding directive maps the given filename extensions to the specified encoding type. MIME-enc is the MIME encoding to use for documents containing the extension. This mapping is added to any already in force, overriding any mappings that already exist for the same extension.

Example

AddEncoding x-gzip .gz
AddEncoding x-compress .Z

This will cause filenames containing the .gz extension to be marked as encoded using the x-gzip encoding, and filenames containing the .Z extension to be marked as encoded with x-compress.

Old clients expect x-gzip and x-compress, however the standard dictates that they're equivalent to gzip and compress respectively. Apache does content encoding comparisons by ignoring any leading x-. When responding with an encoding Apache will use whatever form (i.e., x-foo or foo) the client requested. If the client didn't specifically request a particular form Apache will use the form given by the AddEncoding directive. To make this long story short, you should always use x-gzip and x-compress for these two specific encodings. More recent encodings, such as deflate should be specified without the x-.

The extension argument is case-insensitive and can be specified with or without a leading dot. Filenames may have multiple extensions and the extension argument will be compared against each of them.

AddHandler Directive

Description: | Maps the filename extensions to the specified handler
Syntax: | AddHandler handler-name extension [extension] ...
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

Files having the name extension will be served by the specified handler-name. This mapping is added to any already in force, overriding any mappings that already exist for the same extension. For example, to activate CGI scripts with the file extension .cgi, you might use:

AddHandler cgi-script .cgi

Once that has been put into your httpd.conf file, any file containing the .cgi extension will be treated as a CGI program.

The extension argument is case-insensitive and can be specified with or without a leading dot. Filenames may have multiple extensions and the extension argument will be compared against each of them.

See also

  • SetHandler

AddInputFilter Directive

Description: | Maps filename extensions to the filters that will process client requests
Syntax: | AddInputFilter filter[;filter...] extension [extension] ...
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime
Compatibility: | AddInputFilter is only available in Apache 2.0.26 and later.

AddInputFilter maps the filename extension extension to the filters which will process client requests and POST input when they are received by the server. This is in addition to any filters defined elsewhere, including the SetInputFilter directive. This mapping is merged over any already in force, overriding any mappings that already exist for the same extension.

If more than one filter is specified, they must be separated by semicolons in the order in which they should process the content. The filter is case-insensitive.

The extension argument is case-insensitive and can be specified with or without a leading dot. Filenames may have multiple extensions and the extension argument will be compared against each of them.

See also

  • RemoveInputFilter
  • SetInputFilter

AddLanguage Directive

Description: | Maps the given filename extension to the specified content language
Syntax: | AddLanguage MIME-lang extension [extension] ...
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

The AddLanguage directive maps the given filename extension to the specified content language. MIME-lang is the MIME language of filenames containing extension. This mapping is added to any already in force, overriding any mappings that already exist for the same extension.

Example

AddEncoding x-compress .Z
AddLanguage en .en
AddLanguage fr .fr

Then the document xxxx.en.Z will be treated as being a compressed English document (as will the document xxxx.Z.en). Although the content language is reported to the client, the browser is unlikely to use this information. The AddLanguage directive is more useful for content negotiation, where the server returns one from several documents based on the client's language preference.

If multiple language assignments are made for the same extension, the last one encountered is the one that is used. That is, for the case of:

AddLanguage en .en
AddLanguage en-gb .en
AddLanguage en-us .en

documents with the extension .en would be treated as being en-us.

The extension argument is case-insensitive and can be specified with or without a leading dot. Filenames may have multiple extensions and the extension argument will be compared against each of them.

See also

  • mod_negotiation

AddOutputFilter Directive

Description: | Maps filename extensions to the filters that will process responses from the server
Syntax: | AddOutputFilter filter[;filter...] extension [extension] ...
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime
Compatibility: | AddOutputFilter is only available in Apache 2.0.26 and later.

The AddOutputFilter directive maps the filename extension extension to the filters which will process responses from the server before they are sent to the client. This is in addition to any filters defined elsewhere, including SetOutputFilter and AddOutputFilterByType directive. This mapping is merged over any already in force, overriding any mappings that already exist for the same extension.

For example, the following configuration will process all .shtml files for server-side includes and will then compress the output using mod_deflate.

AddOutputFilter INCLUDES;DEFLATE shtml

If more than one filter is specified, they must be separated by semicolons in the order in which they should process the content. The filter argument is case-insensitive.

The extension argument is case-insensitive and can be specified with or without a leading dot. Filenames may have multiple extensions and the extension argument will be compared against each of them.

See also

  • RemoveOutputFilter
  • SetOutputFilter

AddType Directive

Description: | Maps the given filename extensions onto the specified content type
Syntax: | AddType MIME-type extension [extension] ...
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

The AddType directive maps the given filename extensions onto the specified content type. MIME-type is the MIME type to use for filenames containing extension. This mapping is added to any already in force, overriding any mappings that already exist for the same extension. This directive can be used to add mappings not listed in the MIME types file (see the TypesConfig directive).

Example

AddType image/gif .gif

It is recommended that new MIME types be added using the AddType directive rather than changing the TypesConfig file.

The extension argument is case-insensitive and can be specified with or without a leading dot. Filenames may have multiple extensions and the extension argument will be compared against each of them.

See also

  • DefaultType
  • ForceType

DefaultLanguage Directive

Description: | Sets all files in the given scope to the specified language
Syntax: | DefaultLanguage MIME-lang
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

The DefaultLanguage directive tells Apache that all files in the directive's scope (e.g., all files covered by the current <Directory> container) that don't have an explicit language extension (such as .fr or .de as configured by AddLanguage) should be considered to be in the specified MIME-lang language. This allows entire directories to be marked as containing Dutch content, for instance, without having to rename each file. Note that unlike using extensions to specify languages, DefaultLanguage can only specify a single language.

If no DefaultLanguage directive is in force, and a file does not have any language extensions as configured by AddLanguage, then that file will be considered to have no language attribute.

Example

DefaultLanguage en

See also

  • mod_negotiation

ModMimeUsePathInfo Directive

Description: | Tells mod_mime to treat path_info components as part of the filename
Syntax: | ModMimeUsePathInfo On|Off
Default: | ModMimeUsePathInfo Off
Context: | directory
Status: | Base
Module: | mod_mime
Compatibility: | Available in Apache 2.0.41 and later

The ModMimeUsePathInfo directive is used to combine the filename with the path_info URL component to apply mod_mime's directives to the request. The default value is Off - therefore, the path_info component is ignored.

This directive is recommended when you have a virtual filesystem.

Example

ModMimeUsePathInfo On

If you have a request for /bar/foo.shtml where /bar is a Location and ModMimeUsePathInfo is On, mod_mime will treat the incoming request as /bar/foo.shtml and directives like AddOutputFilter INCLUDES .shtml will add the INCLUDES filter to the request. If ModMimeUsePathInfo is not set, the INCLUDES filter will not be added.

See also

  • AcceptPathInfo

MultiviewsMatch Directive

Description: | The types of files that will be included when searching for a matching file with MultiViews
Syntax: | MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers [Handlers|Filters]
Default: | MultiviewsMatch NegotiatedOnly
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime
Compatibility: | Available in Apache 2.0.26 and later.

MultiviewsMatch permits three different behaviors for mod_negotiation's Multiviews feature. Multiviews allows a request for a file, e.g. index.html, to match any negotiated extensions following the base request, e.g. index.html.en, index.html.fr, or index.html.gz.

The NegotiatedOnly option provides that every extension following the base name must correlate to a recognized mod_mime extension for content negotiation, e.g. Charset, Content-Type, Language, or Encoding. This is the strictest implementation with the fewest unexpected side effects, and is the default behavior.

To include extensions associated with Handlers and/or Filters, set the MultiviewsMatch directive to either Handlers, Filters, or both option keywords. If all other factors are equal, the smallest file will be served, e.g. in deciding between index.html.cgi of 500 bytes and index.html.pl of 1000 bytes, the .cgi file would win in this example. Users of .asis files might prefer to use the Handler option, if .asis files are associated with the asis-handler.

You may finally allow Any extensions to match, even if mod_mime doesn't recognize the extension. This was the behavior in Apache 1.3, and can cause unpredictable results, such as serving .old or .bak files the webmaster never expected to be served.

For example, the following configuration will allow handlers and filters to participate in Multviews, but will exclude unknown files:

MultiviewsMatch Handlers Filters

MultiviewsMatch is not allowed in a <Location> or <LocationMatch> section.

See also

  • Options
  • mod_negotiation

RemoveCharset Directive

Description: | Removes any character set associations for a set of file extensions
Syntax: | RemoveCharset extension [extension] ...
Context: | virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime
Compatibility: | RemoveCharset is only available in Apache 2.0.24 and later.

The RemoveCharset directive removes any character set associations for files with the given extensions. This allows .htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files.

The extension argument is case-insensitive and can be specified with or without a leading dot.

Example

RemoveCharset .html .shtml

RemoveEncoding Directive

Description: | Removes any content encoding associations for a set of file extensions
Syntax: | RemoveEncoding extension [extension] ...
Context: | virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

The RemoveEncoding directive removes any encoding associations for files with the given extensions. This allows .htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files. An example of its use might be:

/foo/.htaccess:

AddEncoding x-gzip .gz
AddType text/plain .asc
<Files *.gz.asc>
RemoveEncoding .gz
 </Files>

This will cause foo.gz to be marked as being encoded with the gzip method, but foo.gz.asc as an unencoded plaintext file.

Note

RemoveEncoding directives are processed after any AddEncoding directives, so it is possible they may undo the effects of the latter if both occur within the same directory configuration.

The extension argument is case-insensitive and can be specified with or without a leading dot.

RemoveHandler Directive

Description: | Removes any handler associations for a set of file extensions
Syntax: | RemoveHandler extension [extension] ...
Context: | virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

The RemoveHandler directive removes any handler associations for files with the given extensions. This allows .htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files. An example of its use might be:

/foo/.htaccess:

AddHandler server-parsed .html

/foo/bar/.htaccess:

RemoveHandler .html

This has the effect of returning .html files in the /foo/bar directory to being treated as normal files, rather than as candidates for parsing (see the mod_include module).

The extension argument is case-insensitive and can be specified with or without a leading dot.

RemoveInputFilter Directive

Description: | Removes any input filter associations for a set of file extensions
Syntax: | RemoveInputFilter extension [extension] ...
Context: | virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime
Compatibility: | RemoveInputFilter is only available in Apache 2.0.26 and later.

The RemoveInputFilter directive removes any input filter associations for files with the given extensions. This allows .htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files.

The extension argument is case-insensitive and can be specified with or without a leading dot.

See also

  • AddInputFilter
  • SetInputFilter

RemoveLanguage Directive

Description: | Removes any language associations for a set of file extensions
Syntax: | RemoveLanguage extension [extension] ...
Context: | virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime
Compatibility: | RemoveLanguage is only available in Apache 2.0.24 and later.

The RemoveLanguage directive removes any language associations for files with the given extensions. This allows .htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files.

The extension argument is case-insensitive and can be specified with or without a leading dot.

RemoveOutputFilter Directive

Description: | Removes any output filter associations for a set of file extensions
Syntax: | RemoveOutputFilter extension [extension] ...
Context: | virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime
Compatibility: | RemoveOutputFilter is only available in Apache 2.0.26 and later.

The RemoveOutputFilter directive removes any output filter associations for files with the given extensions. This allows .htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files.

The extension argument is case-insensitive and can be specified with or without a leading dot.

Example

RemoveOutputFilter shtml

See also

  • AddOutputFilter

RemoveType Directive

Description: | Removes any content type associations for a set of file extensions
Syntax: | RemoveType extension [extension] ...
Context: | virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_mime

The RemoveType directive removes any MIME type associations for files with the given extensions. This allows .htaccess files in subdirectories to undo any associations inherited from parent directories or the server config files. An example of its use might be:

/foo/.htaccess:

RemoveType .cgi

This will remove any special handling of .cgi files in the /foo/ directory and any beneath it, causing the files to be treated as being of the DefaultType.

Note

RemoveType directives are processed after any AddType directives, so it is possible they may undo the effects of the latter if both occur within the same directory configuration.

The extension argument is case-insensitive and can be specified with or without a leading dot.

TypesConfig Directive

Description: | The location of the mime.types file
Syntax: | TypesConfig file-path
Default: | TypesConfig conf/mime.types
Context: | server config
Status: | Base
Module: | mod_mime

The TypesConfig directive sets the location of the MIME types configuration file. File-path is relative to the ServerRoot. This file sets the default list of mappings from filename extensions to content types. Most administrators use the provided mime.types file, which associates common filename extensions with IANA registered content types. The current list is maintained at http://www.iana.org/assignments/media-types/index.html. This simplifies the httpd.conf file by providing the majority of media-type definitions, and may be overridden by AddType directives as needed. You should not edit the mime.types file, because it may be replaced when you upgrade your server.

The file contains lines in the format of the arguments to an AddType directive:

MIME-type [extension] ...

The case of the extension does not matter. Blank lines, and lines beginning with a hash character (#) are ignored.

Please do not send requests to the Apache HTTP Server Project to add any new entries in the distributed mime.types file unless (1) they are already registered with IANA, and (2) they use widely accepted, non-conflicting filename extensions across platforms. category/x-subtype requests will be automatically rejected, as will any new two-letter extensions as they will likely conflict later with the already crowded language and character set namespace.

See also

  • mod_mime_magic


mod_mime_magic - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_mime_magic

Description: | Determines the MIME type of a file by looking at a few bytes of its contents
Status: | Extension
Module Identifier: | mime_magic_module
Source File: | mod_mime_magic.c

Summary

This module determines the MIME type of files in the same way the Unix file(1) command works: it looks at the first few bytes of the file. It is intended as a "second line of defense" for cases that mod_mime can't resolve.

This module is derived from a free version of the file(1) command for Unix, which uses "magic numbers" and other hints from a file's contents to figure out what the contents are. This module is active only if the magic file is specified by the MimeMagicFile directive.

Format of the Magic File

The contents of the file are plain ASCII text in 4-5 columns. Blank lines are allowed but ignored. Commented lines use a hash mark (#). The remaining lines are parsed for the following columns:

Column | Description
1 byte number to begin checking from
">" indicates a dependency upon the previous non-">" line
2

type of data to match

byte | single character
short | machine-order 16-bit integer
long | machine-order 32-bit integer
string | arbitrary-length string
date | long integer date (seconds since Unix epoch/1970)
beshort | big-endian 16-bit integer
belong | big-endian 32-bit integer
bedate | big-endian 32-bit integer date
leshort | little-endian 16-bit integer
lelong | little-endian 32-bit integer
ledate | little-endian 32-bit integer date
3 | contents of data to match
4 | MIME type if matched
5 | MIME encoding if matched (optional)

For example, the following magic file lines would recognize some audio formats:

# Sun/NeXT audio data
0      string      .snd
>12    belong      1       audio/basic
>12    belong      2       audio/basic
>12    belong      3       audio/basic
>12    belong      4       audio/basic
>12    belong      5       audio/basic
>12    belong      6       audio/basic
>12    belong      7       audio/basic
>12    belong     23       audio/x-adpcm

Or these would recognize the difference between *.doc files containing Microsoft Word or FrameMaker documents. (These are incompatible file formats which use the same file suffix.)

# Frame
0  string  \<MakerFile        application/x-frame
0  string  \<MIFFile          application/x-frame
0  string  \<MakerDictionary  application/x-frame
0  string  \<MakerScreenFon   application/x-frame
0  string  \<MML              application/x-frame
0  string  \<Book             application/x-frame
0  string  \<Maker            application/x-frame

# MS-Word
0  string  \376\067\0\043            application/msword
0  string  \320\317\021\340\241\261  application/msword
0  string  \333\245-\0\0\0           application/msword

An optional MIME encoding can be included as a fifth column. For example, this can recognize gzipped files and set the encoding for them.

# gzip (GNU zip, not to be confused with
#       [Info-ZIP/PKWARE] zip archiver)

0  string  \037\213  application/octet-stream  x-gzip

Performance Issues

This module is not for every system. If your system is barely keeping up with its load or if you're performing a web server benchmark, you may not want to enable this because the processing is not free.

However, an effort was made to improve the performance of the original file(1) code to make it fit in a busy web server. It was designed for a server where there are thousands of users who publish their own documents. This is probably very common on intranets. Many times, it's helpful if the server can make more intelligent decisions about a file's contents than the file name allows ...even if just to reduce the "why doesn't my page work" calls when users improperly name their own files. You have to decide if the extra work suits your environment.

Notes

The following notes apply to the mod_mime_magic module and are included here for compliance with contributors' copyright restrictions that require their acknowledgment.

mod_mime_magic: MIME type lookup via file magic numbers
Copyright (c) 1996-1997 Cisco Systems, Inc.

This software was submitted by Cisco Systems to the Apache Group in July 1997. Future revisions and derivatives of this source code must acknowledge Cisco Systems as the original contributor of this module. All other licensing and usage conditions are those of the Apache Group.

Some of this code is derived from the free version of the file command originally posted to comp.sources.unix. Copyright info for that program is included below as required.

- Copyright (c) Ian F. Darwin, 1987. Written by Ian F. Darwin.

This software is not subject to any license of the American Telephone and Telegraph Company or of the Regents of the University of California.

Permission is granted to anyone to use this software for any purpose on any computer system, and to alter it and redistribute it freely, subject to the following restrictions:

  1. The author is not responsible for the consequences of use of this software, no matter how awful, even if they arise from flaws in it.
  2. The origin of this software must not be misrepresented, either by explicit claim or by omission. Since few users ever read sources, credits must appear in the documentation.
  3. Altered versions must be plainly marked as such, and must not be misrepresented as being the original software. Since few users ever read sources, credits must appear in the documentation.
  4. This notice may not be removed or altered.

For compliance with Mr Darwin's terms: this has been very significantly modified from the free "file" command.

  • all-in-one file for compilation convenience when moving from one version of Apache to the next.
  • Memory allocation is done through the Apache API's pool structure.
  • All functions have had necessary Apache API request or server structures passed to them where necessary to call other Apache API routines. (i.e., usually for logging, files, or memory allocation in itself or a called function.)
  • struct magic has been converted from an array to a single-ended linked list because it only grows one record at a time, it's only accessed sequentially, and the Apache API has no equivalent of realloc().
  • Functions have been changed to get their parameters from the server configuration instead of globals. (It should be reentrant now but has not been tested in a threaded environment.)
  • Places where it used to print results to stdout now saves them in a list where they're used to set the MIME type in the Apache request record.
  • Command-line flags have been removed since they will never be used here.

MimeMagicFile Directive

Description: | Enable MIME-type determination based on file contents using the specified magic file
Syntax: | MimeMagicFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_mime_magic

The MimeMagicFile directive can be used to enable this module, the default file is distributed at conf/magic. Non-rooted paths are relative to the ServerRoot. Virtual hosts will use the same file as the main server unless a more specific setting is used, in which case the more specific setting overrides the main server's file.

Example

MimeMagicFile conf/magic

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_negotiation - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_negotiation

Description: | Provides for content negotiation
Status: | Base
Module Identifier: | negotiation_module
Source File: | mod_negotiation.c

Summary

Content negotiation, or more accurately content selection, is the selection of the document that best matches the clients capabilities, from one of several available documents. There are two implementations of this.

  • A type map (a file with the handler type-map) which explicitly lists the files containing the variants.
  • A MultiViews search (enabled by the MultiViews Options), where the server does an implicit filename pattern match, and choose from amongst the results.

See also

  • Options
  • mod_mime
  • Content Negotiation
  • Environment Variables

Type maps

A type map has a format similar to RFC822 mail headers. It contains document descriptions separated by blank lines, with lines beginning with a hash character ('#') treated as comments. A document description consists of several header records; records may be continued on multiple lines if the continuation lines start with spaces. The leading space will be deleted and the lines concatenated. A header record consists of a keyword name, which always ends in a colon, followed by a value. Whitespace is allowed between the header name and value, and between the tokens of value. The headers allowed are:

Content-Encoding:
The encoding of the file. Apache only recognizes encodings that are defined by an AddEncoding directive. This normally includes the encodings x-compress for compress'd files, and x-gzip for gzip'd files. The x- prefix is ignored for encoding comparisons.
Content-Language:
The language(s) of the variant, as an Internet standard language tag (RFC 1766). An example is en, meaning English. If the variant contains more than one language, they are separated by a comma.
Content-Length:
The length of the file, in bytes. If this header is not present, then the actual length of the file is used.
Content-Type:
The MIME media type of the document, with optional parameters. Parameters are separated from the media type and from one another by a semi-colon, with a syntax of name=value. Common parameters include:
level
an integer specifying the version of the media type. For text/html this defaults to 2, otherwise 0.
qs
a floating-point number with a value in the range 0[.000] to 1[.000], indicating the relative 'quality' of this variant compared to the other available variants, independent of the client's capabilities. For example, a jpeg file is usually of higher source quality than an ascii file if it is attempting to represent a photograph. However, if the resource being represented is ascii art, then an ascii file would have a higher source quality than a jpeg file. All qs values are therefore specific to a given resource.

Example

Content-Type: image/jpeg; qs=0.8

URI:
uri of the file containing the variant (of the given media type, encoded with the given content encoding). These are interpreted as URLs relative to the map file; they must be on the same server (!), and they must refer to files to which the client would be granted access if they were to be requested directly.
Body:
New in Apache 2.0, the actual content of the resource may be included in the type-map file using the Body header. This header must contain a string that designates a delimiter for the body content. Then all following lines in the type map file will be considered part of the resource body until the delimiter string is found.

Example:

Body:----xyz----
<html>
<body>
<p>Content of the page.</p>
</body>
</html>
----xyz----

MultiViews

A MultiViews search is enabled by the MultiViews Options. If the server receives a request for /some/dir/foo and /some/dir/foo does not exist, then the server reads the directory looking for all files named foo.*, and effectively fakes up a type map which names all those files, assigning them the same media types and content-encodings it would have if the client had asked for one of them by name. It then chooses the best match to the client's requirements, and returns that document.

The MultiViewsMatch directive configures whether Apache will consider files that do not have content negotiation meta-information assigned to them when choosing files.

CacheNegotiatedDocs Directive

Description: | Allows content-negotiated documents to be cached by proxy servers
Syntax: | CacheNegotiatedDocs On|Off
Default: | CacheNegotiatedDocs Off
Context: | server config, virtual host
Status: | Base
Module: | mod_negotiation
Compatibility: | The syntax changed in version 2.0.

If set, this directive allows content-negotiated documents to be cached by proxy servers. This could mean that clients behind those proxys could retrieve versions of the documents that are not the best match for their abilities, but it will make caching more efficient.

This directive only applies to requests which come from HTTP/1.0 browsers. HTTP/1.1 provides much better control over the caching of negotiated documents, and this directive has no effect in responses to HTTP/1.1 requests.

Prior to version 2.0, CacheNegotiatedDocs did not take an argument; it was turned on by the presence of the directive by itself.

ForceLanguagePriority Directive

Description: | Action to take if a single acceptable document is not found
Syntax: | ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback]
Default: | ForceLanguagePriority Prefer
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_negotiation
Compatibility: | Available in version 2.0.30 and later

The ForceLanguagePriority directive uses the given LanguagePriority to satisfy negotation where the server could otherwise not return a single matching document.

ForceLanguagePriority Prefer uses LanguagePriority to serve a one valid result, rather than returning an HTTP result 300 (MULTIPLE CHOICES) when there are several equally valid choices. If the directives below were given, and the user's Accept-Language header assigned en and de each as quality .500 (equally acceptable) then the first matching variant, en, will be served.

LanguagePriority en fr de
ForceLanguagePriority Prefer

ForceLanguagePriority Fallback uses LanguagePriority to serve a valid result, rather than returning an HTTP result 406 (NOT ACCEPTABLE). If the directives below were given, and the user's Accept-Language only permitted an es language response, but such a variant isn't found, then the first variant from the LanguagePriority list below will be served.

LanguagePriority en fr de
ForceLanguagePriority Fallback

Both options, Prefer and Fallback, may be specified, so either the first matching variant from LanguagePriority will be served if more than one variant is acceptable, or first available document will be served if none of the variants matched the client's acceptable list of languages.

See also

  • AddLanguage

LanguagePriority Directive

Description: | The precendence of language variants for cases where the client does not express a preference
Syntax: | LanguagePriority MIME-lang [MIME-lang] ...
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Base
Module: | mod_negotiation

The LanguagePriority sets the precedence of language variants for the case where the client does not express a preference, when handling a MultiViews request. The list of MIME-lang are in order of decreasing preference.

Example:

LanguagePriority en fr de

For a request for foo.html, where foo.html.fr and foo.html.de both existed, but the browser did not express a language preference, then foo.html.fr would be returned.

Note that this directive only has an effect if a 'best' language cannot be determined by any other means or the ForceLanguagePriority directive is not None. In general, the client determines the language preference, not the server.

See also

  • AddLanguage


mod_nw_ssl - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_nw_ssl

Description: | Enable SSL encryption for NetWare
Status: | Base
Module Identifier: | nwssl_module
Source File: | mod_nw_ssl.c
Compatibility: | NetWare only

Summary

This module enables SSL encryption for a specified port. It takes advantage of the SSL encryption functionality that is built into the NetWare operating system.

NWSSLTrustedCerts Directive

Description: | List of additional client certificates
Syntax: | NWSSLTrustedCerts filename [filename] ...
Context: | server config
Status: | Base
Module: | mod_nw_ssl

Specifies a list of client certificate files (DER format) that are used when creating a proxied SSL connection. Each client certificate used by a server must be listed separately in its own .der file.

NWSSLUpgradeable Directive

Description: | Allows a connection to be upgraded to an SSL connection upon request
Syntax: | NWSSLUpgradeable [IP-address:]portnumber
Context: | server config
Status: | Base
Module: | mod_nw_ssl

Allow a connection that was created on the specified address and/or port to be upgraded to an SSL connection upon request from the client. The address and/or port must have already be defined previously with a Listen directive.

SecureListen Directive

Description: | Enables SSL encryption for the specified port
Syntax: | SecureListen [IP-address:]portnumber Certificate-Name [MUTUAL]
Context: | server config
Status: | Base
Module: | mod_nw_ssl

Specifies the port and the eDirectory based certificate name that will be used to enable SSL encryption. An optional third parameter also enables mutual authentication.


mod_proxy - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_proxy

Description: | HTTP/1.1 proxy/gateway server
Status: | Extension
Module Identifier: | proxy_module
Source File: | mod_proxy.c

Summary

Warning

Do not enable proxying with ProxyRequests until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

This module implements a proxy/gateway for Apache. It implements proxying capability for AJP13 (Apache JServe Protocol version 1.3), FTP, CONNECT (for SSL), HTTP/0.9, HTTP/1.0, and HTTP/1.1. The module can be configured to connect to other proxy modules for these and other protocols.

Apache's proxy features are divided into several modules in addition to mod_proxy: mod_proxy_http, mod_proxy_ftp, mod_proxy_ajp, mod_proxy_balancer, and mod_proxy_connect. Thus, if you want to use one or more of the particular proxy functions, load mod_proxy and the appropriate module(s) into the server (either statically at compile-time or dynamically via the LoadModule directive).

In addition, extended features are provided by other modules. Caching is provided by mod_cache and related modules. The ability to contact remote servers using the SSL/TLS protocol is provided by the SSLProxy* directives of mod_ssl. These additional modules will need to be loaded and configured to take advantage of these features.

See also

  • mod_cache
  • mod_proxy_http
  • mod_proxy_ftp
  • mod_proxy_connect
  • mod_proxy_balancer
  • mod_ssl

Forward Proxies and Reverse Proxies/Gateways

Apache can be configured in both a forward and reverse proxy (also known as gateway) mode.

An ordinary forward proxy is an intermediate server that sits between the client and the origin server. In order to get content from the origin server, the client sends a request to the proxy naming the origin server as the target and the proxy then requests the content from the origin server and returns it to the client. The client must be specially configured to use the forward proxy to access other sites.

A typical usage of a forward proxy is to provide Internet access to internal clients that are otherwise restricted by a firewall. The forward proxy can also use caching (as provided by mod_cache) to reduce network usage.

The forward proxy is activated using the ProxyRequests directive. Because forward proxies allow clients to access arbitrary sites through your server and to hide their true origin, it is essential that you secure your server so that only authorized clients can access the proxy before activating a forward proxy.

A reverse proxy (or gateway), by contrast, appears to the client just like an ordinary web server. No special configuration on the client is necessary. The client makes ordinary requests for content in the name-space of the reverse proxy. The reverse proxy then decides where to send those requests, and returns the content as if it was itself the origin.

A typical usage of a reverse proxy is to provide Internet users access to a server that is behind a firewall. Reverse proxies can also be used to balance load among several back-end servers, or to provide caching for a slower back-end server. In addition, reverse proxies can be used simply to bring several servers into the same URL space.

A reverse proxy is activated using the ProxyPass directive or the [P] flag to the RewriteRule directive. It is not necessary to turn ProxyRequests on in order to configure a reverse proxy.

Basic Examples

The examples below are only a very basic idea to help you get started. Please read the documentation on the individual directives.

In addition, if you wish to have caching enabled, consult the documentation from mod_cache.

Reverse Proxy

ProxyPass /foo http://foo.example.com/bar
ProxyPassReverse /foo http://foo.example.com/bar

Forward Proxy

ProxyRequests On
ProxyVia On

<Proxy *>
Order deny,allow
Deny from all
Allow from internal.example.com
 </Proxy>

Workers

The proxy manages the configuration of origin servers and their communication parameters in objects called workers. There are two built-in workers, the default forward proxy worker and the default reverse proxy worker. Additional workers can be configured explicitly.

The two default workers have a fixed configuration and will be used if no other worker matches the request. They do not use HTTP Keep-Alive or connection pooling. The TCP connections to the origin server will instead be opened and closed for each request.

Explicitly configured workers are identified by their URL. They are usually created and configured using ProxyPass or ProxyPassMatch when used for a reverse proxy:

ProxyPass /example http://backend.example.com connectiontimeout=5 timeout=30

This will create a worker associated with the origin server URL http://backend.example.com and using the given timeout values. When used in a forward proxy, workers are usually defined via the ProxySet directive:

ProxySet http://backend.example.com connectiontimeout=5 timeout=30

or alternatively using Proxy and ProxySet:

<Proxy http://backend.example.com>
ProxySet connectiontimeout=5 timeout=30 </Proxy>

Using explicitly configured workers in the forward mode is not very common, because forward proxies usually communicate with many different origin servers. Creating explicit workers for some of the origin servers can still be useful, if they are used very often. Explicitly configured workers have no concept of forward or reverse proxying by themselves. They encapsulate a common concept of communication with origin servers. A worker created by ProxyPass for use in a reverse proxy will be also used for forward proxy requests whenever the URL to the origin server matches the worker URL and vice versa.

The URL identifying a direct worker is the URL of its origin server including any path components given:

ProxyPass /examples http://backend.example.com/examples
ProxyPass /docs http://backend.example.com/docs

This example defines two different workers, each using a separate connection pool and configuration.

Worker Sharing

Worker sharing happens if the worker URLs overlap, which occurs when the URL of some worker is a leading substring of the URL of another worker defined later in the configuration file. In the following example

ProxyPass /apps http://backend.example.com/ timeout=60
ProxyPass /examples http://backend.example.com/examples timeout=10

the second worker isn't actually created. Instead the first worker is used. The benefit is, that there is only one connection pool, so connections are more often reused. Note that all configuration attributes given explicitly for the later worker and some configuration defaults will overwrite the configuration given for the first worker. This will be logged as a warning. In the above example the resulting timeout value for the URL /apps will be 10 instead of 60!

If you want to avoid worker sharing, sort your worker definitions by URL length, starting with the longest worker URLs. If you want to maximize worker sharing use the reverse sort order. See also the related warning about ordering ProxyPass directives.

Explicitly configured workers come in two flavors: direct workers and (load) balancer workers. They support many important configuration attributes which are described below in the ProxyPass directive. The same attributes can also be set using ProxySet.

The set of options available for a direct worker depends on the protocol, which is specified in the origin server URL. Available protocols include ajp, ftp, http and scgi.

Balancer workers are virtual workers that use direct workers known as their members to actually handle the requests. Each balancer can have multiple members. When it handles a request, it chooses a member based on the configured load balancing algorithm.

A balancer worker is created if its worker URL uses balancer as the protocol scheme. The balancer URL uniquely identifies the balancer worker. Members are added to a balancer using BalancerMember.

Controlling access to your proxy

You can control who can access your proxy via the <Proxy> control block as in the following example:

<Proxy *>
Order Deny,Allow
Deny from all
Allow from 192.168.0
 </Proxy>

For more information on access control directives, see mod_authz_host.

Strictly limiting access is essential if you are using a forward proxy (using the ProxyRequests directive). Otherwise, your server can be used by any client to access arbitrary hosts while hiding his or her true identity. This is dangerous both for your network and for the Internet at large. When using a reverse proxy (using the ProxyPass directive with ProxyRequests Off), access control is less critical because clients can only contact the hosts that you have specifically configured.

Slow Startup

If you're using the ProxyBlock directive, hostnames' IP addresses are looked up and cached during startup for later match test. This may take a few seconds (or more) depending on the speed with which the hostname lookups occur.

Intranet Proxy

An Apache proxy server situated in an intranet needs to forward external requests through the company's firewall (for this, configure the ProxyRemote directive to forward the respective scheme to the firewall proxy). However, when it has to access resources within the intranet, it can bypass the firewall when accessing hosts. The NoProxy directive is useful for specifying which hosts belong to the intranet and should be accessed directly.

Users within an intranet tend to omit the local domain name from their WWW requests, thus requesting "http://somehost/" instead of http://somehost.example.com/. Some commercial proxy servers let them get away with this and simply serve the request, implying a configured local domain. When the ProxyDomain directive is used and the server is configured for proxy service, Apache can return a redirect response and send the client to the correct, fully qualified, server address. This is the preferred method since the user's bookmark files will then contain fully qualified hosts.

Protocol Adjustments

For circumstances where mod_proxy is sending requests to an origin server that doesn't properly implement keepalives or HTTP/1.1, there are two environment variables that can force the request to use HTTP/1.0 with no keepalive. These are set via the SetEnv directive.

These are the force-proxy-request-1.0 and proxy-nokeepalive notes.

<Location /buggyappserver/>
ProxyPass http://buggyappserver:7001/foo/
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
 </Location>

Request Bodies

Some request methods such as POST include a request body. The HTTP protocol requires that requests which include a body either use chunked transfer encoding or send a Content-Length request header. When passing these requests on to the origin server, mod_proxy_http will always attempt to send the Content-Length. But if the body is large and the original request used chunked encoding, then chunked encoding may also be used in the upstream request. You can control this selection using environment variables. Setting proxy-sendcl ensures maximum compatibility with upstream servers by always sending the Content-Length, while setting proxy-sendchunked minimizes resource usage by using chunked encoding.

Reverse Proxy Request Headers

When acting in a reverse-proxy mode (using the ProxyPass directive, for example), mod_proxy_http adds several request headers in order to pass information to the origin server. These headers are:

X-Forwarded-For
The IP address of the client.
X-Forwarded-Host
The original host requested by the client in the Host HTTP request header.
X-Forwarded-Server
The hostname of the proxy server.

Be careful when using these headers on the origin server, since they will contain more than one (comma-separated) value if the original request already contained one of these headers. For example, you can use %{X-Forwarded-For}i in the log format string of the origin server to log the original clients IP address, but you may get more than one address if the request passes through several proxies.

See also the ProxyPreserveHost and ProxyVia directives, which control other request headers.

AllowCONNECT Directive

Description: | Ports that are allowed to CONNECT through the proxy
Syntax: | AllowCONNECT port [port] ...
Default: | AllowCONNECT 443 563
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

The AllowCONNECT directive specifies a list of port numbers to which the proxy CONNECT method may connect. Today's browsers use this method when a https connection is requested and proxy tunneling over HTTP is in effect.

By default, only the default https port (443) and the default snews port (563) are enabled. Use the AllowCONNECT directive to override this default and allow connections to the listed ports only.

Note that you'll need to have mod_proxy_connect present in the server in order to get the support for the CONNECT at all.

BalancerMember Directive

Description: | Add a member to a load balancing group
Syntax: | BalancerMember [balancerurl] url [key=value [key=value ...]]
Context: | directory
Status: | Extension
Module: | mod_proxy
Compatibility: | BalancerMember is only available in Apache 2.2 and later.

This directive adds a member to a load balancing group. It could be used within a <Proxy balancer://...> container directive, and can take any of the key value pairs available to ProxyPass directives.

The balancerurl is only needed when not in <Proxy balancer://...> container directive. It corresponds to the url of a balancer defined in ProxyPass directive.

NoProxy Directive

Description: | Hosts, domains, or networks that will be connected to directly
Syntax: | NoProxy host [host] ...
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

This directive is only useful for Apache proxy servers within intranets. The NoProxy directive specifies a list of subnets, IP addresses, hosts and/or domains, separated by spaces. A request to a host which matches one or more of these is always served directly, without forwarding to the configured ProxyRemote proxy server(s).

Example

ProxyRemote * http://firewall.example.com:81
NoProxy .example.com 192.168.112.0/21

The host arguments to the NoProxy directive are one of the following type list:

Domain

A Domain is a partially qualified DNS domain name, preceded by a period. It represents a list of hosts which logically belong to the same DNS domain or zone (i.e., the suffixes of the hostnames are all ending in Domain).

Examples

.com .apache.org.

To distinguish Domains from Hostnames (both syntactically and semantically; a DNS domain can have a DNS A record, too!), Domains are always written with a leading period.

Note

Domain name comparisons are done without regard to the case, and Domains are always assumed to be anchored in the root of the DNS tree, therefore two domains .ExAmple.com and .example.com. (note the trailing period) are considered equal. Since a domain comparison does not involve a DNS lookup, it is much more efficient than subnet comparison.

SubNet

A SubNet is a partially qualified internet address in numeric (dotted quad) form, optionally followed by a slash and the netmask, specified as the number of significant bits in the SubNet. It is used to represent a subnet of hosts which can be reached over a common network interface. In the absence of the explicit net mask it is assumed that omitted (or zero valued) trailing digits specify the mask. (In this case, the netmask can only be multiples of 8 bits wide.) Examples:

192.168 or 192.168.0.0
the subnet 192.168.0.0 with an implied netmask of 16 valid bits (sometimes used in the netmask form 255.255.0.0)
192.168.112.0/21
the subnet 192.168.112.0/21 with a netmask of 21 valid bits (also used in the form 255.255.248.0)

As a degenerate case, a SubNet with 32 valid bits is the equivalent to an IPAddr, while a SubNet with zero valid bits (e.g., 0.0.0.0/0) is the same as the constant _Default_, matching any IP address.

IPAddr

A IPAddr represents a fully qualified internet address in numeric (dotted quad) form. Usually, this address represents a host, but there need not necessarily be a DNS domain name connected with the address.

Example

192.168.123.7

Note

An IPAddr does not need to be resolved by the DNS system, so it can result in more effective apache performance.

Hostname

A Hostname is a fully qualified DNS domain name which can be resolved to one or more IPAddrs via the DNS domain name service. It represents a logical host (in contrast to Domains, see above) and must be resolvable to at least one IPAddr (or often to a list of hosts with different IPAddrs).

Examples

prep.ai.example.com
www.apache.org

Note

In many situations, it is more effective to specify an IPAddr in place of a Hostname since a DNS lookup can be avoided. Name resolution in Apache can take a remarkable deal of time when the connection to the name server uses a slow PPP link.

Hostname comparisons are done without regard to the case, and Hostnames are always assumed to be anchored in the root of the DNS tree, therefore two hosts WWW.ExAmple.com and www.example.com. (note the trailing period) are considered equal.

See also

  • DNS Issues

<Proxy> Directive

Description: | Container for directives applied to proxied resources
Syntax: | <Proxy wildcard-url> ...</Proxy>
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

Directives placed in <Proxy> sections apply only to matching proxied content. Shell-style wildcards are allowed.

For example, the following will allow only hosts in yournetwork.example.com to access content via your proxy server:

<Proxy *>
Order Deny,Allow
Deny from all
Allow from yournetwork.example.com
 </Proxy>

The following example will process all files in the foo directory of example.com through the INCLUDES filter when they are sent through the proxy server:

<Proxy http://example.com/foo/*>
SetOutputFilter INCLUDES
 </Proxy>

Differences from the Location configuration section

A backend URL matches the configuration section if it begins with the the wildcard-url string, even if the last path segment in the directive only matches a prefix of the backend URL. For example, <Proxy http://example.com/foo> matches all of http://example.com/foo, http://example.com/foo/bar, and http://example.com/foobar. The matching of the final URL differs from the behavior of the <Location> section, which for purposes of this note treats the final path component as if it ended in a slash.

For more control over the matching, see <ProxyMatch>.

See also

  • <ProxyMatch>

ProxyBadHeader Directive

Description: | Determines how to handle bad header lines in a response
Syntax: | ProxyBadHeader IsError|Ignore|StartBody
Default: | ProxyBadHeader IsError
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy
Compatibility: | Available in Apache 2.0.44 and later

The ProxyBadHeader directive determines the behaviour of mod_proxy if it receives syntactically invalid response header lines (i.e. containing no colon) from the origin server. The following arguments are possible:

IsError
Abort the request and end up with a 502 (Bad Gateway) response. This is the default behaviour.
Ignore
Treat bad header lines as if they weren't sent.
StartBody
When receiving the first bad header line, finish reading the headers and treat the remainder as body. This helps to work around buggy backend servers which forget to insert an empty line between the headers and the body.

ProxyBlock Directive

Description: | Words, hosts, or domains that are banned from being proxied
Syntax: | ProxyBlock *|word|host|domain [word|host|domain] ...
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

The ProxyBlock directive specifies a list of words, hosts and/or domains, separated by spaces. HTTP, HTTPS, and FTP document requests to sites whose names contain matched words, hosts or domains are blocked by the proxy server. The proxy module will also attempt to determine IP addresses of list items which may be hostnames during startup, and cache them for match test as well. That may slow down the startup time of the server.

Example

ProxyBlock joes-garage.com some-host.co.uk rocky.wotsamattau.edu

rocky.wotsamattau.edu would also be matched if referenced by IP address.

Note that wotsamattau would also be sufficient to match wotsamattau.edu.

Note also that

ProxyBlock *

blocks connections to all sites.

ProxyDomain Directive

Description: | Default domain name for proxied requests
Syntax: | ProxyDomain Domain
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

This directive is only useful for Apache proxy servers within intranets. The ProxyDomain directive specifies the default domain which the apache proxy server will belong to. If a request to a host without a domain name is encountered, a redirection response to the same host with the configured Domain appended will be generated.

Example

ProxyRemote * http://firewall.example.com:81
NoProxy .example.com 192.168.112.0/21
ProxyDomain .example.com

ProxyErrorOverride Directive

Description: | Override error pages for proxied content
Syntax: | ProxyErrorOverride On|Off
Default: | ProxyErrorOverride Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy
Compatibility: | Available in version 2.0 and later

This directive is useful for reverse-proxy setups, where you want to have a common look and feel on the error pages seen by the end user. This also allows for included files (via mod_include's SSI) to get the error code and act accordingly (default behavior would display the error page of the proxied server, turning this on shows the SSI Error message).

This directive does not affect the processing of informational (1xx), normal success (2xx), or redirect (3xx) responses.

ProxyFtpDirCharset Directive

Description: | Define the character set for proxied FTP listings
Syntax: | ProxyFtpDirCharset character set
Default: | ProxyFtpDirCharset ISO-8859-1
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy
Compatibility: | Available in Apache 2.2.7 and later

The ProxyFtpDirCharset directive defines the character set to be set for FTP directory listings in HTML generated by mod_proxy_ftp.

ProxyIOBufferSize Directive

Description: | Determine size of internal data throughput buffer
Syntax: | ProxyIOBufferSize bytes
Default: | ProxyIOBufferSize 8192
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

The ProxyIOBufferSize directive adjusts the size of the internal buffer, which is used as a scratchpad for the data between input and output. The size must be at least 8192.

When the mod_proxy_ajp module is used, this value is aligned to a 1024 byte boundary, and values larger than 65536 are set to 65536 in accordance with the AJP protocol.

In almost every case there's no reason to change that value.

<ProxyMatch> Directive

Description: | Container for directives applied to regular-expression-matched proxied resources
Syntax: | <ProxyMatch regex> ...</ProxyMatch>
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

The <ProxyMatch> directive is identical to the <Proxy> directive, except it matches URLs using regular expressions.

See also

  • <Proxy>

ProxyMaxForwards Directive

Description: | Maximium number of proxies that a request can be forwarded through
Syntax: | ProxyMaxForwards number
Default: | ProxyMaxForwards -1
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy
Compatibility: | Available in Apache 2.0 and later; default behaviour changed in 2.2.7

The ProxyMaxForwards directive specifies the maximum number of proxies through which a request may pass, if there's no Max-Forwards header supplied with the request. This may be set to prevent infinite proxy loops, or a DoS attack.

Example

ProxyMaxForwards 15

Note that setting ProxyMaxForwards is a violation of the HTTP/1.1 protocol (RFC2616), which forbids a Proxy setting Max-Forwards if the Client didn't set it. Earlier Apache versions would always set it. A negative ProxyMaxForwards value, including the default -1, gives you protocol-compliant behaviour, but may leave you open to loops.

ProxyPass Directive

Description: | Maps remote servers into the local server URL-space
Syntax: | ProxyPass [path] !|url [key=value [key=value ...]] [nocanon] [interpolate]
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy

This directive allows remote servers to be mapped into the space of the local server; the local server does not act as a proxy in the conventional sense, but appears to be a mirror of the remote server. The local server is often called a reverse proxy or gateway. The path is the name of a local virtual path; url is a partial URL for the remote server and cannot include a query string.

The ProxyRequests directive should usually be set off when using ProxyPass.

Suppose the local server has address http://example.com/; then

ProxyPass /mirror/foo/ http://backend.example.com/

will cause a local request for http://example.com/mirror/foo/bar to be internally converted into a proxy request to http://backend.example.com/bar.

If the first argument ends with a trailing /, the second argument should also end with a trailing / and vice versa. Otherwise the resulting requests to the backend may miss some needed slashes and do not deliver the expected results.

The ! directive is useful in situations where you don't want to reverse-proxy a subdirectory, e.g.

ProxyPass /mirror/foo/i !
ProxyPass /mirror/foo http://backend.example.com

will proxy all requests to /mirror/foo to backend.example.com except requests made to /mirror/foo/i.

Ordering ProxyPass Directives

The configured ProxyPass and ProxyPassMatch rules are checked in the order of configuration. The first rule that matches wins. So usually you should sort conflicting ProxyPass rules starting with the longest URLs first. Otherwise later rules for longer URLS will be hidden by any earlier rule which uses a leading substring of the URL. Note that there is some relation with worker sharing.

For the same reasons exclusions must come before the general ProxyPass directives.

In Apache HTTP Server 2.1 and later, mod_proxy supports pooled connections to a backend server. Connections created on demand can be retained in a pool for future use. Limits on the pool size and other settings can be coded on the ProxyPass directive using key=value parameters, described in the table below.

By default, mod_proxy will allow and retain the maximum number of connections that could be used simultaneously by that web server child process. Use the max parameter to reduce the number from the default. Use the ttl parameter to set an optional time to live; connections which have been unused for at least ttl seconds will be closed. ttl can be used to avoid using a connection which is subject to closing because of the backend server's keep-alive timeout.

The pool of connections is maintained per web server child process, and max and other settings are not coordinated among all child processes, except when only one child process is allowed by configuration or MPM design.

Example

ProxyPass /example http://backend.example.com max=20 ttl=120 retry=300

Parameter | Default | Description
min | 0 | Minimum number of connection pool entries, unrelated to the actual number of connections. This only needs to be modified from the default for special circumstances where heap memory associated with the backend connections should be preallocated or retained.
max | 1...n | Maximum number of connections that will be allowed to the backend server. The default for this limit is the number of threads per process in the active MPM. In the Prefork MPM, this is always 1, while with other MPMs it is controlled by the ThreadsPerChild directive.
smax | max | Retained connection pool entries above this limit are freed during certain operations if they have been unused for longer than the time to live, controlled by the ttl parameter. If the connection pool entry has an associated connection, it will be closed. This only needs to be modified from the default for special circumstances where connection pool entries and any associated connections which have exceeded the time to live need to be freed or closed more aggressively.
acquire - If set this will be the maximum time to wait for a free connection in the connection pool, in milliseconds. If there are no free connections in the pool the Apache will return SERVER_BUSY status to the client.
connectiontimeout | timeout | Connect timeout in seconds. The number of seconds Apache waits for the creation of a connection to the backend to complete. By adding a postfix of ms the timeout can be also set in milliseconds.
disablereuse | Off | This parameter should be used when you want to force mod_proxy to immediately close a connection to the backend after being used, and thus, disable its persistent connection and pool for that backend. This helps in various situations where a firewall between Apache and the backend server (regardless of protocol) tends to silently drop connections or when backends themselves may be under round- robin DNS. To disable connection pooling reuse, set this property value to On.
flushpackets | off | Determines whether the proxy module will auto-flush the output brigade after each "chunk" of data. 'off' means that it will flush only when needed, 'on' means after each chunk is sent and 'auto' means poll/wait for a period of time and flush if no input has been received for 'flushwait' milliseconds. Currently this is in effect only for AJP.
flushwait | 10 | The time to wait for additional input, in milliseconds, before flushing the output brigade if 'flushpackets' is 'auto'.
keepalive Off

This parameter should be used when you have a firewall between your Apache and the backend server, who tend to drop inactive connections. This flag will tell the Operating System to send KEEP_ALIVE messages on inactive connections and thus prevent the firewall to drop the connection. To enable keepalive set this property value to On.

The frequency of initial and subsequent TCP keepalive probes depends on global OS settings, and may be as high as 2 hours. To be useful, the frequency configured in the OS must be smaller than the threshold used by the firewall.

lbset | 0 | Sets the load balancer cluster set that the worker is a member of. The load balancer will try all members of a lower numbered lbset before trying higher numbered ones.
ping | 0 | Ping property tells webserver to send a CPING request on ajp13 connection before forwarding a request. The parameter is the delay in seconds to wait for the CPONG reply. This features has been added to avoid problem with hung and busy Tomcat's and require ajp13 ping/pong support which has been implemented on Tomcat 3.3.2+, 4.1.28+ and 5.0.13+. This will increase the network traffic during the normal operation which could be an issue, but it will lower the traffic in case some of the cluster nodes are down or busy. Currently this has an effect only for AJP. By adding a postfix of ms the delay can be also set in milliseconds.
loadfactor | 1 | Worker load factor. Used with BalancerMember. It is a number between 1 and 100 and defines the normalized weighted load applied to the worker.
redirect - Redirection Route of the worker. This value is usually set dynamically to enable safe removal of the node from the cluster. If set all requests without session id will be redirected to the BalancerMember that has route parameter equal as this value.
retry | 60 | Connection pool worker retry timeout in seconds. If the connection pool worker to the backend server is in the error state, Apache will not forward any requests to that server until the timeout expires. This enables to shut down the backend server for maintenance, and bring it back online later. A value of 0 means always retry workers in an error state with no timeout.
route - Route of the worker when used inside load balancer. The route is a value appended to session id.
status - Single letter value defining the initial status of this worker: 'D' is disabled, 'S' is stopped, 'I' is ignore-errors, 'H' is hot-standby and 'E' is in an error state. Status can be set (which is the default) by prepending with '+' or cleared by prepending with '-'. Thus, a setting of 'S-E' sets this worker to Stopped and clears the in-error flag.
timeout | ProxyTimeout | Connection timeout in seconds. The number of seconds Apache waits for data sent by / to the backend.
ttl - Time to live for inactive connections and associated connection pool entries, in seconds. Once reaching this limit, a connection will not be used again; it will be closed at some later time.

If the ProxyPass directive scheme starts with the balancer:// (eg: balancer://cluster/, any path information is ignored) then a virtual worker that does not really communicate with the backend server will be created. Instead it is responsible for the management of several "real" workers. In that case the special set of parameters can be add to this virtual worker. See mod_proxy_balancer for more information about how the balancer works.

Parameter | Default | Description
lbmethod | byrequests | Balancer load-balance method. Select the load-balancing scheduler method to use. Either byrequests, to perform weighted request counting, bytraffic, to perform weighted traffic byte count balancing, or bybusyness (Apache HTTP Server 2.2.10 and later), to perform pending request balancing. Default is byrequests.
maxattempts | One less than the number of workers, or 1 with a single worker. | Maximum number of failover attempts before giving up.
nofailover | Off | If set to On the session will break if the worker is in error state or disabled. Set this value to On if backend servers do not support session replication.
stickysession | - | Balancer sticky session name. The value is usually set to something like JSESSIONID or PHPSESSIONID, and it depends on the backend application server that support sessions. If the backend application server uses different name for cookies and url encoded id (like servlet containers) use | to to separate them. The first part is for the cookie the second for the path.
scolonpathdelim | Off | If set to On the semi-colon character ';' will be used as an additional sticky session path deliminator/separator. This is mainly used to emulate mod_jk's behavior when dealing with paths such as JSESSIONID=6736bcf34;foo=aabfa
timeout | 0 | Balancer timeout in seconds. If set this will be the maximum time to wait for a free worker. Default is not to wait.
failonstatus | - | A single or comma-separated list of HTTP status codes. If set this will force the worker into error state when the backend returns any status code in the list. Worker recovery behaves the same as other worker errors. Available with Apache HTTP Server 2.2.17 and later.
failontimeout | Off | If set, an IO read timeout after a request is sent to the backend will force the worker into error state. Worker recovery behaves the same as other worker errors. Available with Apache HTTP Server 2.2.25 and later.
forcerecovery | On | Force the immediate recovery of all workers without considering the retry parameter of the workers if all workers of a balancer are in error state. There might be cases where an already overloaded backend can get into deeper trouble if the recovery of all workers is enforced without considering the retry parameter of each worker. In this case set to Off. Available with Apache HTTP Server 2.2.23 and later.

A sample balancer setup

ProxyPass /special-area http://special.example.com smax=5 max=10
ProxyPass / balancer://mycluster/ stickysession=JSESSIONID|jsessionid nofailover=On
<Proxy balancer://mycluster>
BalancerMember ajp://1.2.3.4:8009
BalancerMember ajp://1.2.3.5:8009 loadfactor=20
# Less powerful server, don't send as many requests there,
BalancerMember ajp://1.2.3.6:8009 loadfactor=5
 </Proxy>

Setting up a hot-standby, that will only be used if no other members are available

ProxyPass / balancer://hotcluster/
<Proxy balancer://hotcluster>
BalancerMember ajp://1.2.3.4:8009 loadfactor=1
BalancerMember ajp://1.2.3.5:8009 loadfactor=2
# The below is the hot standby
BalancerMember ajp://1.2.3.6:8009 status=+H
ProxySet lbmethod=bytraffic </Proxy>

Normally, mod_proxy will canonicalise ProxyPassed URLs. But this may be incompatible with some backends, particularly those that make use of PATH_INFO. The optional nocanon keyword suppresses this, and passes the URL path "raw" to the backend. Note that may affect the security of your backend, as it removes the normal limited protection against URL-based attacks provided by the proxy.

When used inside a <Location> section, the first argument is omitted and the local directory is obtained from the <Location>. The same will occur inside a <LocationMatch> section, however ProxyPass does not interpret the regexp as such, so it is necessary to use ProxyPassMatch in this situation instead.

This directive is not supported in <Directory> or <Files> sections.

If you require a more flexible reverse-proxy configuration, see the RewriteRule directive with the [P] flag.

The optional interpolate keyword (available in httpd 2.2.9 and later), in combination with ProxyPassInterpolateEnv causes the ProxyPass to interpolate environment variables, using the syntax ${VARNAME}. Note that many of the standard CGI-derived environment variables will not exist when this interpolation happens, so you may still have to resort to mod_rewrite for complex rules. Also note that interpolation is not supported within the scheme portion of a URL. Dynamic determination of the scheme can be accomplished with mod_rewrite as in the following example.

RewriteEngine On

RewriteCond %{HTTPS} =off
RewriteRule . - [E=protocol:http]
RewriteCond %{HTTPS} =on
RewriteRule . - [E=protocol:https]

RewriteRule ^/mirror/foo/(.*) %{ENV:protocol}://backend.example.com/$1 [P]
ProxyPassReverse  /mirror/foo/ http://backend.example.com/
ProxyPassReverse  /mirror/foo/ https://backend.example.com/

ProxyPassInterpolateEnv Directive

Description: | Enable Environment Variable interpolation in Reverse Proxy configurations
Syntax: | ProxyPassInterpolateEnv On|Off
Default: | ProxyPassInterpolateEnv Off
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy
Compatibility: | Available in httpd 2.2.9 and later

This directive, together with the interpolate argument to ProxyPass, ProxyPassReverse, ProxyPassReverseCookieDomain and ProxyPassReverseCookiePath enables reverse proxies to be dynamically configured using environment variables, which may be set by another module such as mod_rewrite. It affects the ProxyPass, ProxyPassReverse, ProxyPassReverseCookieDomain, and ProxyPassReverseCookiePath directives, and causes them to substitute the value of an environment variable varname for the string ${varname} in configuration directives (if the interpolate option is set).

Keep this turned off (for server performance) unless you need it!

ProxyPassMatch Directive

Description: | Maps remote servers into the local server URL-space using regular expressions
Syntax: | ProxyPassMatch [regex] !|url [key=value [key=value ...]]
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy
Compatibility: | available in Apache 2.2.5 and later

This directive is equivalent to ProxyPass, but makes use of regular expressions, instead of simple prefix matching. The supplied regular expression is matched against the url, and if it matches, the server will substitute any parenthesized matches into the given string and use it as a new url.

Suppose the local server has address http://example.com/; then

ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com$1

will cause a local request for http://example.com/foo/bar.gif to be internally converted into a proxy request to http://backend.example.com/foo/bar.gif.

Note

The URL argument must be parsable as a URL before regexp substitutions (as well as after). This limits the matches you can use. For instance, if we had used

ProxyPassMatch ^(/.*\.gif)$ http://backend.example.com:8000$1

in our previous example, it would fail with a syntax error at server startup. This is a bug (PR 46665 in the ASF bugzilla), and the workaround is to reformulate the match:

ProxyPassMatch ^/(.*\.gif)$ http://backend.example.com:8000/$1

The ! directive is useful in situations where you don't want to reverse-proxy a subdirectory.

When used inside a <LocationMatch> section, the first argument is omitted and the regexp is obtained from the <LocationMatch>.

If you require a more flexible reverse-proxy configuration, see the RewriteRule directive with the [P] flag.

Security Warning

Take care when constructing the target URL of the rule, considering the security impact from allowing the client influence over the set of URLs to which your server will act as a proxy. Ensure that the scheme and hostname part of the URL is either fixed, or does not allow the client undue influence.

ProxyPassReverse Directive

Description: | Adjusts the URL in HTTP response headers sent from a reverse proxied server
Syntax: | ProxyPassReverse [path] url [interpolate]
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy

This directive lets Apache adjust the URL in the Location, Content-Location and URI headers on HTTP redirect responses. This is essential when Apache is used as a reverse proxy (or gateway) to avoid by-passing the reverse proxy because of HTTP redirects on the backend servers which stay behind the reverse proxy.

Only the HTTP response headers specifically mentioned above will be rewritten. Apache will not rewrite other response headers, nor will it rewrite URL references inside HTML pages. This means that if the proxied content contains absolute URL references, they will by-pass the proxy. A third-party module that will look inside the HTML and rewrite URL references is Nick Kew's mod_proxy_html.

path is the name of a local virtual path. url is a partial URL for the remote server - the same way they are used for the ProxyPass directive.

For example, suppose the local server has address http://example.com/; then

ProxyPass /mirror/foo/ http://backend.example.com/
ProxyPassReverse /mirror/foo/ http://backend.example.com/
ProxyPassReverseCookieDomain backend.example.com public.example.com
ProxyPassReverseCookiePath / /mirror/foo/

will not only cause a local request for the http://example.com/mirror/foo/bar to be internally converted into a proxy request to http://backend.example.com/bar (the functionality ProxyPass provides here). It also takes care of redirects the server backend.example.com sends: when http://backend.example.com/bar is redirected by him to http://backend.example.com/quux Apache adjusts this to http://example.com/mirror/foo/quux before forwarding the HTTP redirect response to the client. Note that the hostname used for constructing the URL is chosen in respect to the setting of the UseCanonicalName directive.

Note that this ProxyPassReverse directive can also be used in conjunction with the proxy pass-through feature (RewriteRule ... [P]) from mod_rewrite because it doesn't depend on a corresponding ProxyPass directive.

The optional interpolate keyword (available in httpd 2.2.9 and later), used together with ProxyPassInterpolateEnv, enables interpolation of environment variables specified using the format ${VARNAME}. Note that interpolation is not supported within the scheme portion of a URL.

When used inside a <Location> section, the first argument is omitted and the local directory is obtained from the <Location>. The same occurs inside a <LocationMatch> section, but will probably not work as intended, as ProxyPassReverse will interpret the regexp literally as a path; if needed in this situation, specify the ProxyPassReverse outside the section, or in a separate <Location> section.

This directive is not supported in <Directory> or <Files> sections.

ProxyPassReverseCookieDomain Directive

Description: | Adjusts the Domain string in Set-Cookie headers from a reverse- proxied server
Syntax: | ProxyPassReverseCookieDomain internal-domain public-domain [interpolate]
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy

Usage is basically similar to ProxyPassReverse, but instead of rewriting headers that are a URL, this rewrites the domain string in Set-Cookie headers.

ProxyPassReverseCookiePath Directive

Description: | Adjusts the Path string in Set-Cookie headers from a reverse- proxied server
Syntax: | ProxyPassReverseCookiePath internal-path public-path [interpolate]
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy

Useful in conjunction with ProxyPassReverse in situations where backend URL paths are mapped to public paths on the reverse proxy. This directive rewrites the path string in Set-Cookie headers. If the beginning of the cookie path matches internal-path, the cookie path will be replaced with public-path.

In the example given with ProxyPassReverse, the directive:

ProxyPassReverseCookiePath / /mirror/foo/

will rewrite a cookie with backend path / (or /example or, in fact, anything) to /mirror/foo/.

ProxyPreserveHost Directive

Description: | Use incoming Host HTTP request header for proxy request
Syntax: | ProxyPreserveHost On|Off
Default: | ProxyPreserveHost Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy
Compatibility: | Available in Apache 2.0.31 and later.

When enabled, this option will pass the Host: line from the incoming request to the proxied host, instead of the hostname specified in the ProxyPass line.

This option should normally be turned Off. It is mostly useful in special configurations like proxied mass name-based virtual hosting, where the original Host header needs to be evaluated by the backend server.

ProxyReceiveBufferSize Directive

Description: | Network buffer size for proxied HTTP and FTP connections
Syntax: | ProxyReceiveBufferSize bytes
Default: | ProxyReceiveBufferSize 0
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

The ProxyReceiveBufferSize directive specifies an explicit (TCP/IP) network buffer size for proxied HTTP and FTP connections, for increased throughput. It has to be greater than 512 or set to 0 to indicate that the system's default buffer size should be used.

Example

ProxyReceiveBufferSize 2048

ProxyRemote Directive

Description: | Remote proxy used to handle certain requests
Syntax: | ProxyRemote match remote-server
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

This defines remote proxies to this proxy. match is either the name of a URL-scheme that the remote server supports, or a partial URL for which the remote server should be used, or * to indicate the server should be contacted for all requests. remote-server is a partial URL for the remote server. Syntax:

remote-server = scheme://hostname[:port]

scheme is effectively the protocol that should be used to communicate with the remote server; only http and https are supported by this module. When using https, the requests are forwarded through the remote proxy using the HTTP CONNECT method.

Example

ProxyRemote http://goodguys.example.com/ http://mirrorguys.example.com:8000
ProxyRemote * http://cleverproxy.localdomain
ProxyRemote ftp http://ftpproxy.mydomain:8080

In the last example, the proxy will forward FTP requests, encapsulated as yet another HTTP proxy request, to another proxy which can handle them.

This option also supports reverse proxy configuration - a backend webserver can be embedded within a virtualhost URL space even if that server is hidden by another forward proxy.

ProxyRemoteMatch Directive

Description: | Remote proxy used to handle requests matched by regular expressions
Syntax: | ProxyRemoteMatch regex remote-server
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

The ProxyRemoteMatch is identical to the ProxyRemote directive, except the first argument is a regular expression match against the requested URL.

ProxyRequests Directive

Description: | Enables forward (standard) proxy requests
Syntax: | ProxyRequests On|Off
Default: | ProxyRequests Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

This allows or prevents Apache from functioning as a forward proxy server. (Setting ProxyRequests to Off does not disable use of the ProxyPass directive.)

In a typical reverse proxy or gateway configuration, this option should be set to Off.

In order to get the functionality of proxying HTTP or FTP sites, you need also mod_proxy_http or mod_proxy_ftp (or both) present in the server.

In order to get the functionality of (forward) proxying HTTPS sites, you need mod_proxy_connect enabled in the server.

Warning

Do not enable proxying with ProxyRequests until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

See also

  • Forward and Reverse Proxies/Gateways

ProxySet Directive

Description: | Set various Proxy balancer or member parameters
Syntax: | ProxySet url key=value [key=value ...]
Context: | directory
Status: | Extension
Module: | mod_proxy
Compatibility: | ProxySet is only available in Apache 2.2 and later.

This directive is used as an alternate method of setting any of the parameters available to Proxy balancers and workers normally done via the ProxyPass directive. If used within a <Proxy balancer url|worker url> container directive, the url argument is not required. As a side effect the respective balancer or worker gets created. This can be useful when doing reverse proxying via a RewriteRule instead of a ProxyPass directive.

<Proxy balancer://hotcluster>
BalancerMember http://www2.example.com:8080 loadfactor=1
BalancerMember http://www3.example.com:8080 loadfactor=2
ProxySet lbmethod=bytraffic
 </Proxy>

<Proxy http://backend>
ProxySet keepalive=On
 </Proxy>

ProxySet balancer://foo lbmethod=bytraffic timeout=15

ProxySet ajp://backend:7001 timeout=15

Warning

Keep in mind that the same parameter key can have a different meaning depending whether it is applied to a balancer or a worker as shown by the two examples above regarding timeout.

ProxyStatus Directive

Description: | Show Proxy LoadBalancer status in mod_status
Syntax: | ProxyStatus Off|On|Full
Default: | ProxyStatus Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy
Compatibility: | Available in version 2.2 and later

This directive determines whether or not proxy loadbalancer status data is displayed via the mod_status server-status page.

Note

Full is synonymous with On

ProxyTimeout Directive

Description: | Network timeout for proxied requests
Syntax: | ProxyTimeout seconds
Default: | Value of Timeout
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy
Compatibility: | Available in Apache 2.0.31 and later

This directive allows a user to specify a timeout on proxy requests. This is useful when you have a slow/buggy appserver which hangs, and you would rather just return a timeout and fail gracefully instead of waiting however long it takes the server to return.

ProxyVia Directive

Description: | Information provided in the Via HTTP response header for proxied requests
Syntax: | ProxyVia On|Off|Full|Block
Default: | ProxyVia Off
Context: | server config, virtual host
Status: | Extension
Module: | mod_proxy

This directive controls the use of the Via: HTTP header by the proxy. Its intended use is to control the flow of proxy requests along a chain of proxy servers. See RFC 2616 (HTTP/1.1), section 14.45 for an explanation of Via: header lines.

  • If set to Off, which is the default, no special processing is performed. If a request or reply contains a Via: header, it is passed through unchanged.
  • If set to On, each request and reply will get a Via: header line added for the current host.
  • If set to Full, each generated Via: header line will additionally have the Apache server version shown as a Via: comment field.
  • If set to Block, every proxy request will have all its Via: header lines removed. No new Via: header will be generated.


mod_proxy_ajp - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_proxy_ajp

Description: | AJP support module for mod_proxy
Status: | Extension
Module Identifier: | proxy_ajp_module
Source File: | mod_proxy_ajp.c
Compatibility: | Available in version 2.1 and later

Summary

This module requires the service of mod_proxy. It provides support for the Apache JServ Protocol version 1.3 (hereafter AJP13).

Thus, in order to get the ability of handling AJP13 protocol, mod_proxy and mod_proxy_ajp have to be present in the server.

Warning

Do not enable proxying until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

See also

  • mod_proxy
  • Environment Variable documentation

Usage

This module is used to reverse proxy to a backend application server (e.g. Apache Tomcat) using the AJP13 protocol. The usage is similar to an HTTP reverse proxy, but uses the ajp:// prefix:

Simple Reverse Proxy

ProxyPass /app ajp://backend.example.com:8009/app

Balancers may also be used:

Balancer Reverse Proxy

<Proxy balancer://cluster>
BalancerMember ajp://app1.example.com:8009 loadfactor=1
BalancerMember ajp://app2.example.com:8009 loadfactor=2
ProxySet lbmethod=bytraffic
 </Proxy>
ProxyPass /app balancer://cluster/app

Note that usually no ProxyPassReverse directive is necessary. The AJP request includes the original host header given to the proxy, and the application server can be expected to generate self-referential headers relative to this host, so no rewriting is necessary.

The main exception is when the URL path on the proxy differs from that on the backend. In this case, a redirect header can be rewritten relative to the original host URL (not the backend ajp:// URL), for example:

Rewriting Proxied Path

ProxyPass /apps/foo ajp://backend.example.com:8009/foo
ProxyPassReverse /apps/foo http://www.example.com/foo

However, it is usually better to deploy the application on the backend server at the same path as the proxy rather than to take this approach.

Environment Variables

Environment variables whose names have the prefix AJP_ are forwarded to the origin server as AJP request attributes (with the AJP_ prefix removed from the name of the key).

Overview of the protocol

The AJP13 protocol is packet-oriented. A binary format was presumably chosen over the more readable plain text for reasons of performance. The web server communicates with the servlet container over TCP connections. To cut down on the expensive process of socket creation, the web server will attempt to maintain persistent TCP connections to the servlet container, and to reuse a connection for multiple request/response cycles.

Once a connection is assigned to a particular request, it will not be used for any others until the request-handling cycle has terminated. In other words, requests are not multiplexed over connections. This makes for much simpler code at either end of the connection, although it does cause more connections to be open at once.

Once the web server has opened a connection to the servlet container, the connection can be in one of the following states:

  • Idle
    No request is being handled over this connection.
  • Assigned
    The connection is handling a specific request.

Once a connection is assigned to handle a particular request, the basic request information (e.g. HTTP headers, etc) is sent over the connection in a highly condensed form (e.g. common strings are encoded as integers). Details of that format are below in Request Packet Structure. If there is a body to the request (content-length > 0), that is sent in a separate packet immediately after.

At this point, the servlet container is presumably ready to start processing the request. As it does so, it can send the following messages back to the web server:

  • SEND_HEADERS
    Send a set of headers back to the browser.
  • SEND_BODY_CHUNK
    Send a chunk of body data back to the browser.
  • GET_BODY_CHUNK
    Get further data from the request if it hasn't all been transferred yet. This is necessary because the packets have a fixed maximum size and arbitrary amounts of data can be included the body of a request (for uploaded files, for example). (Note: this is unrelated to HTTP chunked transfer).
  • END_RESPONSE
    Finish the request-handling cycle.

Each message is accompanied by a differently formatted packet of data. See Response Packet Structures below for details.

Basic Packet Structure

There is a bit of an XDR heritage to this protocol, but it differs in lots of ways (no 4 byte alignment, for example).

Byte order: I am not clear about the endian-ness of the individual bytes. I'm guessing the bytes are little-endian, because that's what XDR specifies, and I'm guessing that sys/socket library is magically making that so (on the C side). If anyone with a better knowledge of socket calls can step in, that would be great.

There are four data types in the protocol: bytes, booleans, integers and strings.

Byte
A single byte.
Boolean
A single byte, 1 = true, 0 = false. Using other non-zero values as true (i.e. C-style) may work in some places, but it won't in others.
Integer
A number in the range of 0 to 2^16 (32768). Stored in 2 bytes with the high-order byte first.
String
A variable-sized string (length bounded by 2^16). Encoded with the length packed into two bytes first, followed by the string (including the terminating '\0'). Note that the encoded length does not include the trailing '\0' -- it is like strlen. This is a touch confusing on the Java side, which is littered with odd autoincrement statements to skip over these terminators. I believe the reason this was done was to allow the C code to be extra efficient when reading strings which the servlet container is sending back -- with the terminating \0 character, the C code can pass around references into a single buffer, without copying. if the \0 was missing, the C code would have to copy things out in order to get its notion of a string.

Packet Size

According to much of the code, the max packet size is 8 * 1024 bytes (8K). The actual length of the packet is encoded in the header.

Packet Headers

Packets sent from the server to the container begin with 0x1234. Packets sent from the container to the server begin with AB (that's the ASCII code for A followed by the ASCII code for B). After those first two bytes, there is an integer (encoded as above) with the length of the payload. Although this might suggest that the maximum payload could be as large as 2^16, in fact, the code sets the maximum to be 8K.

Packet Format (Server->Container)
Byte | 0 | 1 | 2 | 3 | 4...(n+3)
Contents | 0x12 | 0x34 | Data Length (n) |  | Data
Packet Format (Container->Server)
Byte | 0 | 1 | 2 | 3 | 4...(n+3)
Contents | A | B | Data Length (n) |  | Data

For most packets, the first byte of the payload encodes the type of message. The exception is for request body packets sent from the server to the container -- they are sent with a standard packet header ( 0x1234 and then length of the packet), but without any prefix code after that.

The web server can send the following messages to the servlet container:

Code | Type of Packet | Meaning
2 | Forward Request | Begin the request-processing cycle with the following data
7 | Shutdown | The web server asks the container to shut itself down.
8 | Ping | The web server asks the container to take control (secure login phase).
10 | CPing | The web server asks the container to respond quickly with a CPong.
none | Data | Size (2 bytes) and corresponding body data.

To ensure some basic security, the container will only actually do the Shutdown if the request comes from the same machine on which it's hosted.

The first Data packet is send immediately after the Forward Request by the web server.

The servlet container can send the following types of messages to the webserver:

Code | Type of Packet | Meaning
3 | Send Body Chunk | Send a chunk of the body from the servlet container to the web server (and presumably, onto the browser).
4 | Send Headers | Send the response headers from the servlet container to the web server (and presumably, onto the browser).
5 | End Response | Marks the end of the response (and thus the request-handling cycle).
6 | Get Body Chunk | Get further data from the request if it hasn't all been transferred yet.
9 | CPong Reply | The reply to a CPing request

Each of the above messages has a different internal structure, detailed below.

Request Packet Structure

For messages from the server to the container of type Forward Request:

AJP13_FORWARD_REQUEST :=
    prefix_code      (byte) 0x02 = JK_AJP13_FORWARD_REQUEST
    method           (byte)
    protocol         (string)
    req_uri          (string)
    remote_addr      (string)
    remote_host      (string)
    server_name      (string)
    server_port      (integer)
    is_ssl           (boolean)
    num_headers      (integer)
    request_headers *(req_header_name req_header_value)
    attributes      *(attribut_name attribute_value)
    request_terminator (byte) OxFF

The request_headers have the following structure:

req_header_name :=
    sc_req_header_name | (string)  [see below for how this is parsed]

sc_req_header_name := 0xA0xx (integer)

req_header_value := (string)

The attributes are optional and have the following structure:

attribute_name := sc_a_name | (sc_a_req_attribute string)

attribute_value := (string)

Not that the all-important header is content-length, because it determines whether or not the container looks for another packet immediately.

Detailed description of the elements of Forward Request

Request prefix

For all requests, this will be 2. See above for details on other Prefix codes.

Method

The HTTP method, encoded as a single byte:

Command Name | Code
OPTIONS | 1
GET | 2
HEAD | 3
POST | 4
PUT | 5
DELETE | 6
TRACE | 7
PROPFIND | 8
PROPPATCH | 9
MKCOL | 10
COPY | 11
MOVE | 12
LOCK | 13
UNLOCK | 14
ACL | 15
REPORT | 16
VERSION-CONTROL | 17
CHECKIN | 18
CHECKOUT | 19
UNCHECKOUT | 20
SEARCH | 21
MKWORKSPACE | 22
UPDATE | 23
LABEL | 24
MERGE | 25
BASELINE_CONTROL | 26
MKACTIVITY | 27

Later version of ajp13, will transport additional methods, even if they are not in this list.

protocol, req_uri, remote_addr, remote_host, server_name, server_port, is_ssl

These are all fairly self-explanatory. Each of these is required, and will be sent for every request.

Headers

The structure of request_headers is the following: First, the number of headers num_headers is encoded. Then, a series of header name req_header_name / value req_header_value pairs follows. Common header names are encoded as integers, to save space. If the header name is not in the list of basic headers, it is encoded normally (as a string, with prefixed length). The list of common headers sc_req_header_nameand their codes is as follows (all are case-sensitive):

Name | Code value | Code name
accept | 0xA001 | SC_REQ_ACCEPT
accept-charset | 0xA002 | SC_REQ_ACCEPT_CHARSET
accept-encoding | 0xA003 | SC_REQ_ACCEPT_ENCODING
accept-language | 0xA004 | SC_REQ_ACCEPT_LANGUAGE
authorization | 0xA005 | SC_REQ_AUTHORIZATION
connection | 0xA006 | SC_REQ_CONNECTION
content-type | 0xA007 | SC_REQ_CONTENT_TYPE
content-length | 0xA008 | SC_REQ_CONTENT_LENGTH
cookie | 0xA009 | SC_REQ_COOKIE
cookie2 | 0xA00A | SC_REQ_COOKIE2
host | 0xA00B | SC_REQ_HOST
pragma | 0xA00C | SC_REQ_PRAGMA
referer | 0xA00D | SC_REQ_REFERER
user-agent | 0xA00E | SC_REQ_USER_AGENT

The Java code that reads this grabs the first two-byte integer and if it sees an '0xA0' in the most significant byte, it uses the integer in the second byte as an index into an array of header names. If the first byte is not 0xA0, it assumes that the two-byte integer is the length of a string, which is then read in.

This works on the assumption that no header names will have length greater than 0x9FFF (==0xA000 - 1), which is perfectly reasonable, though somewhat arbitrary.

Note:

The content-length header is extremely important. If it is present and non-zero, the container assumes that the request has a body (a POST request, for example), and immediately reads a separate packet off the input stream to get that body.

Attributes

The attributes prefixed with a ? (e.g. ?context) are all optional. For each, there is a single byte code to indicate the type of attribute, and then its value (string or integer). They can be sent in any order (though the C code always sends them in the order listed below). A special terminating code is sent to signal the end of the list of optional attributes. The list of byte codes is:

Information | Code Value | Type Of Value | Note
?context | 0x01 | - | Not currently implemented
?servlet_path | 0x02 | - | Not currently implemented
?remote_user | 0x03 | String |
?auth_type | 0x04 | String |
?query_string | 0x05 | String |
?jvm_route | 0x06 | String |
?ssl_cert | 0x07 | String |
?ssl_cipher | 0x08 | String |
?ssl_session | 0x09 | String |
?req_attribute | 0x0A | String | Name (the name of the attribute follows)
?ssl_key_size | 0x0B | Integer |
are_done | 0xFF | - | request_terminator

The context and servlet_path are not currently set by the C code, and most of the Java code completely ignores whatever is sent over for those fields (and some of it will actually break if a string is sent along after one of those codes). I don't know if this is a bug or an unimplemented feature or just vestigial code, but it's missing from both sides of the connection.

The remote_user and auth_type presumably refer to HTTP-level authentication, and communicate the remote user's username and the type of authentication used to establish their identity (e.g. Basic, Digest).

The query_string, ssl_cert, ssl_cipher, and ssl_session refer to the corresponding pieces of HTTP and HTTPS.

The jvm_route, is used to support sticky sessions -- associating a user's sesson with a particular Tomcat instance in the presence of multiple, load-balancing servers.

Beyond this list of basic attributes, any number of other attributes can be sent via the req_attribute code 0x0A. A pair of strings to represent the attribute name and value are sent immediately after each instance of that code. Environment values are passed in via this method.

Finally, after all the attributes have been sent, the attribute terminator, 0xFF, is sent. This signals both the end of the list of attributes and also then end of the Request Packet.

Response Packet Structure

for messages which the container can send back to the server.

AJP13_SEND_BODY_CHUNK :=
  prefix_code   3
  chunk_length  (integer)
  chunk        *(byte)
  chunk_terminator (byte) Ox00

AJP13_SEND_HEADERS :=
  prefix_code       4
  http_status_code  (integer)
  http_status_msg   (string)
  num_headers       (integer)
  response_headers *(res_header_name header_value)

res_header_name :=
    sc_res_header_name | (string)   [see below for how this is parsed]

sc_res_header_name := 0xA0 (byte)

header_value := (string)

AJP13_END_RESPONSE :=
  prefix_code       5
  reuse             (boolean)

AJP13_GET_BODY_CHUNK :=
  prefix_code       6
  requested_length  (integer)

Details:

Send Body Chunk

The chunk is basically binary data, and is sent directly back to the browser.

Send Headers

The status code and message are the usual HTTP things (e.g. 200 and OK). The response header names are encoded the same way the request header names are. See header_encoding above for details about how the codes are distinguished from the strings.
The codes for common headers are:

Name | Code value
Content-Type | 0xA001
Content-Language | 0xA002
Content-Length | 0xA003
Date | 0xA004
Last-Modified | 0xA005
Location | 0xA006
Set-Cookie | 0xA007
Set-Cookie2 | 0xA008
Servlet-Engine | 0xA009
Status | 0xA00A
WWW-Authenticate | 0xA00B

After the code or the string header name, the header value is immediately encoded.

End Response

Signals the end of this request-handling cycle. If the reuse flag is true (==1), this TCP connection can now be used to handle new incoming requests. If reuse is false (anything other than 1 in the actual C code), the connection should be closed.

Get Body Chunk

The container asks for more data from the request (If the body was too large to fit in the first packet sent over or when the request is chunked). The server will send a body packet back with an amount of data which is the minimum of the request_length, the maximum send body size (8186 (8 Kbytes - 6)), and the number of bytes actually left to send from the request body.
If there is no more data in the body (i.e. the servlet container is trying to read past the end of the body), the server will send back an empty packet, which is a body packet with a payload length of 0. (0x12,0x34,0x00,0x00)


mod_proxy_balancer - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_proxy_balancer

Description: | mod_proxy extension for load balancing
Status: | Extension
Module Identifier: | proxy_balancer_module
Source File: | mod_proxy_balancer.c
Compatibility: | Available in version 2.1 and later

Summary

This module requires the service of mod_proxy. It provides load balancing support for HTTP, FTP and AJP13 protocols

Thus, in order to get the ability of load balancing, mod_proxy and mod_proxy_balancer have to be present in the server.

Warning

Do not enable proxying until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

See also

  • mod_proxy

Load balancer scheduler algorithm

At present, there are 3 load balancer scheduler algorithms available for use: Request Counting, Weighted Traffic Counting and Pending Request Counting. These are controlled via the lbmethod value of the Balancer definition. See the ProxyPass directive for more information.

Load balancer stickyness

The balancer supports stickyness. When a request is proxied to some back-end, then all following requests from the same user should be proxied to the same back-end. Many load balancers implement this feature via a table that maps client IP addresses to back-ends. This approach is transparent to clients and back-ends, but suffers from some problems: unequal load distribution if clients are themselves hidden behind proxies, stickyness errors when a client uses a dynamic IP address that changes during a session and loss of stickyness, if the mapping table overflows.

The module mod_proxy_balancer implements stickyness on top of two alternative means: cookies and URL encoding. Providing the cookie can be either done by the back-end or by the Apache web server itself. The URL encoding is usually done on the back-end.

Examples of a balancer configuration

Before we dive into the technical details, here's an example of how you might use mod_proxy_balancer to provide load balancing between two back-end servers:

<Proxy balancer://mycluster>
BalancerMember http://192.168.1.50:80
BalancerMember http://192.168.1.51:80
</Proxy>
ProxyPass /test balancer://mycluster

Another example of how to provide load balancing with stickyness using mod_headers, even if the back-end server does not set a suitable session cookie:

Header add Set-Cookie "ROUTEID=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.50:80 route=1
BalancerMember http://192.168.1.51:80 route=2
ProxySet stickysession=ROUTEID
</Proxy>
ProxyPass /test balancer://mycluster

Request Counting Algorithm

Enabled via lbmethod=byrequests, the idea behind this scheduler is that we distribute the requests among the various workers to ensure that each gets their configured share of the number of requests. It works as follows:

lbfactor is how much we expect this worker to work, or the workers's work quota. This is a normalized value representing their "share" of the amount of work to be done.

lbstatus is how urgent this worker has to work to fulfill its quota of work.

The worker is a member of the load balancer, usually a remote host serving one of the supported protocols.

We distribute each worker's work quota to the worker, and then look which of them needs to work most urgently (biggest lbstatus). This worker is then selected for work, and its lbstatus reduced by the total work quota we distributed to all workers. Thus the sum of all lbstatus does not change(*) and we distribute the requests as desired.

If some workers are disabled, the others will still be scheduled correctly.

for each worker in workers
    worker lbstatus += worker lbfactor
    total factor    += worker lbfactor
    if worker lbstatus > candidate lbstatus
        candidate = worker

candidate lbstatus -= total factor

If a balancer is configured as follows:

worker | a | b | c | d
lbfactor | 25 | 25 | 25 | 25
lbstatus | 0 | 0 | 0 | 0

And b gets disabled, the following schedule is produced:

worker | a | b | c | d
lbstatus | -50 | 0 | 25 | 25
lbstatus | -25 | 0 | -25 | 50
lbstatus | 0 | 0 | 0 | 0
(repeat)

That is it schedules: a c d a c d a c d ... Please note that:

worker | a | b | c | d
lbfactor | 25 | 25 | 25 | 25

Has the exact same behavior as:

worker | a | b | c | d
lbfactor | 1 | 1 | 1 | 1

This is because all values of lbfactor are normalized with respect to the others. For:

worker | a | b | c
lbfactor | 1 | 4 | 1

worker b will, on average, get 4 times the requests that a and c will.

The following asymmetric configuration works as one would expect:

worker | a | b
lbfactor | 70 | 30
lbstatus | -30 | 30
lbstatus | 40 | -40
lbstatus | 10 | -10
lbstatus | -20 | 20
lbstatus | -50 | 50
lbstatus | 20 | -20
lbstatus | -10 | 10
lbstatus | -40 | 40
lbstatus | 30 | -30
lbstatus | 0 | 0
(repeat)

That is after 10 schedules, the schedule repeats and 7 a are selected with 3 b interspersed.

Weighted Traffic Counting Algorithm

Enabled via lbmethod=bytraffic, the idea behind this scheduler is very similar to the Request Counting method, with the following changes:

lbfactor is how much traffic, in bytes, we want this worker to handle. This is also a normalized value representing their "share" of the amount of work to be done, but instead of simply counting the number of requests, we take into account the amount of traffic this worker has seen.

If a balancer is configured as follows:

worker | a | b | c
lbfactor | 1 | 2 | 1

Then we mean that we want b to process twice the amount of bytes than a or c should. It does not necessarily mean that b would handle twice as many requests, but it would process twice the I/O. Thus, the size of the request and response are applied to the weighting and selection algorithm.

Pending Request Counting Algorithm

Enabled via lbmethod=bybusyness, this scheduler keeps track of how many requests each worker is assigned at present. A new request is automatically assigned to the worker with the lowest number of active requests. This is useful in the case of workers that queue incoming requests independently of Apache, to ensure that queue length stays even and a request is always given to the worker most likely to service it fastest.

In the case of multiple least-busy workers, the statistics (and weightings) used by the Request Counting method are used to break the tie. Over time, the distribution of work will come to resemble that characteristic of byrequests.

This algorithm is available in Apache HTTP Server 2.2.10 and later.

Exported Environment Variables

At present there are 6 environment variables exported:

BALANCER_SESSION_STICKY

This is assigned the stickysession value used for the current request. It is the name of the cookie or request parameter used for sticky sessions

BALANCER_SESSION_ROUTE

This is assigned the route parsed from the current request.

BALANCER_NAME

This is assigned the name of the balancer used for the current request. The value is something like balancer://foo.

BALANCER_WORKER_NAME

This is assigned the name of the worker used for the current request. The value is something like http://hostA:1234.

BALANCER_WORKER_ROUTE

This is assigned the route of the worker that will be used for the current request.

BALANCER_ROUTE_CHANGED

This is set to 1 if the session route does not match the worker route (BALANCER_SESSION_ROUTE != BALANCER_WORKER_ROUTE) or the session does not yet have an established route. This can be used to determine when/if the client needs to be sent an updated route when sticky sessions are used.

Enabling Balancer Manager Support

This module requires the service of mod_status. Balancer manager enables dynamic update of balancer members. You can use balancer manager to change the balance factor or a particular member, or put it in the off line mode.

Thus, in order to get the ability of load balancer management, mod_status and mod_proxy_balancer have to be present in the server.

To enable load balancer management for browsers from the example.com domain add this code to your httpd.conf configuration file

<Location /balancer-manager>
SetHandler balancer-manager

Order Deny,Allow
Deny from all
Allow from .example.com
</Location>

You can now access load balancer manager by using a Web browser to access the page http://your.server.name/balancer-manager

Details on load balancer stickyness

When using cookie based stickyness, you need to configure the name of the cookie that contains the information about which back-end to use. This is done via the stickysession attribute added to either ProxyPass or ProxySet. The name of the cookie is case-sensitive. The balancer extracts the value of the cookie and looks for a member worker with route equal to that value. The route must also be set in either ProxyPass or ProxySet. The cookie can either be set by the back-end, or as shown in the above example by the Apache web server itself.

Some back-ends use a slightly different form of stickyness cookie, for instance Apache Tomcat. Tomcat adds the name of the Tomcat instance to the end of its session id cookie, separated with a dot (.) from the session id. Thus if the Apache web server finds a dot in the value of the stickyness cookie, it only uses the part behind the dot to search for the route. In order to let Tomcat know about its instance name, you need to set the attribute jvmRoute inside the Tomcat configuration file conf/server.xml to the value of the route of the worker that connects to the respective Tomcat. The name of the session cookie used by Tomcat (and more generally by Java web applications based on servlets) is JSESSIONID (upper case) but can be configured to something else.

The second way of implementing stickyness is URL encoding. The web server searches for a query parameter in the URL of the request. The name of the parameter is specified again using stickysession. The value of the parameter is used to lookup a member worker with route equal to that value. Since it is not easy to extract and manipulate all URL links contained in responses, generally the work of adding the parameters to each link is done by the back-end generating the content. In some cases it might be feasible doing this via the web server using mod_substitute. This can have negative impact on performance though.

The Java standards implement URL encoding slightly different. They use a path info appended to the URL using a semicolon (;) as the separator and add the session id behind. As in the cookie case, Apache Tomcat can include the configured jvmRoute in this path info. To let Apache find this sort of path info, you need to set scolonpathdelim to On in ProxyPass or ProxySet.

Finally you can support cookies and URL encoding at the same time, by configuring the name of the cookie and the name of the URL parameter separated by a vertical bar (|) as in the following example:

ProxyPass /test balancer://mycluster stickysession=JSESSIONID|jsessionid scolonpathdelim=On
<Proxy balancer://mycluster>
BalancerMember http://192.168.1.50:80 route=node1
BalancerMember http://192.168.1.51:80 route=node2
</Proxy>

If the cookie and the request parameter both provide routing information for the same request, the information from the request parameter is used.

Troubleshooting load balancer stickyness

If you experience stickyness errors, e.g. users loose their application sessions and need to login again, you first want to check whether this is because the back-ends are sometimes unavailable or whether your configuration is wrong. To find out about possible stability problems with the back-ends, check your Apache error log for proxy error messages.

To verify your configuration, first check, whether the stickyness is based on a cookie or on URL encoding. Next step would be logging the appropriate data in the access log by using an enhanced LogFormat. The following fields are useful:

%{MYCOOKIE}C
The value contained in the cookie with name MYCOOKIE. The name should be the same given in the stickysession attribute.
%{Set-Cookie}o
This logs any cookie set by the back-end. You can track, whether the back-end sets the session cookie you expect, and to which value it is set.
%{BALANCER_SESSION_STICKY}e
The name of the cookie or request parameter used to lookup the routing information.
%{BALANCER_SESSION_ROUTE}e
The route information found in the request.
%{BALANCER_WORKER_ROUTE}e
The route of the worker chosen.
%{BALANCER_ROUTE_CHANGED}e
Set to 1 if the route in the request is different from the route of the worker, i.e. the request couldn't be handled sticky.

Common reasons for loss of session are session timeouts, which are usually configurable on the back-end server.

The balancer also logs detailed information about handling stickyness to the error log, if the log level is set to debug or higher. This is an easy way to troubleshoot stickyness problems, but the log volume might be to high for production servers under high load.


mod_proxy_connect - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_proxy_connect

Description: | mod_proxy extension for CONNECT request handling
Status: | Extension
Module Identifier: | proxy_connect_module
Source File: | mod_proxy_connect.c

Summary

This module requires the service of mod_proxy. It provides support for the CONNECT HTTP method. This method is mainly used to tunnel SSL requests through proxy servers.

Thus, in order to get the ability of handling CONNECT requests, mod_proxy and mod_proxy_connect have to be present in the server.

CONNECT is also used, when the server needs to send an HTTPS request through a forward proxy. In this case the server acts as a CONNECT client. This functionality is part of mod_proxy and mod_proxy_connect is not needed in this case.

Warning

Do not enable proxying until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

See also

  • AllowCONNECT
  • mod_proxy


mod_proxy_ftp - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_proxy_ftp

Description: | FTP support module for mod_proxy
Status: | Extension
Module Identifier: | proxy_ftp_module
Source File: | mod_proxy_ftp.c

Summary

This module requires the service of mod_proxy. It provides support for the proxying FTP sites. Note that FTP support is currently limited to the GET method.

Thus, in order to get the ability of handling FTP proxy requests, mod_proxy and mod_proxy_ftp have to be present in the server.

Warning

Do not enable proxying until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

See also

  • mod_proxy

Why doesn't file type xxx download via FTP?

You probably don't have that particular file type defined as application/octet-stream in your proxy's mime.types configuration file. A useful line can be

application/octet-stream   bin dms lha lzh exe class tgz taz

Alternatively you may prefer to default everything to binary:

DefaultType application/octet-stream

How can I force an FTP ASCII download of File xxx?

In the rare situation where you must download a specific file using the FTP ASCII transfer method (while the default transfer is in binary mode), you can override mod_proxy's default by suffixing the request with ;type=a to force an ASCII transfer. (FTP Directory listings are always executed in ASCII mode, however.)

How can I do FTP upload?

Currently, only GET is supported for FTP in mod_proxy. You can of course use HTTP upload (POST or PUT) through an Apache proxy.

How can I access FTP files outside of my home directory?

An FTP URI is interpreted relative to the home directory of the user who is logging in. Alas, to reach higher directory levels you cannot use /../, as the dots are interpreted by the browser and not actually sent to the FTP server. To address this problem, the so called Squid %2f hack was implemented in the Apache FTP proxy; it is a solution which is also used by other popular proxy servers like the Squid Proxy Cache. By prepending /%2f to the path of your request, you can make such a proxy change the FTP starting directory to / (instead of the home directory). For example, to retrieve the file /etc/motd, you would use the URL:

ftp://user@host/%2f/etc/motd

How can I hide the FTP cleartext password in my browser's URL line?

To log in to an FTP server by username and password, Apache uses different strategies. In absense of a user name and password in the URL altogether, Apache sends an anonymous login to the FTP server, i.e.,

user: anonymous
password: apache_proxy@

This works for all popular FTP servers which are configured for anonymous access.

For a personal login with a specific username, you can embed the user name into the URL, like in:

ftp://username@host/myfile

If the FTP server asks for a password when given this username (which it should), then Apache will reply with a 401 (Authorization required) response, which causes the Browser to pop up the username/password dialog. Upon entering the password, the connection attempt is retried, and if successful, the requested resource is presented. The advantage of this procedure is that your browser does not display the password in cleartext (which it would if you had used

ftp://username:password@host/myfile

in the first place).

Note

The password which is transmitted in such a way is not encrypted on its way. It travels between your browser and the Apache proxy server in a base64-encoded cleartext string, and between the Apache proxy and the FTP server as plaintext. You should therefore think twice before accessing your FTP server via HTTP (or before accessing your personal files via FTP at all!) When using insecure channels, an eavesdropper might intercept your password on its way.


mod_proxy_http - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_proxy_http

Description: | HTTP support module for mod_proxy
Status: | Extension
Module Identifier: | proxy_http_module
Source File: | mod_proxy_http.c

Summary

This module requires the service of mod_proxy. It provides the features used for proxying HTTP and HTTPS requests. mod_proxy_http supports HTTP/0.9, HTTP/1.0 and HTTP/1.1. It does not provide any caching abilities. If you want to set up a caching proxy, you might want to use the additional service of the mod_cache module.

Thus, in order to get the ability of handling HTTP proxy requests, mod_proxy and mod_proxy_http have to be present in the server.

Warning

Do not enable proxying until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

See also

  • mod_proxy
  • mod_proxy_connect

Environment Variables

In addition to the configuration directives that control the behaviour of mod_proxy, there are a number of environment variables that control the HTTP protocol provider. Environment variables below that don't specify specific values are enabled when set to any value.

proxy-sendextracrlf
Causes proxy to send an extra CR-LF newline on the end of a request. This is a workaround for a bug in some browsers.
force-proxy-request-1.0
Forces the proxy to send requests to the backend as HTTP/1.0 and disables HTTP/1.1 features.
proxy-nokeepalive
Forces the proxy to close the backend connection after each request.
proxy-chain-auth
If the proxy requires authentication, it will read and consume the proxy authentication credentials sent by the client. With proxy-chain-auth it will also forward the credentials to the next proxy in the chain. This may be necessary if you have a chain of proxies that share authentication information. Security Warning: Do not set this unless you know you need it, as it forwards sensitive information!
proxy-sendcl
HTTP/1.0 required all HTTP requests that include a body (e.g. POST requests) to include a Content-Length header. This environment variable forces the Apache proxy to send this header to the backend server, regardless of what the Client sent to the proxy. It ensures compatibility when proxying for an HTTP/1.0 or unknown backend. However, it may require the entire request to be buffered by the proxy, so it becomes very inefficient for large requests.
proxy-sendchunks or proxy-sendchunked
This is the opposite of proxy-sendcl. It allows request bodies to be sent to the backend using chunked transfer encoding. This allows the request to be efficiently streamed, but requires that the backend server supports HTTP/1.1.
proxy-interim-response
This variable takes values RFC or Suppress. Earlier httpd versions would suppress HTTP interim (1xx) responses sent from the backend. This is technically a violation of the HTTP protocol. In practice, if a backend sends an interim response, it may itself be extending the protocol in a manner we know nothing about, or just broken. So this is now configurable: set proxy-interim-response RFC to be fully protocol compliant, or proxy-interim-response Suppress to suppress interim responses.
proxy-initial-not-pooled
If this variable is set no pooled connection will be reused if the client connection is an initial connection. This avoids the "proxy: error reading status line from remote server" error message caused by the race condition that the backend server closed the pooled connection after the connection check by the proxy and before data sent by the proxy reached the backend. It has to be kept in mind that setting this variable downgrades performance, especially with HTTP/1.0 clients.


mod_proxy_scgi - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_proxy_scgi

Description: | SCGI gateway module for mod_proxy
Status: | Extension
Module Identifier: | proxy_scgi_module
Source File: | mod_proxy_scgi.c
Compatibility: | Available in version 2.2.14 and later

Summary

This module requires the service of mod_proxy. It provides support for the SCGI protocol, version 1.

Thus, in order to get the ability of handling the SCGI protocol, mod_proxy and mod_proxy_scgi have to be present in the server.

Warning

Do not enable proxying until you have secured your server. Open proxy servers are dangerous both to your network and to the Internet at large.

See also

  • mod_proxy
  • mod_proxy_balancer

Examples

Remember, in order to make the following examples work, you have to enable mod_proxy and mod_proxy_scgi.

Simple gateway

ProxyPass /scgi-bin/ scgi://localhost:4000/

The balanced gateway needs mod_proxy_balancer in addition to the already mentioned proxy modules.

Balanced gateway

ProxyPass /scgi-bin/ balancer://somecluster/
<Proxy balancer://somecluster/>
BalancerMember scgi://localhost:4000/
BalancerMember scgi://localhost:4001/
 </Proxy>

ProxySCGIInternalRedirect Directive

Description: | Enable or disable internal redirect responses from the backend
Syntax: | ProxySCGIInternalRedirect On|Off
Default: | ProxySCGIInternalRedirect On
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy_scgi

The ProxySCGIInternalRedirect enables the backend to internally redirect the gateway to a different URL. This feature origins in mod_cgi, which internally redirects the response, if the response status is OK (200) and the response contains a Location header and its value starts with a slash (/). This value is interpreted as a new local URL the apache internally redirects to.

mod_proxy_scgi does the same as mod_cgi in this regard, except that you can turn off the feature.

Example

ProxySCGIInternalRedirect Off

ProxySCGISendfile Directive

Description: | Enable evaluation of X-Sendfile pseudo response header
Syntax: | ProxySCGISendfile On|Off|Headername
Default: | ProxySCGISendfile Off
Context: | server config, virtual host, directory
Status: | Extension
Module: | mod_proxy_scgi

The ProxySCGISendfile directive enables the SCGI backend to let files serve directly by the gateway. This is useful performance purposes -- the httpd can use sendfile or other optimizations, which are not possible if the file comes over the backend socket.

The ProxySCGISendfile argument determines the gateway behaviour:

Off
No special handling takes place.
On
The gateway looks for a backend response header called X-Sendfile and interprets the value as filename to serve. The header is removed from the final response headers. This is equivalent to ProxySCGISendfile X-Sendfile.
anything else
Similar to On, but instead of the hardcoded header name the argument is applied as header name.

Example

# Use the default header (X-Sendfile)
ProxySCGISendfile On

# Use a different header
ProxySCGISendfile X-Send-Static

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_reqtimeout - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_reqtimeout

Description: | Set timeout and minimum data rate for receiving requests
Status: | Extension
Module Identifier: | reqtimeout_module
Source File: | mod_reqtimeout.c
Compatibility: | Available in Apache 2.2.15 and later

Examples

  1. Allow 10 seconds to receive the request including the headers and 30 seconds for receiving the request body:

    RequestReadTimeout header=10 body=30

  2. Allow at least 10 seconds to receive the request body. If the client sends data, increase the timeout by 1 second for every 1000 bytes received, with no upper limit for the timeout (exept for the limit given indirectly by LimitRequestBody):

    RequestReadTimeout body=10,MinRate=1000

  3. Allow at least 10 seconds to receive the request including the headers. If the client sends data, increase the timeout by 1 second for every 500 bytes received. But do not allow more than 30 seconds for the request including the headers:

    RequestReadTimeout header=10-30,MinRate=500

  4. Usually, a server should have both header and body timeouts configured. If a common configuration is used for http and https virtual hosts, the timeouts should not be set too low:

    RequestReadTimeout header=20-40,MinRate=500 body=20,MinRate=500

RequestReadTimeout Directive

Description: | Set timeout values for receiving request headers and body from client.
Syntax: | RequestReadTimeout [header=timeout[[-maxtimeout],MinRate=rate] [body=timeout[[-maxtimeout],MinRate=rate]
Default: | Unset; no limit
Context: | server config, virtual host
Status: | Extension
Module: | mod_reqtimeout

This directive can set various timeouts for receiving the request headers and the request body from the client. If the client fails to send headers or body within the configured time, a 408 REQUEST TIME OUT error is sent.

For SSL virtual hosts, the header timeout values include the time needed to do the initial SSL handshake. If the user's browser is configured to query certificate revocation lists and the CRL server is not reachable, the initial SSL handshake may take a significant time until the browser gives up waiting for the CRL. Therefore the header timeout values should not be set to very low values for SSL virtual hosts. The body timeout values include the time needed for SSL renegotiation (if necessary).

When an AcceptFilter is in use (usually the case on Linux and FreeBSD), the socket is not sent to the server process before at least one byte (or the whole request for httpready) is received. The header timeout configured with RequestReadTimeout is only effective after the server process has received the socket.

For each of the two timeout types (header or body), there are three ways to specify the timeout:

  • Fixed timeout value:

    type=timeout

    The time in seconds allowed for reading all of the request headers or body, respectively. A value of 0 means no limit.

  • Timeout value that is increased when data is received:

    type=timeout,MinRate=data_rate

    Same as above, but whenever data is received, the timeout value is increased according to the specified minimum data rate (in bytes per second).

  • Timeout value that is increased when data is received, with an upper bound:

    type=timeout-maxtimeout,MinRate=data_rate

    Same as above, but the timeout will not be increased above the second value of the specified timeout range.


mod_setenvif - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_setenvif

Açıklama: | Ortam değişkenlerinin isteğin özelliklerine uygun olarak atanmasını sağlar
Durum: | Temel
Modül Betimleyici: | setenvif_module
Kaynak Dosyası: | mod_setenvif.c

Özet

mod_setenvif modülü, dahili ortam değişkenlerinin, isteğin farklı bileşenlerinin belirttiğiniz düzenli ifade ile eşleşmesine bağlı olarak atanmasını mümkün kılar. Bu ortam değişkenleri, CGI betiklerinde ve SSI sayfalarında da kullanılabilir hale gelmenin yanı sıra sunucunun çeşitli kısımlarında yapılacak eylemlere karar verirken kullanılabilirler.

Yönergeler yapılandırma dosyasında yer aldıkları sıraya göre ele alınırlar. Böylece daha karmaşık dizilimler kullanılabilir, bu örnekteki tarayıcı Mozilla ise netscape ortam değişkeni atanmakta, MSIE ise atanmamaktadır.

BrowserMatch ^Mozilla netscape
BrowserMatch MSIE !netscape

Ayrıca bakınız:

  • Apache’de Ortam Değişkenleri

BrowserMatch Yönergesi

Açıklama: | Ortam değişkenlerini HTTP kullanıcı arayüzüne göre belirler.
Sözdizimi: | BrowserMatch düzifd [!]ort-değişkeni[=değer] [[!]ort-değişkeni[=değer]] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_setenvif

BrowserMatch yönergesi SetEnvIf yönergesinin özel bir halidir ve ortam değişkenlerine User-Agent HTTP istek başlığının değerine göre atama yapar. Aşağıdaki iki satır aynı etkiye sahiptir:

BrowserMatchNoCase Robot is_a_robot
SetEnvIfNoCase User-Agent Robot is_a_robot

Başka örnekler:

BrowserMatch ^Mozilla forms jpeg=yes browser=netscape
BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript
BrowserMatch MSIE !javascript

BrowserMatchNoCase Yönergesi

Açıklama: | Ortam değişkenlerini HTTP kullanıcı arayüzünün harf büyüklüğüne duyarsız eşleşmelerine bağlı olarak belirler.
Sözdizimi: | BrowserMatchNoCase düzifd [!]ort-değişkeni[=değer] [[!]ort-değişkeni[=değer]] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_setenvif

BrowserMatchNoCase yönergesi sözdizimsel ve anlamsal olarak BrowserMatch yönergesinin eşdeğeridir. Ancak, eşleşmelerde harf büyüklüğüne duyarsızdır. Örnek:

BrowserMatchNoCase mac platform=macintosh
BrowserMatchNoCase win platform=windows

BrowserMatch ve BrowserMatchNoCase yönergeleri SetEnvIf ve SetEnvIfNoCase yönergelerinin özel halleridir. Bu bakımda aşağıdaki iki satır aynı etkiye sahiptir:

BrowserMatchNoCase Robot is_a_robot
SetEnvIfNoCase User-Agent Robot is_a_robot

SetEnvIf Yönergesi

Açıklama: | Ortam değişkenlerini isteğin özniteliklerine göre atar.
Sözdizimi: | SetEnvIf öznitelik düzifd [!]ort-değişkeni[=değer] [[!]ort-değişkeni[=değer]] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_setenvif

SetEnvIf yönergesi ortam değişkenlerini isteğin özniteliklerine göre tanımlar. İlk bileşen olarak belirtilen öznitelik şu üç şeyden biri olabilir:

  1. Bir HTTP istek başlığı alanı (ayrıntılı bilgi için bak: RFC2616); örneğin: Host, User-Agent, Referer ve Accept-Language. Bir düzenli ifade kullanılarak birden fazla istek başlığı belirtilebilir.
  2. İsteğin aşağıdaki bileşenlerinden biri:
    • Remote_Host - isteği yapan istemcinin konak ismi (varsa)
    • Remote_Addr -isteği yapan istemcinin IP adresi
    • Server_Addr - isteği alan sunucunun IP adresi (sadece 2.0.43 sonrası sürümler için)
    • Request_Method - kullanılan yöntemin ismi (GET, POST, vs.)
    • Request_Protocol - İsteğin yapıldığı protokolün ismi ve numarası ("HTTP/0.9", "HTTP/1.1" gibi)
    • Request_URI - HTTP istek satırında belirtilen özkaynak; genellikle sorgu dizgesi olmaksızın şema ve konak ismini içeren bir URL parçasıdır. Sorgu dizgeleriyle eşleşmeler hakkında ayrıntılı bilgi edinmek için mod_rewrite modülünün RewriteCond yönergesinin açıklamasına bakınız.
  3. İstek ile evvelce ilişkilendirilmiş bir ortam değişkeninin ismi. Bu sayede önceki bir eşleşmenin sonucuna karşı yeni bir sınama yapma imkanı ortaya çıkar. Böyle bir sınama için sadece evvelce SetEnvIf[NoCase] yönergeleri ile yapılmış atamalardaki ortam değişkenleri kullanılabilir. ‘Evvelce’ derken, sunucu genelinde veya bölüm içinde bu yönergeden önce yer alan SetEnvIf[NoCase] yönerge satırları kastedilmektedir. Ortam değişkenlerinin dikkate alınabilmesi için istek öznitelikleri arasında hiçbir eşleşme olmaması ve öznitelik olarak bir düzenli ifade belirtilmemiş olması gerekir.

İkinci bileşen (düzifd) bir düzenli ifadedir. düzifd ile öznitelik eşleştiği takdirde yönergenin kalan bileşenleri değerlendirmeye alınır.

Kalan bileşenler atanacak ortam değişkenlerinin isimleri ve isteğe bağlı olarak bunlara atanacak değerlerden oluşur. Bunlar şöyle belirtilebilir:

  1. değişken-adı veya
  2. !değişken-adı ya da
  3. değişken-adı=değer

İlk biçemde değişkene "1" değeri atanır. İkincisinde atanmış bir değişken atanmamış yapılır. Üçüncüsünde ise değişkene belirtilen değer bire bir atanır. 2.0.52 sürümünden itibaren parantezli düzenli ifadelerin sonuçları ile değiştirilmek üzere value içinde $1..$9 gösterimleri tanınmaktadır.

Örnek:

SetEnvIf Request_URI "\.gif$" nesne_bir_resim=gif
SetEnvIf Request_URI "\.jpg$" nesne_bir_resim=jpg
SetEnvIf Request_URI "\.xbm$" nesne_bir_resim=xbm
:
SetEnvIf Referer belgeler\.alanismi\.mesela\.dom dahili_site_istendi
:
SetEnvIf object_is_image xbm XBIT_PROCESSING=1
:
SetEnvIf ^TS* ^[a-z].* TS_VAR

İlk üçünde istek bir resim dosyası için yapılmışsa nesne_bir_resim ortam değişkeni atanmakta, dördüncüsünde istenen sayfa belgeler.alanismi.mesela.dom adlı sitede bulunuyorsa dahili_site_istendi ortam değişkeni atanmaktadır.

Son örnekte ise istekte "TS" ile başlayıp [a-z] arasındaki karakterlerle devam eden bir başlık alanı varsa TS_VAR ortam değişkeni atanmaktadır.

Ayrıca bakınız:

  • Apache’de Ortam Değişkenleri belgesinde daha fazla örnek bulunabilir.

SetEnvIfNoCase Yönergesi

Açıklama: | Ortam değişkenlerini isteğin özniteliklerinde harf büyüklüğüne bağlı olmaksızın yapılmış tanımlara göre atar.
Sözdizimi: | SetEnvIfNoCase öznitelik düzifd [!]ort-değişkeni[=değer] [[!]ort-değişkeni[=değer]] ...
Bağlam: | sunucu geneli, sanal konak, dizin, .htaccess
Geçersizleştirme: | FileInfo
Durum: | Temel
Modül: | mod_setenvif

SetEnvIfNoCase yönergesi sözdizimsel ve anlamsal olarak SetEnvIf yönergesinin eşdeğeridir. Ancak, eşleşmelerde harf büyüklüğüne duyarsızdır. Örnek:

SetEnvIfNoCase Host Apache\.Org site=apache

Burada, Host: HTTP istek başlığında Apache.Org, apache.org veya harf büyüklüğünce farklı benzerleri belirtilmişse site ortam değişkenine "apache" değeri atanmaktadır.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_so - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_so

Açıklama: | Modüllerin ve çalıştırılabilir kodun sunucunun başlatılması veya yeniden başlatılması sırasında yüklenmesini sağlar.
Durum: | Eklenti
Modül Betimleyici: | so_module
Kaynak Dosyası: | mod_so.c
Uyumluluk: | Windows için bu bir temel modüldür (sunucu bunu daima içerir).

Özet

Seçilen işletim sistemleri üzerinde bu modül Apache’nin yeniden derlenmesini gerektirmeden modüllerin Devingen Paylaşımlı Nesne (DSO) mekanizması üzerinden kullanılabilmesini sağlar.

Unix’te yüklenen kod genellikle paylaşımlı nesne dosyalarından (.so uzantılı dosyalar), Windows’ta ise ya .so ya da .dll uzantılı dosyalardan gelir.

Uyarı

Apache 1.3 modülleri Apache 2.0’da doğrudan kullanılamazlar - modül ya devingen olarak yüklenecek hale getirilmeli ya da Apache 2.0’ın içinde derlenmelidir.

Yüklenebilir Modüllerin Windows için Oluşturulması

Bilginize

Windows için modül isimlendirme biçemi Apache 1.3.15 ve 2.0 sürümlerinde değişmiştir; modüllere artık mod_filanca.so biçeminde isim verilmektedir.

mod_so modülü ApacheModuleFoo.dll biçeminde isimlendirilmiş modülleri hala yüklemekteyse de yeni adlandırma uzlaşımı tercih edilmelidir. Yüklenebilir modülleri 2.0’a dönüştürüyorsanız, lütfen isimlerini de 2.0 uzlaşımına uygun hale getiriniz.

Apache modül programlama arayüzü Unix ve Windows sürümleri arasında değişiklik göstermez. Unix için kullanılan çoğu modül hiç değişiklik yapmadan ya da çok küçük bir değişiklikle Windows’ta da çalışmaktadır. Çalışmayanlar Unix platformunun sahip olduğu ancak Windows platformunun sahip olmadığı nitelikleri kullanan modüllerdir.

Bir modül Windows’ta çalıştığı zaman, sunucuya iki şekilde yüklenebilir. Unix’te olduğu gibi, doğrudan sunucunun içinde derlenebilir. Windows için hazırlanan Apache paketi, Unix için geçerli olan Configure betiğini içermediğinden modülün kaynak dosyası ApacheCore proje dosyasına, sembolleri de os\win32\modules.c dosyasına eklenmelidir.

İkinci yol ise modülü bir paylaşımlı kütüphane olarak çalışma anında LoadModule yönergesi ile yüklemek için bir DLL olarak derlemektir. Bu DLL modüller dağıtılabilir ve sunucuyu yeniden derlemek gerekmeksizin her Windows için Apache kurulumunda çalışabilir.

Bir modül DLL’i oluşturmak için modülün kaynak dosyasında küçük bir değişiklik yapmak gerekir: Modül kaydının daha sonra oluşturulacak olan DLL’den ihraç edilebilmesi gerekir (aşağıya bakınız). Bunu yapmak için modülün modül kaydı tanımına (Apache başlık dosyalarında tanımlanmış olan) AP_MODULE_DECLARE_DATA eklenmelidir. Örneğin, modülünüz

module foo_module;

diye bir satır içeriyorsa bunu,

module AP_MODULE_DECLARE_DATA foo_module;

olarak değiştirmelisiniz. Bunun yalnız Windows üzerinde etkili olduğunu ve Unix için modül kodunda bir değişiklik gerekmediğini unutmayınız. Ayrıca, .DEF dosyaları hakkında bilgi sahibi iseniz modül kodunda değişiklik yapmak yerine modül kaydını bu yöntemle de ihraç edebilirsiniz.

Artık modülü içeren bir DLL oluşturmaya hazırsınız. Bunu, libhttpd.dll paylaşımlı kütüphanesi derlenirken oluşturulan libhttpd.lib ihraç kütüphanesi ile ilintilemeniz gerekecektir. Ayrıca, Apache başlık dosyalarının doğru konumlandığından emin olmak için derleyici seçeneklerinde değişiklik yapmanız gerekebilir. Bu kütüphaneyi sunucunuzun kök dizini altındaki modules dizininde bulabilirsiniz. En iyisi derleme ortamının doğru yapılandırıldığından emin olmak için ya ağaçta mevcut modüllerden birinin .dsp dosyasını gaspedersiniz ya da kendi .dsp dosyanızın ilintileme seçenekleriyle derleyicininkileri karşılaştırırsınız.

Artık modülünüzün DLL sürümünü oluşturmalısınız. DLL’i sunucunuzun kök dizininin altında bulunan modules dizinine yerleştirdikten sonra LoadModule yönergesi ile sunucunuza yükleyebilirsiniz.

LoadFile Yönergesi

Açıklama: | Belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler.
Sözdizimi: | LoadFile dosya-ismi [dosya-ismi] ...
Bağlam: | sunucu geneli
Durum: | Eklenti
Modül: | mod_so

LoadFile yönergesi ismi belirtilen kütüphaneleri veya nesne dosyalarını sunucu başlatılırken veya yeniden başlatılırken sunucu ile ilintiler. Yönerge, bazı modüllerin çalışması sırasında gereken ek kodların yüklenmesi için kullanılır. dosya-ismi olarak mutlak bir dosya yolu belirtilebileceği gibi ServerRoot’a göreli bir dosya yolu da belirtilebilir.

Örnek:

LoadFile libexec/libxmlparse.so

LoadModule Yönergesi

Açıklama: | Belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler ve etkin modül listesine ekler.
Sözdizimi: | LoadModule modül dosya-ismi
Bağlam: | sunucu geneli
Durum: | Eklenti
Modül: | mod_so

LoadModule yönergesi dosya-ismi ile belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler ve etkin modül listesine belirtilen modül ismiyle ekler. modül, modülün kaynak dosyasında module türündeki tek harici değişkenin ismi olup modül belgelerinde Modül Betimleyici olarak geçer. Örneğin,

LoadModule status_module modules/mod_status.so

satırı ile ismi belirtilen dosya ServerRoot dizini altındaki modules alt dizininden yüklenir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_speling - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_speling

Description: | Attempts to correct mistaken URLs that users might have entered by ignoring capitalization and by allowing up to one misspelling
Status: | Extension
Module Identifier: | speling_module
Source File: | mod_speling.c

Summary

Requests to documents sometimes cannot be served by the core apache server because the request was misspelled or miscapitalized. This module addresses this problem by trying to find a matching document, even after all other modules gave up. It does its work by comparing each document name in the requested directory against the requested document name without regard to case, and allowing up to one misspelling (character insertion / omission / transposition or wrong character). A list is built with all document names which were matched using this strategy.

If, after scanning the directory,

  • no matching document was found, Apache will proceed as usual and return a "document not found" error.
  • only one document is found that "almost" matches the request, then it is returned in the form of a redirection response.
  • more than one document with a close match was found, then the list of the matches is returned to the client, and the client can select the correct candidate.

CheckCaseOnly Directive

Description: | Limits the action of the speling module to case corrections
Syntax: | CheckCaseOnly on|off
Default: | CheckCaseOnly Off
Context: | server config, virtual host, directory, .htaccess
Override: | Options
Status: | Extension
Module: | mod_speling

When set, this directive limits the action of the spelling correction to lower/upper case changes. Other potential corrections are not performed.

CheckSpelling Directive

Description: | Enables the spelling module
Syntax: | CheckSpelling on|off
Default: | CheckSpelling Off
Context: | server config, virtual host, directory, .htaccess
Override: | Options
Status: | Extension
Module: | mod_speling
Compatibility: | CheckSpelling was available as a separately available module for Apache 1.1, but was limited to miscapitalizations. As of Apache 1.3, it is part of the Apache distribution. Prior to Apache 1.3.2, the CheckSpelling directive was only available in the "server" and "virtual host" contexts.

This directive enables or disables the spelling module. When enabled, keep in mind that

  • the directory scan which is necessary for the spelling correction will have an impact on the server's performance when many spelling corrections have to be performed at the same time.
  • the document trees should not contain sensitive files which could be matched inadvertently by a spelling "correction".
  • the module is unable to correct misspelled user names (as in http://my.host/~apahce/), just file names or directory names.
  • spelling corrections apply strictly to existing files, so a request for the <Location /status> may get incorrectly treated as the negotiated file "/stats.html".

mod_speling should not be enabled in DAV enabled directories, because it will try to "spell fix" newly created resource names against existing filenames, e.g., when trying to upload a new document doc43.html it might redirect to an existing document doc34.html, which is not what was intended.


mod_ssl - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_ssl

Description: | Strong cryptography using the Secure Sockets Layer (SSL) and Transport Layer Security (TLS) protocols
Status: | Extension
Module Identifier: | ssl_module
Source File: | mod_ssl.c

Summary

This module provides SSL v2/v3 and TLS v1 support for the Apache HTTP Server. It was contributed by Ralf S. Engeschall based on his mod_ssl project and originally derived from work by Ben Laurie.

This module relies on OpenSSL to provide the cryptography engine.

Further details, discussion, and examples are provided in the SSL documentation.

Environment Variables

This module can be configured to provide several items of SSL information as additional environment variables to the SSI and CGI namespace. This information is not provided by default for performance reasons. (See SSLOptions StdEnvVars, below.) The generated variables are listed in the table below. For backward compatibility the information can be made available under different names, too. Look in the Compatibility chapter for details on the compatibility variables.

Variable Name: | Value Type: | Description:
HTTPS | flag | HTTPS is being used.
SSL_PROTOCOL | string | The SSL protocol version (SSLv2, SSLv3, TLSv1, TLSv1.1, TLSv1.2)
SSL_SESSION_ID | string | The hex-encoded SSL session id
SSL_CIPHER | string | The cipher specification name
SSL_CIPHER_EXPORT | string | true if cipher is an export cipher
SSL_CIPHER_USEKEYSIZE | number | Number of cipher bits (actually used)
SSL_CIPHER_ALGKEYSIZE | number | Number of cipher bits (possible)
SSL_COMPRESS_METHOD | string | SSL compression method negotiated
SSL_VERSION_INTERFACE | string | The mod_ssl program version
SSL_VERSION_LIBRARY | string | The OpenSSL program version
SSL_CLIENT_M_VERSION | string | The version of the client certificate
SSL_CLIENT_M_SERIAL | string | The serial of the client certificate
SSL_CLIENT_S_DN | string | Subject DN in client's certificate
SSL_CLIENT_S_DN_x509 | string | Component of client's Subject DN
SSL_CLIENT_I_DN | string | Issuer DN of client's certificate
SSL_CLIENT_I_DN_x509 | string | Component of client's Issuer DN
SSL_CLIENT_V_START | string | Validity of client's certificate (start time)
SSL_CLIENT_V_END | string | Validity of client's certificate (end time)
SSL_CLIENT_V_REMAIN | string | Number of days until client's certificate expires
SSL_CLIENT_A_SIG | string | Algorithm used for the signature of client's certificate
SSL_CLIENT_A_KEY | string | Algorithm used for the public key of client's certificate
SSL_CLIENT_CERT | string | PEM-encoded client certificate
SSL_CLIENT_CERT_CHAIN_n | string | PEM-encoded certificates in client certificate chain
SSL_CLIENT_VERIFY | string | NONE, SUCCESS, GENEROUS or FAILED:reason
SSL_SERVER_M_VERSION | string | The version of the server certificate
SSL_SERVER_M_SERIAL | string | The serial of the server certificate
SSL_SERVER_S_DN | string | Subject DN in server's certificate
SSL_SERVER_S_DN_x509 | string | Component of server's Subject DN
SSL_SERVER_I_DN | string | Issuer DN of server's certificate
SSL_SERVER_I_DN_x509 | string | Component of server's Issuer DN
SSL_SERVER_V_START | string | Validity of server's certificate (start time)
SSL_SERVER_V_END | string | Validity of server's certificate (end time)
SSL_SERVER_A_SIG | string | Algorithm used for the signature of server's certificate
SSL_SERVER_A_KEY | string | Algorithm used for the public key of server's certificate
SSL_SERVER_CERT | string | PEM-encoded server certificate
SSL_TLS_SNI | string | Contents of the SNI TLS extension (if supplied with ClientHello)

x509 specifies a component of an X.509 DN; one of C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email. In Apache 2.1 and later, x509 may also include a numeric _n suffix. If the DN in question contains multiple attributes of the same name, this suffix is used as an index to select a particular attribute. For example, where the server certificate subject DN included two OU fields, SSL_SERVER_S_DN_OU_0 and SSL_SERVER_S_DN_OU_1 could be used to reference each.

SSL_CLIENT_V_REMAIN is only available in version 2.1 and later.

Custom Log Formats

When mod_ssl is built into Apache or at least loaded (under DSO situation) additional functions exist for the Custom Log Format of mod_log_config. First there is an additional ``%{varname}x'' eXtension format function which can be used to expand any variables provided by any module, especially those provided by mod_ssl which can you find in the above table.

For backward compatibility there is additionally a special ``%{name}c'' cryptography format function provided. Information about this function is provided in the Compatibility chapter.

Example

CustomLog logs/ssl_request_log \ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

SSLCACertificateFile Directive

Description: | File of concatenated PEM-encoded CA Certificates for Client Auth
Syntax: | SSLCACertificateFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the all-in-one file where you can assemble the Certificates of Certification Authorities (CA) whose clients you deal with. These are used for Client Authentication. Such a file is simply the concatenation of the various PEM-encoded Certificate files, in order of preference. This can be used alternatively and/or additionally to SSLCACertificatePath.

Example

SSLCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle-client.crt

SSLCACertificatePath Directive

Description: | Directory of PEM-encoded CA Certificates for Client Auth
Syntax: | SSLCACertificatePath directory-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the directory where you keep the Certificates of Certification Authorities (CAs) whose clients you deal with. These are used to verify the client certificate on Client Authentication.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you can't just place the Certificate files there: you also have to create symbolic links named hash-value.N. And you should always make sure this directory contains the appropriate symbolic links.

Example

SSLCACertificatePath /usr/local/apache2/conf/ssl.crt/

SSLCADNRequestFile Directive

Description: | File of concatenated PEM-encoded CA Certificates for defining acceptable CA names
Syntax: | SSLCADNRequestFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

When a client certificate is requested by mod_ssl, a list of acceptable Certificate Authority names is sent to the client in the SSL handshake. These CA names can be used by the client to select an appropriate client certificate out of those it has available.

If neither of the directives SSLCADNRequestPath or SSLCADNRequestFile are given, then the set of acceptable CA names sent to the client is the names of all the CA certificates given by the SSLCACertificateFile and SSLCACertificatePath directives; in other words, the names of the CAs which will actually be used to verify the client certificate.

In some circumstances, it is useful to be able to send a set of acceptable CA names which differs from the actual CAs used to verify the client certificate - for example, if the client certificates are signed by intermediate CAs. In such cases, SSLCADNRequestPath and/or SSLCADNRequestFile can be used; the acceptable CA names are then taken from the complete set of certificates in the directory and/or file specified by this pair of directives.

SSLCADNRequestFile must specify an all-in-one file containing a concatenation of PEM-encoded CA certificates.

Example

SSLCADNRequestFile /usr/local/apache2/conf/ca-names.crt

SSLCADNRequestPath Directive

Description: | Directory of PEM-encoded CA Certificates for defining acceptable CA names
Syntax: | SSLCADNRequestPath directory-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This optional directive can be used to specify the set of acceptable CA names which will be sent to the client when a client certificate is requested. See the SSLCADNRequestFile directive for more details.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you can't just place the Certificate files there: you also have to create symbolic links named hash-value.N. And you should always make sure this directory contains the appropriate symbolic links.

Example

SSLCADNRequestPath /usr/local/apache2/conf/ca-names.crt/

SSLCARevocationFile Directive

Description: | File of concatenated PEM-encoded CA CRLs for Client Auth
Syntax: | SSLCARevocationFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the all-in-one file where you can assemble the Certificate Revocation Lists (CRL) of Certification Authorities (CA) whose clients you deal with. These are used for Client Authentication. Such a file is simply the concatenation of the various PEM-encoded CRL files, in order of preference. This can be used alternatively and/or additionally to SSLCARevocationPath.

Example

SSLCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle-client.crl

SSLCARevocationPath Directive

Description: | Directory of PEM-encoded CA CRLs for Client Auth
Syntax: | SSLCARevocationPath directory-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the directory where you keep the Certificate Revocation Lists (CRL) of Certification Authorities (CAs) whose clients you deal with. These are used to revoke the client certificate on Client Authentication.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you have not only to place the CRL files there. Additionally you have to create symbolic links named hash-value.rN. And you should always make sure this directory contains the appropriate symbolic links.

Example

SSLCARevocationPath /usr/local/apache2/conf/ssl.crl/

SSLCertificateChainFile Directive

Description: | File of PEM-encoded Server CA Certificates
Syntax: | SSLCertificateChainFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the optional all-in-one file where you can assemble the certificates of Certification Authorities (CA) which form the certificate chain of the server certificate. This starts with the issuing CA certificate of the server certificate and can range up to the root CA certificate. Such a file is simply the concatenation of the various PEM-encoded CA Certificate files, usually in certificate chain order.

This should be used alternatively and/or additionally to SSLCACertificatePath for explicitly constructing the server certificate chain which is sent to the browser in addition to the server certificate. It is especially useful to avoid conflicts with CA certificates when using client authentication. Because although placing a CA certificate of the server certificate chain into SSLCACertificatePath has the same effect for the certificate chain construction, it has the side-effect that client certificates issued by this same CA certificate are also accepted on client authentication.

But be careful: Providing the certificate chain works only if you are using a single RSA or DSA based server certificate. If you are using a coupled RSA+DSA certificate pair, this will work only if actually both certificates use the same certificate chain. Else the browsers will be confused in this situation.

Example

SSLCertificateChainFile /usr/local/apache2/conf/ssl.crt/ca.crt

SSLCertificateFile Directive

Description: | Server PEM-encoded X.509 Certificate file
Syntax: | SSLCertificateFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl
Compatibility: | ECC support is available in Apache 2.2.26 and later

This directive points to the PEM-encoded Certificate file for the server and optionally also to the corresponding RSA or DSA Private Key file for it (contained in the same file). If the contained Private Key is encrypted the Pass Phrase dialog is forced at startup time. This directive can be used up to three times (referencing different filenames) when both a RSA, a DSA, and an ECC based server certificate is used in parallel.

Example

SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt

SSLCertificateKeyFile Directive

Description: | Server PEM-encoded Private Key file
Syntax: | SSLCertificateKeyFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl
Compatibility: | ECC support is available in Apache 2.2.26 and later

This directive points to the PEM-encoded Private Key file for the server. If the Private Key is not combined with the Certificate in the SSLCertificateFile, use this additional directive to point to the file with the stand-alone Private Key. When SSLCertificateFile is used and the file contains both the Certificate and the Private Key this directive need not be used. But we strongly discourage this practice. Instead we recommend you to separate the Certificate and the Private Key. If the contained Private Key is encrypted, the Pass Phrase dialog is forced at startup time. This directive can be used up to three times (referencing different filenames) when both a RSA, a DSA, and an ECC based private key is used in parallel.

Example

SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key

SSLCipherSuite Directive

Description: | Cipher Suite available for negotiation in SSL handshake
Syntax: | SSLCipherSuite cipher-spec
Default: | SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
Context: | server config, virtual host, directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl

This complex directive uses a colon-separated cipher-spec string consisting of OpenSSL cipher specifications to configure the Cipher Suite the client is permitted to negotiate in the SSL handshake phase. Notice that this directive can be used both in per-server and per-directory context. In per-server context it applies to the standard SSL handshake when a connection is established. In per-directory context it forces a SSL renegotiation with the reconfigured Cipher Suite after the HTTP request was read but before the HTTP response is sent.

An SSL cipher specification in cipher-spec is composed of 4 major attributes plus a few extra minor ones:

  • Key Exchange Algorithm:
    RSA or Diffie-Hellman variants.
  • Authentication Algorithm:
    RSA, Diffie-Hellman, DSS or none.
  • Cipher/Encryption Algorithm:
    DES, Triple-DES, RC4, RC2, IDEA or none.
  • MAC Digest Algorithm:
    MD5, SHA or SHA1.

An SSL cipher can also be an export cipher and is either a SSLv2 or SSLv3/TLSv1 cipher (here TLSv1 is equivalent to SSLv3). To specify which ciphers to use, one can either specify all the Ciphers, one at a time, or use aliases to specify the preference and order for the ciphers (see Table 1).

Tag | Description
Key Exchange Algorithm:
kRSA | RSA key exchange
kDHr | Diffie-Hellman key exchange with RSA key
kDHd | Diffie-Hellman key exchange with DSA key
kEDH | Ephemeral (temp.key) Diffie-Hellman key exchange (no cert)
Authentication Algorithm:
aNULL | No authentication
aRSA | RSA authentication
aDSS | DSS authentication
aDH | Diffie-Hellman authentication
Cipher Encoding Algorithm:
eNULL | No encoding
DES | DES encoding
3DES | Triple-DES encoding
RC4 | RC4 encoding
RC2 | RC2 encoding
IDEA | IDEA encoding
MAC Digest Algorithm:
MD5 | MD5 hash function
SHA1 | SHA1 hash function
SHA | SHA hash function
Aliases:
SSLv2 | all SSL version 2.0 ciphers
SSLv3 | all SSL version 3.0 ciphers
TLSv1 | all TLS version 1.0 ciphers
EXP | all export ciphers
EXPORT40 | all 40-bit export ciphers only
EXPORT56 | all 56-bit export ciphers only
LOW | all low strength ciphers (no export, single DES)
MEDIUM | all ciphers with 128 bit encryption
HIGH | all ciphers using Triple-DES
RSA | all ciphers using RSA key exchange
DH | all ciphers using Diffie-Hellman key exchange
EDH | all ciphers using Ephemeral Diffie-Hellman key exchange
ADH | all ciphers using Anonymous Diffie-Hellman key exchange
DSS | all ciphers using DSS authentication
NULL | all ciphers using no encryption

Now where this becomes interesting is that these can be put together to specify the order and ciphers you wish to use. To speed this up there are also aliases (SSLv2, SSLv3, TLSv1, EXP, LOW, MEDIUM, HIGH) for certain groups of ciphers. These tags can be joined together with prefixes to form the cipher-spec. Available prefixes are:

  • none: add cipher to list
  • +: move matching ciphers to the current location in list
  • -: remove cipher from list (can be added later again)
  • !: kill cipher from list completely (can not be added later again)

A simpler way to look at all of this is to use the ``openssl ciphers -v'' command which provides a nice way to successively create the correct cipher-spec string. The default cipher-spec string is ``ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP'' which means the following: first, remove from consideration any ciphers that do not authenticate, i.e. for SSL only the Anonymous Diffie-Hellman ciphers. Next, use ciphers using RC4 and RSA. Next include the high, medium and then the low security ciphers. Finally pull all SSLv2 and export ciphers to the end of the list.

$ openssl ciphers -v 'ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP'
NULL-SHA                SSLv3 Kx=RSA      Au=RSA  Enc=None      Mac=SHA1
NULL-MD5                SSLv3 Kx=RSA      Au=RSA  Enc=None      Mac=MD5
EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
...                     ...               ...     ...           ...
EXP-RC4-MD5             SSLv3 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export
EXP-RC2-CBC-MD5         SSLv2 Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export
EXP-RC4-MD5             SSLv2 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export

The complete list of particular RSA & DH ciphers for SSL is given in Table 2.

Example

SSLCipherSuite RSA:!EXP:!NULL:+HIGH:+MEDIUM:-LOW

Cipher-Tag | Protocol | Key Ex. | Auth. | Enc. | MAC | Type
RSA Ciphers:
DES-CBC3-SHA | SSLv3 | RSA | RSA | 3DES(168) | SHA1 |
DES-CBC3-MD5 | SSLv2 | RSA | RSA | 3DES(168) | MD5 |
IDEA-CBC-SHA | SSLv3 | RSA | RSA | IDEA(128) | SHA1 |
RC4-SHA | SSLv3 | RSA | RSA | RC4(128) | SHA1 |
RC4-MD5 | SSLv3 | RSA | RSA | RC4(128) | MD5 |
IDEA-CBC-MD5 | SSLv2 | RSA | RSA | IDEA(128) | MD5 |
RC2-CBC-MD5 | SSLv2 | RSA | RSA | RC2(128) | MD5 |
RC4-MD5 | SSLv2 | RSA | RSA | RC4(128) | MD5 |
DES-CBC-SHA | SSLv3 | RSA | RSA | DES(56) | SHA1 |
RC4-64-MD5 | SSLv2 | RSA | RSA | RC4(64) | MD5 |
DES-CBC-MD5 | SSLv2 | RSA | RSA | DES(56) | MD5 |
EXP-DES-CBC-SHA | SSLv3 | RSA(512) | RSA | DES(40) | SHA1 | export
EXP-RC2-CBC-MD5 | SSLv3 | RSA(512) | RSA | RC2(40) | MD5 | export
EXP-RC4-MD5 | SSLv3 | RSA(512) | RSA | RC4(40) | MD5 | export
EXP-RC2-CBC-MD5 | SSLv2 | RSA(512) | RSA | RC2(40) | MD5 | export
EXP-RC4-MD5 | SSLv2 | RSA(512) | RSA | RC4(40) | MD5 | export
NULL-SHA | SSLv3 | RSA | RSA | None | SHA1 |
NULL-MD5 | SSLv3 | RSA | RSA | None | MD5 |
Diffie-Hellman Ciphers:
ADH-DES-CBC3-SHA | SSLv3 | DH | None | 3DES(168) | SHA1 |
ADH-DES-CBC-SHA | SSLv3 | DH | None | DES(56) | SHA1 |
ADH-RC4-MD5 | SSLv3 | DH | None | RC4(128) | MD5 |
EDH-RSA-DES-CBC3-SHA | SSLv3 | DH | RSA | 3DES(168) | SHA1 |
EDH-DSS-DES-CBC3-SHA | SSLv3 | DH | DSS | 3DES(168) | SHA1 |
EDH-RSA-DES-CBC-SHA | SSLv3 | DH | RSA | DES(56) | SHA1 |
EDH-DSS-DES-CBC-SHA | SSLv3 | DH | DSS | DES(56) | SHA1 |
EXP-EDH-RSA-DES-CBC-SHA | SSLv3 | DH(512) | RSA | DES(40) | SHA1 | export
EXP-EDH-DSS-DES-CBC-SHA | SSLv3 | DH(512) | DSS | DES(40) | SHA1 | export
EXP-ADH-DES-CBC-SHA | SSLv3 | DH(512) | None | DES(40) | SHA1 | export
EXP-ADH-RC4-MD5 | SSLv3 | DH(512) | None | RC4(40) | MD5 | export

SSLCompression Directive

Description: | Enable compression on the SSL level
Syntax: | SSLCompression on|off
Default: | SSLCompression off
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl
Compatibility: | Available in httpd 2.2.24 and later, if using OpenSSL 0.9.8 or later; virtual host scope available if using OpenSSL 1.0.0 or later. The default used to be on in versions 2.2.24 to 2.2.25.

This directive allows to enable compression on the SSL level.

Enabling compression causes security issues in most setups (the so called CRIME attack).

SSLCryptoDevice Directive

Description: | Enable use of a cryptographic hardware accelerator
Syntax: | SSLCryptoDevice engine
Default: | SSLCryptoDevice builtin
Context: | server config
Status: | Extension
Module: | mod_ssl
Compatibility: | Available in Apache 2.1 and later, if using -engine flavor of OpenSSL 0.9.6, or OpenSSL 0.9.7 or later

This directive enables use of a cryptographic hardware accelerator board to offload some of the SSL processing overhead. This directive can only be used if the SSL toolkit is built with "engine" support; OpenSSL 0.9.7 and later releases have "engine" support by default, the separate "-engine" releases of OpenSSL 0.9.6 must be used.

To discover which engine names are supported, run the command "openssl engine".

Example

# For a Broadcom accelerator:
SSLCryptoDevice ubsec

SSLEngine Directive

Description: | SSL Engine Operation Switch
Syntax: | SSLEngine on|off|optional
Default: | SSLEngine off
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive toggles the usage of the SSL/TLS Protocol Engine. This should be used inside a <VirtualHost> section to enable SSL/TLS for a that virtual host. By default the SSL/TLS Protocol Engine is disabled for both the main server and all configured virtual hosts.

Example

<VirtualHost _default_:443>
SSLEngine on
...
</VirtualHost>

In Apache 2.1 and later, SSLEngine can be set to optional. This enables support for RFC 2817, Upgrading to TLS Within HTTP/1.1. At this time no web browsers support RFC 2817.

SSLFIPS Directive

Description: | SSL FIPS mode Switch
Syntax: | SSLFIPS on|off
Default: | SSLFIPS off
Context: | server config
Status: | Extension
Module: | mod_ssl

This directive toggles the usage of the SSL library FIPS_mode flag. It must be set in the global server context and cannot be configured with conflicting settings (SSLFIPS on followed by SSLFIPS off or similar). The mode applies to all SSL library operations.

If httpd was compiled against an SSL library which did not support the FIPS_mode flag, SSLFIPS on will fail. Refer to the FIPS 140-2 Security Policy document of the SSL provider library for specific requirements to use mod_ssl in a FIPS 140-2 approved mode of operation; note that mod_ssl itself is not validated, but may be described as using FIPS 140-2 validated cryptographic module, when all components are assembled and operated under the guidelines imposed by the applicable Security Policy.

SSLHonorCipherOrder Directive

Description: | Option to prefer the server's cipher preference order
Syntax: | SSLHonorCipherOrder flag
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl
Compatibility: | Available in Apache 2.1 and later, if using OpenSSL 0.9.7 or later

When choosing a cipher during an SSLv3 or TLSv1 handshake, normally the client's preference is used. If this directive is enabled, the server's preference will be used instead.

Example

SSLHonorCipherOrder on

SSLInsecureRenegotiation Directive

Description: | Option to enable support for insecure renegotiation
Syntax: | SSLInsecureRenegotiation flag
Default: | SSLInsecureRenegotiation off
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl
Compatibility: | Available in httpd 2.2.15 and later, if using OpenSSL 0.9.8m or later

As originally specified, all versions of the SSL and TLS protocols (up to and including TLS/1.2) were vulnerable to a Man-in-the-Middle attack (CVE-2009-3555) during a renegotiation. This vulnerability allowed an attacker to "prefix" a chosen plaintext to the HTTP request as seen by the web server. A protocol extension was developed which fixed this vulnerability if supported by both client and server.

If mod_ssl is linked against OpenSSL version 0.9.8m or later, by default renegotiation is only supported with clients supporting the new protocol extension. If this directive is enabled, renegotiation will be allowed with old (unpatched) clients, albeit insecurely.

Security warning

If this directive is enabled, SSL connections will be vulnerable to the Man-in-the-Middle prefix attack as described in CVE-2009-3555.

Example

SSLInsecureRenegotiation on

The SSL_SECURE_RENEG environment variable can be used from an SSI or CGI script to determine whether secure renegotiation is supported for a given SSL connection.

SSLMutex Directive

Description: | Semaphore for internal mutual exclusion of operations
Syntax: | SSLMutex type
Default: | SSLMutex none
Context: | server config
Status: | Extension
Module: | mod_ssl

This configures the SSL engine's semaphore (aka. lock) which is used for mutual exclusion of operations which have to be done in a synchronized way between the pre-forked Apache server processes. This directive can only be used in the global server context because it's only useful to have one global mutex. This directive is designed to closely match the AcceptMutex directive.

The following Mutex types are available:

  • none | no

    This is the default where no Mutex is used at all. Use it at your own risk. But because currently the Mutex is mainly used for synchronizing write access to the SSL Session Cache you can live without it as long as you accept a sometimes garbled Session Cache. So it's not recommended to leave this the default. Instead configure a real Mutex.

  • posixsem

    This is an elegant Mutex variant where a Posix Semaphore is used when possible. It is only available when the underlying platform and APR supports it.

  • sysvsem

    This is a somewhat elegant Mutex variant where a SystemV IPC Semaphore is used when possible. It is possible to "leak" SysV semaphores if processes crash before the semaphore is removed. It is only available when the underlying platform and APR supports it.

  • sem

    This directive tells the SSL Module to pick the "best" semaphore implementation available to it, choosing between Posix and SystemV IPC, in that order. It is only available when the underlying platform and APR supports at least one of the 2.

  • pthread

    This directive tells the SSL Module to use Posix thread mutexes. It is only available if the underlying platform and APR supports it.

  • fcntl:/path/to/mutex

    This is a portable Mutex variant where a physical (lock-)file and the fcntl() function are used as the Mutex. Always use a local disk filesystem for /path/to/mutex and never a file residing on a NFS- or AFS-filesystem. It is only available when the underlying platform and APR supports it. Note: Internally, the Process ID (PID) of the Apache parent process is automatically appended to /path/to/mutex to make it unique, so you don't have to worry about conflicts yourself. Notice that this type of mutex is not available under the Win32 environment. There you have to use the semaphore mutex.

  • flock:/path/to/mutex

    This is similar to the fcntl:/path/to/mutex method with the exception that the flock() function is used to provide file locking. It is only available when the underlying platform and APR supports it.

  • file:/path/to/mutex

    This directive tells the SSL Module to pick the "best" file locking implementation available to it, choosing between fcntl and flock, in that order. It is only available when the underlying platform and APR supports at least one of the 2.

  • default | yes

    This directive tells the SSL Module to pick the default locking implementation as determined by the platform and APR.

Example

SSLMutex file:/usr/local/apache/logs/ssl_mutex

SSLOptions Directive

Description: | Configure various SSL engine run-time options
Syntax: | SSLOptions [+|-]option ...
Context: | server config, virtual host, directory, .htaccess
Override: | Options
Status: | Extension
Module: | mod_ssl

This directive can be used to control various run-time options on a per-directory basis. Normally, if multiple SSLOptions could apply to a directory, then the most specific one is taken completely; the options are not merged. However if all the options on the SSLOptions directive are preceded by a plus (+) or minus (-) symbol, the options are merged. Any options preceded by a + are added to the options currently in force, and any options preceded by a - are removed from the options currently in force.

The available options are:

  • StdEnvVars

    When this option is enabled, the standard set of SSL related CGI/SSI environment variables are created. This per default is disabled for performance reasons, because the information extraction step is a rather expensive operation. So one usually enables this option for CGI and SSI requests only.

  • ExportCertData

    When this option is enabled, additional CGI/SSI environment variables are created: SSL_SERVER_CERT, SSL_CLIENT_CERT and SSL_CLIENT_CERT_CHAIN_n (with n = 0,1,2,..). These contain the PEM-encoded X.509 Certificates of server and client for the current HTTPS connection and can be used by CGI scripts for deeper Certificate checking. Additionally all other certificates of the client certificate chain are provided, too. This bloats up the environment a little bit which is why you have to use this option to enable it on demand.

  • FakeBasicAuth

    When this option is enabled, the Subject Distinguished Name (DN) of the Client X509 Certificate is translated into a HTTP Basic Authorization username. This means that the standard Apache authentication methods can be used for access control. The user name is just the Subject of the Client's X509 Certificate (can be determined by running OpenSSL's openssl x509 command: openssl x509 -noout -subject -in certificate.crt). Note that no password is obtained from the user. Every entry in the user file needs this password: ``xxj31ZMTZzkVA'', which is the DES-encrypted version of the word `password''. Those who live under MD5-based encryption (for instance under FreeBSD or BSD/OS, etc.) should use the following MD5 hash of the same word: ``$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/''.

  • StrictRequire

    This forces forbidden access when SSLRequireSSL or SSLRequire successfully decided that access should be forbidden. Usually the default is that in the case where a ``Satisfy any'' directive is used, and other access restrictions are passed, denial of access due to SSLRequireSSL or SSLRequire is overridden (because that's how the Apache Satisfy mechanism should work.) But for strict access restriction you can use SSLRequireSSL and/or SSLRequire in combination with an ``SSLOptions +StrictRequire''. Then an additional ``Satisfy Any'' has no chance once mod_ssl has decided to deny access.

  • OptRenegotiate

    This enables optimized SSL connection renegotiation handling when SSL directives are used in per-directory context. By default a strict scheme is enabled where every per-directory reconfiguration of SSL parameters causes a full SSL renegotiation handshake. When this option is used mod_ssl tries to avoid unnecessary handshakes by doing more granular (but still safe) parameter checks. Nevertheless these granular checks sometimes maybe not what the user expects, so enable this on a per-directory basis only, please.

Example

SSLOptions +FakeBasicAuth -StrictRequire
<Files ~ "\.(cgi|shtml)$">
SSLOptions +StdEnvVars -ExportCertData
<Files>

SSLPassPhraseDialog Directive

Description: | Type of pass phrase dialog for encrypted private keys
Syntax: | SSLPassPhraseDialog type
Default: | SSLPassPhraseDialog builtin
Context: | server config
Status: | Extension
Module: | mod_ssl

When Apache starts up it has to read the various Certificate (see SSLCertificateFile) and Private Key (see SSLCertificateKeyFile) files of the SSL-enabled virtual servers. Because for security reasons the Private Key files are usually encrypted, mod_ssl needs to query the administrator for a Pass Phrase in order to decrypt those files. This query can be done in two ways which can be configured by type:

  • builtin

    This is the default where an interactive terminal dialog occurs at startup time just before Apache detaches from the terminal. Here the administrator has to manually enter the Pass Phrase for each encrypted Private Key file. Because a lot of SSL-enabled virtual hosts can be configured, the following reuse-scheme is used to minimize the dialog: When a Private Key file is encrypted, all known Pass Phrases (at the beginning there are none, of course) are tried. If one of those known Pass Phrases succeeds no dialog pops up for this particular Private Key file. If none succeeded, another Pass Phrase is queried on the terminal and remembered for the next round (where it perhaps can be reused).

    This scheme allows mod_ssl to be maximally flexible (because for N encrypted Private Key files you can use N different Pass Phrases - but then you have to enter all of them, of course) while minimizing the terminal dialog (i.e. when you use a single Pass Phrase for all N Private Key files this Pass Phrase is queried only once).

  • |/path/to/program [args...]

    This mode allows an external program to be used which acts as a pipe to a particular input device; the program is sent the standard prompt text used for the builtin mode on stdin, and is expected to write password strings on stdout. If several passwords are needed (or an incorrect password is entered), additional prompt text will be written subsequent to the first password being returned, and more passwords must then be written back.

  • exec:/path/to/program

    Here an external program is configured which is called at startup for each encrypted Private Key file. It is called with two arguments (the first is of the form ``servername:portnumber'', the second is either ``RSA'', ``DSA'', or ``ECC''), which indicate for which server and algorithm it has to print the corresponding Pass Phrase to stdout. The intent is that this external program first runs security checks to make sure that the system is not compromised by an attacker, and only when these checks were passed successfully it provides the Pass Phrase.

    Both these security checks, and the way the Pass Phrase is determined, can be as complex as you like. Mod_ssl just defines the interface: an executable program which provides the Pass Phrase on stdout. Nothing more or less! So, if you're really paranoid about security, here is your interface. Anything else has to be left as an exercise to the administrator, because local security requirements are so different.

    The reuse-algorithm above is used here, too. In other words: The external program is called only once per unique Pass Phrase.

Example

SSLPassPhraseDialog exec:/usr/local/apache/sbin/pp-filter

SSLProtocol Directive

Description: | Configure usable SSL protocol flavors
Syntax: | SSLProtocol [+|-]protocol ...
Default: | SSLProtocol all
Context: | server config, virtual host
Override: | Options
Status: | Extension
Module: | mod_ssl

This directive can be used to control the SSL protocol flavors mod_ssl should use when establishing its server environment. Clients then can only connect with one of the provided protocols.

The available (case-insensitive) protocols are:

  • SSLv2

    This is the Secure Sockets Layer (SSL) protocol, version 2.0. It is the original SSL protocol as designed by Netscape Corporation. Though its use has been deprecated, because of weaknesses in the security of the protocol.

  • SSLv3

    This is the Secure Sockets Layer (SSL) protocol, version 3.0, from the Netscape Corporation. It is the successor to SSLv2 and the predecessor to TLSv1. It's supported by almost all popular browsers.

  • TLSv1

    This is the Transport Layer Security (TLS) protocol, version 1.0. It is the successor to SSLv3 and is defined in RFC 2246.

  • TLSv1.1 (when using OpenSSL 1.0.1 and later)

    A revision of the TLS 1.0 protocol, as defined in RFC 4346.

  • TLSv1.2 (when using OpenSSL 1.0.1 and later)

    A revision of the TLS 1.1 protocol, as defined in RFC 5246.

  • All

    This is a shortcut for ``+SSLv2 +SSLv3 +TLSv1'' or - when using OpenSSL 1.0.1 and later - ``+SSLv2 +SSLv3 +TLSv1 +TLSv1.1 +TLSv1.2'', respectively.

Example

# enable SSLv3 and all available TLSv1 flavors, but not SSLv2
SSLProtocol All -SSLv2

SSLProxyCACertificateFile Directive

Description: | File of concatenated PEM-encoded CA Certificates for Remote Server Auth
Syntax: | SSLProxyCACertificateFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the all-in-one file where you can assemble the Certificates of Certification Authorities (CA) whose remote servers you deal with. These are used for Remote Server Authentication. Such a file is simply the concatenation of the various PEM-encoded Certificate files, in order of preference. This can be used alternatively and/or additionally to SSLProxyCACertificatePath.

Example

SSLProxyCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle-remote-server.crt

SSLProxyCACertificatePath Directive

Description: | Directory of PEM-encoded CA Certificates for Remote Server Auth
Syntax: | SSLProxyCACertificatePath directory-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the directory where you keep the Certificates of Certification Authorities (CAs) whose remote servers you deal with. These are used to verify the remote server certificate on Remote Server Authentication.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you can't just place the Certificate files there: you also have to create symbolic links named hash-value.N. And you should always make sure this directory contains the appropriate symbolic links.

Example

SSLProxyCACertificatePath /usr/local/apache2/conf/ssl.crt/

SSLProxyCARevocationFile Directive

Description: | File of concatenated PEM-encoded CA CRLs for Remote Server Auth
Syntax: | SSLProxyCARevocationFile file-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the all-in-one file where you can assemble the Certificate Revocation Lists (CRL) of Certification Authorities (CA) whose remote servers you deal with. These are used for Remote Server Authentication. Such a file is simply the concatenation of the various PEM-encoded CRL files, in order of preference. This can be used alternatively and/or additionally to SSLProxyCARevocationPath.

Example

SSLProxyCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle-remote-server.crl

SSLProxyCARevocationPath Directive

Description: | Directory of PEM-encoded CA CRLs for Remote Server Auth
Syntax: | SSLProxyCARevocationPath directory-path
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets the directory where you keep the Certificate Revocation Lists (CRL) of Certification Authorities (CAs) whose remote servers you deal with. These are used to revoke the remote server certificate on Remote Server Authentication.

The files in this directory have to be PEM-encoded and are accessed through hash filenames. So usually you have not only to place the CRL files there. Additionally you have to create symbolic links named hash-value.rN. And you should always make sure this directory contains the appropriate symbolic links.

Example

SSLProxyCARevocationPath /usr/local/apache2/conf/ssl.crl/

SSLProxyCheckPeerCN Directive

Description: | Whether to check the remote server certificates CN field
Syntax: | SSLProxyCheckPeerCN on|off
Default: | SSLProxyCheckPeerCN off
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets whether the remote server certificates CN field is compared against the hostname of the request URL. If both are not equal a 502 status code (Bad Gateway) is sent.

Example

SSLProxyCheckPeerCN on

SSLProxyCheckPeerExpire Directive

Description: | Whether to check if remote server certificate is expired
Syntax: | SSLProxyCheckPeerExpire on|off
Default: | SSLProxyCheckPeerExpire off
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive sets whether it is checked if the remote server certificate is expired or not. If the check fails a 502 status code (Bad Gateway) is sent.

Example

SSLProxyCheckPeerExpire on

SSLProxyCipherSuite Directive

Description: | Cipher Suite available for negotiation in SSL proxy handshake
Syntax: | SSLProxyCipherSuite cipher-spec
Default: | SSLProxyCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
Context: | server config, virtual host, directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl

Equivalent to SSLCipherSuite, but for the proxy connection. Please refer to SSLCipherSuite for additional information.

SSLProxyEngine Directive

Description: | SSL Proxy Engine Operation Switch
Syntax: | SSLProxyEngine on|off
Default: | SSLProxyEngine off
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

This directive toggles the usage of the SSL/TLS Protocol Engine for proxy. This is usually used inside a <VirtualHost> section to enable SSL/TLS for proxy usage in a particular virtual host. By default the SSL/TLS Protocol Engine is disabled for proxy both for the main server and all configured virtual hosts.

Note that the SSLProxyEngine directive should not, in general, be included in a virtual host that will be acting as a forward proxy (using <Proxy> or <ProxyRequest> directives. SSLProxyEngine is not required to enable a forward proxy server to proxy SSL/TLS requests.

Example

<VirtualHost _default_:443>
SSLProxyEngine on
...
</VirtualHost>

SSLProxyMachineCertificateChainFile Directive

Description: | File of concatenated PEM-encoded CA certificates to be used by the proxy for choosing a certificate
Syntax: | SSLProxyMachineCertificateChainFile filename
Context: | server config
Override: | Not applicable
Status: | Extension
Module: | mod_ssl
Compatibility: | Available in Apache 2.2.23 and later

This directive sets the all-in-one file where you keep the certificate chain for all of the client certs in use. This directive will be needed if the remote server presents a list of CA certificates that are not direct signers of one of the configured client certificates.

This referenced file is simply the concatenation of the various PEM-encoded certificate files. Upon startup, each client certificate configured will be examined and a chain of trust will be constructed.

Security warning

If this directive is enabled, all of the certificates in the file will be trusted as if they were also in SSLProxyCACertificateFile.

Example

SSLProxyMachineCertificateChainFile /usr/local/apache2/conf/ssl.crt/proxyCA.pem

SSLProxyMachineCertificateFile Directive

Description: | File of concatenated PEM-encoded client certificates and keys to be used by the proxy
Syntax: | SSLProxyMachineCertificateFile filename
Context: | server config
Override: | Not applicable
Status: | Extension
Module: | mod_ssl

This directive sets the all-in-one file where you keep the certificates and keys used for authentication of the proxy server to remote servers.

This referenced file is simply the concatenation of the various PEM-encoded certificate files, in order of preference. Use this directive alternatively or additionally to SSLProxyMachineCertificatePath.

Currently there is no support for encrypted private keys

Example

SSLProxyMachineCertificateFile /usr/local/apache2/conf/ssl.crt/proxy.pem

SSLProxyMachineCertificatePath Directive

Description: | Directory of PEM-encoded client certificates and keys to be used by the proxy
Syntax: | SSLProxyMachineCertificatePath directory
Context: | server config
Override: | Not applicable
Status: | Extension
Module: | mod_ssl

This directive sets the directory where you keep the certificates and keys used for authentication of the proxy server to remote servers.

The files in this directory must be PEM-encoded and are accessed through hash filenames. Additionally, you must create symbolic links named hash-value.N. And you should always make sure this directory contains the appropriate symbolic links.

Currently there is no support for encrypted private keys

Example

SSLProxyMachineCertificatePath /usr/local/apache2/conf/proxy.crt/

SSLProxyProtocol Directive

Description: | Configure usable SSL protocol flavors for proxy usage
Syntax: | SSLProxyProtocol [+|-]protocol ...
Default: | SSLProxyProtocol all
Context: | server config, virtual host
Override: | Options
Status: | Extension
Module: | mod_ssl

This directive can be used to control the SSL protocol flavors mod_ssl should use when establishing its server environment for proxy . It will only connect to servers using one of the provided protocols.

Please refer to SSLProtocol for additional information.

SSLProxyVerify Directive

Description: | Type of remote server Certificate verification
Syntax: | SSLProxyVerify level
Default: | SSLProxyVerify none
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl

When a proxy is configured to forward requests to a remote SSL server, this directive can be used to configure certificate verification of the remote server.

Note that even when certificate verification is enabled, mod_ssl does not check whether the commonName (hostname) attribute of the server certificate matches the hostname used to connect to the server. In other words, the proxy does not guarantee that the SSL connection to the backend server is "secure" beyond the fact that the certificate is signed by one of the CAs configured using the SSLProxyCACertificatePath and/or SSLProxyCACertificateFile directives. In order to get this check done please have a look at SSLProxyCheckPeerCN and SSLProxyCheckPeerExpire directives which are off by default.

The following levels are available for level:

  • none: no remote server Certificate is required at all
  • optional: the remote server may present a valid Certificate
  • require: the remote server has to present a valid Certificate
  • optional_no_ca: the remote server may present a valid Certificate
    but it need not to be (successfully) verifiable.

In practice only levels none and require are really interesting, because level optional doesn't work with all servers and level optional_no_ca is actually against the idea of authentication (but can be used to establish SSL test pages, etc.)

Example

SSLProxyVerify require

SSLProxyVerifyDepth Directive

Description: | Maximum depth of CA Certificates in Remote Server Certificate verification
Syntax: | SSLProxyVerifyDepth number
Default: | SSLProxyVerifyDepth 1
Context: | server config, virtual host
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl

This directive sets how deeply mod_ssl should verify before deciding that the remote server does not have a valid certificate.

The depth actually is the maximum number of intermediate certificate issuers, i.e. the number of CA certificates which are max allowed to be followed while verifying the remote server certificate. A depth of 0 means that self-signed remote server certificates are accepted only, the default depth of 1 means the remote server certificate can be self-signed or has to be signed by a CA which is directly known to the server (i.e. the CA's certificate is under SSLProxyCACertificatePath), etc.

Example

SSLProxyVerifyDepth 10

SSLRandomSeed Directive

Description: | Pseudo Random Number Generator (PRNG) seeding source
Syntax: | SSLRandomSeed context source [bytes]
Context: | server config
Status: | Extension
Module: | mod_ssl

This configures one or more sources for seeding the Pseudo Random Number Generator (PRNG) in OpenSSL at startup time (context is startup) and/or just before a new SSL connection is established (context is connect). This directive can only be used in the global server context because the PRNG is a global facility.

The following source variants are available:

  • builtin

    This is the always available builtin seeding source. Its usage consumes minimum CPU cycles under runtime and hence can be always used without drawbacks. The source used for seeding the PRNG contains of the current time, the current process id and (when applicable) a randomly chosen 1KB extract of the inter-process scoreboard structure of Apache. The drawback is that this is not really a strong source and at startup time (where the scoreboard is still not available) this source just produces a few bytes of entropy. So you should always, at least for the startup, use an additional seeding source.

  • file:/path/to/source

    This variant uses an external file /path/to/source as the source for seeding the PRNG. When bytes is specified, only the first bytes number of bytes of the file form the entropy (and bytes is given to /path/to/source as the first argument). When bytes is not specified the whole file forms the entropy (and 0 is given to /path/to/source as the first argument). Use this especially at startup time, for instance with an available /dev/random and/or /dev/urandom devices (which usually exist on modern Unix derivatives like FreeBSD and Linux).

    But be careful: Usually /dev/random provides only as much entropy data as it actually has, i.e. when you request 512 bytes of entropy, but the device currently has only 100 bytes available two things can happen: On some platforms you receive only the 100 bytes while on other platforms the read blocks until enough bytes are available (which can take a long time). Here using an existing /dev/urandom is better, because it never blocks and actually gives the amount of requested data. The drawback is just that the quality of the received data may not be the best.

    On some platforms like FreeBSD one can even control how the entropy is actually generated, i.e. by which system interrupts. More details one can find under rndcontrol(8) on those platforms. Alternatively, when your system lacks such a random device, you can use a tool like EGD (Entropy Gathering Daemon) and run its client program with the exec:/path/to/program/ variant (see below) or use egd:/path/to/egd-socket (see below).

  • exec:/path/to/program

    This variant uses an external executable /path/to/program as the source for seeding the PRNG. When bytes is specified, only the first bytes number of bytes of its stdout contents form the entropy. When bytes is not specified, the entirety of the data produced on stdout form the entropy. Use this only at startup time when you need a very strong seeding with the help of an external program (for instance as in the example above with the truerand utility you can find in the mod_ssl distribution which is based on the AT&T truerand library). Using this in the connection context slows down the server too dramatically, of course. So usually you should avoid using external programs in that context.

  • egd:/path/to/egd-socket (Unix only)

    This variant uses the Unix domain socket of the external Entropy Gathering Daemon (EGD) (see http://www.lothar.com/tech /crypto/) to seed the PRNG. Use this if no random device exists on your platform.

Example

SSLRandomSeed startup builtin
SSLRandomSeed startup file:/dev/random
SSLRandomSeed startup file:/dev/urandom 1024
SSLRandomSeed startup exec:/usr/local/bin/truerand 16
SSLRandomSeed connect builtin
SSLRandomSeed connect file:/dev/random
SSLRandomSeed connect file:/dev/urandom 1024

SSLRenegBufferSize Directive

Description: | Set the size for the SSL renegotiation buffer
Syntax: | SSLRenegBufferSize bytes
Default: | SSLRenegBufferSize 131072
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl

If an SSL renegotiation is required in per-location context, for example, any use of SSLVerifyClient in a Directory or Location block, then mod_ssl must buffer any HTTP request body into memory until the new SSL handshake can be performed. This directive can be used to set the amount of memory that will be used for this buffer.

Note that in many configurations, the client sending the request body will be untrusted so a denial of service attack by consumption of memory must be considered when changing this configuration setting.

Example

SSLRenegBufferSize 262144

SSLRequire Directive

Description: | Allow access only when an arbitrarily complex boolean expression is true
Syntax: | SSLRequire expression
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl

This directive specifies a general access requirement which has to be fulfilled in order to allow access. It is a very powerful directive because the requirement specification is an arbitrarily complex boolean expression containing any number of access checks.

The implementation of SSLRequire is not thread safe. Using SSLRequire inside .htaccess files on a threaded MPM may cause random crashes.

The expression must match the following syntax (given as a BNF grammar notation):

expr     ::= "true" | "false"
           | "!" expr
           | expr "&&" expr
           | expr "||" expr
           | "(" expr ")"
           | comp

comp     ::= word "==" word | word "eq" word
           | word "!=" word | word "ne" word
           | word "<"  word | word "lt" word
           | word "<=" word | word "le" word
           | word ">"  word | word "gt" word
           | word ">=" word | word "ge" word
           | word "in" "{" wordlist "}"
           | word "in" "OID(" word ")"
           | word "=~" regex
           | word "!~" regex

wordlist ::= word
           | wordlist "," word

word     ::= digit
           | cstring
           | variable
           | function

digit    ::= [0-9]+
cstring  ::= "..."
variable ::= "%{" varname "}"
function ::= funcname "(" funcargs ")"

while for varname any variable from Table 3 can be used. Finally for funcname the following functions are available:

  • file(filename)

    This function takes one string argument and expands to the contents of the file. This is especially useful for matching this contents against a regular expression, etc.

Notice that expression is first parsed into an internal machine representation and then evaluated in a second step. Actually, in Global and Per-Server Class context expression is parsed at startup time and at runtime only the machine representation is executed. For Per-Directory context, specifically in a .htaccess context, this is different: here expression has to be parsed and immediately executed for every request.

Example

SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)-/ \
and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/

The OID() function expects to find zero or more instances of the given OID in the client certificate, and compares the left-hand side string against the value of matching OID attributes. Every matching OID is checked, until a match is found.

Standard CGI/1.0 and Apache variables:

HTTP_USER_AGENT        PATH_INFO             AUTH_TYPE
HTTP_REFERER           QUERY_STRING          SERVER_SOFTWARE
HTTP_COOKIE            REMOTE_HOST           API_VERSION
HTTP_FORWARDED         REMOTE_IDENT          TIME_YEAR
HTTP_HOST              IS_SUBREQ             TIME_MON
HTTP_PROXY_CONNECTION  DOCUMENT_ROOT         TIME_DAY
HTTP_ACCEPT            SERVER_ADMIN          TIME_HOUR
HTTP:headername        SERVER_NAME           TIME_MIN
THE_REQUEST            SERVER_PORT           TIME_SEC
REQUEST_METHOD         SERVER_PROTOCOL       TIME_WDAY
REQUEST_SCHEME         REMOTE_ADDR           TIME
REQUEST_URI            REMOTE_USER           ENV:variablename
REQUEST_FILENAME

SSL-related variables:

HTTPS                  SSL_CLIENT_M_VERSION   SSL_SERVER_M_VERSION
                       SSL_CLIENT_M_SERIAL    SSL_SERVER_M_SERIAL
SSL_PROTOCOL           SSL_CLIENT_V_START     SSL_SERVER_V_START
SSL_SESSION_ID         SSL_CLIENT_V_END       SSL_SERVER_V_END
SSL_CIPHER             SSL_CLIENT_S_DN        SSL_SERVER_S_DN
SSL_CIPHER_EXPORT      SSL_CLIENT_S_DN_C      SSL_SERVER_S_DN_C
SSL_CIPHER_ALGKEYSIZE  SSL_CLIENT_S_DN_ST     SSL_SERVER_S_DN_ST
SSL_CIPHER_USEKEYSIZE  SSL_CLIENT_S_DN_L      SSL_SERVER_S_DN_L
SSL_VERSION_LIBRARY    SSL_CLIENT_S_DN_O      SSL_SERVER_S_DN_O
SSL_VERSION_INTERFACE  SSL_CLIENT_S_DN_OU     SSL_SERVER_S_DN_OU
                       SSL_CLIENT_S_DN_CN     SSL_SERVER_S_DN_CN
                       SSL_CLIENT_S_DN_T      SSL_SERVER_S_DN_T
                       SSL_CLIENT_S_DN_I      SSL_SERVER_S_DN_I
                       SSL_CLIENT_S_DN_G      SSL_SERVER_S_DN_G
                       SSL_CLIENT_S_DN_S      SSL_SERVER_S_DN_S
                       SSL_CLIENT_S_DN_D      SSL_SERVER_S_DN_D
                       SSL_CLIENT_S_DN_UID    SSL_SERVER_S_DN_UID
                       SSL_CLIENT_S_DN_Email  SSL_SERVER_S_DN_Email
                       SSL_CLIENT_I_DN        SSL_SERVER_I_DN
                       SSL_CLIENT_I_DN_C      SSL_SERVER_I_DN_C
                       SSL_CLIENT_I_DN_ST     SSL_SERVER_I_DN_ST
                       SSL_CLIENT_I_DN_L      SSL_SERVER_I_DN_L
                       SSL_CLIENT_I_DN_O      SSL_SERVER_I_DN_O
                       SSL_CLIENT_I_DN_OU     SSL_SERVER_I_DN_OU
                       SSL_CLIENT_I_DN_CN     SSL_SERVER_I_DN_CN
                       SSL_CLIENT_I_DN_T      SSL_SERVER_I_DN_T
                       SSL_CLIENT_I_DN_I      SSL_SERVER_I_DN_I
                       SSL_CLIENT_I_DN_G      SSL_SERVER_I_DN_G
                       SSL_CLIENT_I_DN_S      SSL_SERVER_I_DN_S
                       SSL_CLIENT_I_DN_D      SSL_SERVER_I_DN_D
                       SSL_CLIENT_I_DN_UID    SSL_SERVER_I_DN_UID
                       SSL_CLIENT_I_DN_Email  SSL_SERVER_I_DN_Email
                       SSL_CLIENT_A_SIG       SSL_SERVER_A_SIG
                       SSL_CLIENT_A_KEY       SSL_SERVER_A_KEY
                       SSL_CLIENT_CERT        SSL_SERVER_CERT
                       SSL_CLIENT_CERT_CHAIN_n
                       SSL_CLIENT_VERIFY      SSL_TLS_SNI

SSLRequireSSL Directive

Description: | Deny access when SSL is not used for the HTTP request
Syntax: | SSLRequireSSL
Context: | directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl

This directive forbids access unless HTTP over SSL (i.e. HTTPS) is enabled for the current connection. This is very handy inside the SSL-enabled virtual host or directories for defending against configuration errors that expose stuff that should be protected. When this directive is present all requests are denied which are not using SSL.

Example

SSLRequireSSL

SSLSessionCache Directive

Description: | Type of the global/inter-process SSL Session Cache
Syntax: | SSLSessionCache type
Default: | SSLSessionCache none
Context: | server config
Status: | Extension
Module: | mod_ssl

This configures the storage type of the global/inter-process SSL Session Cache. This cache is an optional facility which speeds up parallel request processing. For requests to the same server process (via HTTP keep-alive), OpenSSL already caches the SSL session information locally. But because modern clients request inlined images and other data via parallel requests (usually up to four parallel requests are common) those requests are served by different pre-forked server processes. Here an inter-process cache helps to avoid unnecessary session handshakes.

The following four storage types are currently supported:

  • none

    This disables the global/inter-process Session Cache. This will incur a noticeable speed penalty and may cause problems if using certain browsers, particularly if client certificates are enabled. This setting is not recommended.

  • nonenotnull

    This disables any global/inter-process Session Cache. However it does force OpenSSL to send a non-null session ID to accommodate buggy clients that require one.

  • dbm:/path/to/datafile

    This makes use of a DBM hashfile on the local disk to synchronize the local OpenSSL memory caches of the server processes. This session cache may suffer reliability issues under high load.

  • shm:/path/to/datafile[(size)]

    This makes use of a high-performance cyclic buffer (approx. size bytes in size) inside a shared memory segment in RAM (established via /path/to/datafile) to synchronize the local OpenSSL memory caches of the server processes. This is the recommended session cache.

  • dc:UNIX:/path/to/socket

    This makes use of the distcache distributed session caching libraries. The argument should specify the location of the server or proxy to be used using the distcache address syntax; for example, UNIX:/path/to/socket specifies a UNIX domain socket (typically a local dc_client proxy); IP:server.example.com:9001 specifies an IP address.

Examples

SSLSessionCache dbm:/usr/local/apache/logs/ssl_gcache_data
SSLSessionCache shm:/usr/local/apache/logs/ssl_gcache_data(512000)

SSLSessionCacheTimeout Directive

Description: | Number of seconds before an SSL session expires in the Session Cache
Syntax: | SSLSessionCacheTimeout seconds
Default: | SSLSessionCacheTimeout 300
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl
Compatibility: | Applies also to RFC 5077 TLS session resumption in Apache 2.2.28 and later

This directive sets the timeout in seconds for the information stored in the global/inter-process SSL Session Cache, the OpenSSL internal memory cache and for sessions resumed by TLS session resumption (RFC 5077). It can be set as low as 15 for testing, but should be set to higher values like 300 in real life.

Example

SSLSessionCacheTimeout 600

SSLStrictSNIVHostCheck Directive

Description: | Whether to allow non SNI clients to access a name based virtual host.
Syntax: | SSLStrictSNIVHostCheck on|off
Default: | SSLStrictSNIVHostCheck off
Context: | server config, virtual host
Status: | Extension
Module: | mod_ssl
Compatibility: | Available in Apache 2.2.12 and later

This directive sets whether a non SNI client is allowed to access a name based virtual host. If set to on in the non default name based virtual host, non SNI clients are not allowed to access this particular virtual host. If set to on in the default name based virtual host, non SNI clients are not allowed to access any name based virtual host belonging to this IP / port combination.

This option is only available if httpd was compiled against an SNI capable version of OpenSSL.

Example

SSLStrictSNIVHostCheck on

SSLUserName Directive

Description: | Variable name to determine user name
Syntax: | SSLUserName varname
Context: | server config, directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl
Compatibility: | Available in Apache 2.0.51 and later

This directive sets the "user" field in the Apache request object. This is used by lower modules to identify the user with a character string. In particular, this may cause the environment variable REMOTE_USER to be set. The varname can be any of the SSL environment variables.

Note that this directive has no effect if the FakeBasicAuth option is used (see SSLOptions).

Example

SSLUserName SSL_CLIENT_S_DN_CN

SSLVerifyClient Directive

Description: | Type of Client Certificate verification
Syntax: | SSLVerifyClient level
Default: | SSLVerifyClient none
Context: | server config, virtual host, directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl

This directive sets the Certificate verification level for the Client Authentication. Notice that this directive can be used both in per-server and per-directory context. In per-server context it applies to the client authentication process used in the standard SSL handshake when a connection is established. In per-directory context it forces a SSL renegotiation with the reconfigured client verification level after the HTTP request was read but before the HTTP response is sent.

The following levels are available for level:

  • none: no client Certificate is required at all
  • optional: the client may present a valid Certificate
  • require: the client has to present a valid Certificate
  • optional_no_ca: the client may present a valid Certificate
    but it need not to be (successfully) verifiable.

In practice only levels none and require are really interesting, because level optional doesn't work with all browsers and level optional_no_ca is actually against the idea of authentication (but can be used to establish SSL test pages, etc.)

Example

SSLVerifyClient require

SSLVerifyDepth Directive

Description: | Maximum depth of CA Certificates in Client Certificate verification
Syntax: | SSLVerifyDepth number
Default: | SSLVerifyDepth 1
Context: | server config, virtual host, directory, .htaccess
Override: | AuthConfig
Status: | Extension
Module: | mod_ssl

This directive sets how deeply mod_ssl should verify before deciding that the clients don't have a valid certificate. Notice that this directive can be used both in per-server and per-directory context. In per-server context it applies to the client authentication process used in the standard SSL handshake when a connection is established. In per-directory context it forces a SSL renegotiation with the reconfigured client verification depth after the HTTP request was read but before the HTTP response is sent.

The depth actually is the maximum number of intermediate certificate issuers, i.e. the number of CA certificates which are max allowed to be followed while verifying the client certificate. A depth of 0 means that self-signed client certificates are accepted only, the default depth of 1 means the client certificate can be self-signed or has to be signed by a CA which is directly known to the server (i.e. the CA's certificate is under SSLCACertificatePath), etc.

Example

SSLVerifyDepth 10

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


mod_status - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_status

Açıklama: | Sunucu etkinliği ve başarımı hakkında bilgi sağlar.
Durum: | Temel
Modül Betimleyici: | status_module
Kaynak Dosyası: | mod_status.c

Özet

mod_status modülü, sunucu yöneticisinin, HTTP sunucusunun ne kadar başarılı olduğu hakkında bilgi edinmesini sağlar. Bilgiler, kolayca okunabilen bir HTML sayfası olarak sunulur ve o anki sunucu istatistiklerinden oluşur. Gerekirse sayfa kendiliğinden tazelenebilir (uyumlu bir tarayıcı gerekir). Diğer sayfa o anki sunucu durumunu makine tarafından okunabilen biçimde listeler.

Sunulan bilgiler şunlardır:

  • İstekleri sunan çocuk süreç sayısı
  • Boştaki çocuk süreçlerin sayısı
  • Her çocuk sürecin durumu, çocuk sürecin işleme tabi tuttuğu istek sayısı ve sunduğu bayt sayısı (*)
  • Toplam erişim sayısı ve sunulan toplam bayt sayısı (*)
  • Sunucunun kaç kere başlatıldığı/yeniden başlatıldığı ve ne kadar zamandır çalışmakta olduğu
  • Saniyedeki ortalama istek sayısı, saniyedeki bayt sayısı ve istek başına ortalama bayt sayısı (*)
  • Apache tarafınan toplamda ve her çocuk süreç tarafından ayrı ayrı kullanılan o anki işlemci zamanı yüzdesi (*)
  • O an işlem görmekte olan konakların ve isteklerin sayısı (*)

"(*)" imli bilgiler sadece ExtendedStatus yönergesinin değeri On olduğu takdirde mevcuttur.

Durum Bilgisi Desteğinin Etkinleştirilmesi

Durum raporları, sadece mesela.dom alanından ve sadece tarayıcılar için etkin kılınmak istenirse httpd.conf dosyasına şu satırlar eklenebilir:

<Location /server-status>
SetHandler server-status

Order Deny,Allow
Deny from all
Allow from .mesela.dom
 </Location>

Sunucu istatistiklerine tarayıcınızla erişmek isterseniz, http://sunucunuzun.ismi.buraya/server-status şeklinde bir istek yapabilirsiniz.

Sayfanın Tazelenmesi

Tarayıcınız “tazeleme” yeteneğine sahipse durum sayfası düzenli aralıklarla güncellenecektir. Sayfanın N saniyede bir güncellenmesini isterseniz isteği şöyle yapabilirsiniz:
http://sunucunuzun.ismi.buraya/server-status?refresh=N

Makine Tarafından Okunabilen Durum Dosyası

Durum dosyasının makine tarafından okunabilen sürümüne http://sunucunuzun.ismi.buraya/server-status?auto şeklinde bir istek yaparak erişebilirsiniz. Bu, kendiliğinden çalıştığı takdirde yararlıdır; Apache dağıtımının /support dizininde bulunan log_server_status isimli perl betiğine bakınız.

Güvenlik

mod_status sunucu içinde derlendiği takdirde istatistikleri raporlama yeteneği dizin içi yapılandırma dosyaları (.htaccess gibi) dahil tüm yapılandırma dosyaları için kullanılabilir olacaktır. Bu durum güvenlik ile ilgili olarak siteniz için içinden çıkılması güç durumlara yol açabilir (çapanoğlu durumu).

ExtendedStatus Yönergesi

Açıklama: | Her istekte ek durum bilgisinin toplanmasını sağlar.
Sözdizimi: | ExtendedStatus On|Off
Öntanımlı: | ExtendedStatus Off
Bağlam: | sunucu geneli
Durum: | Temel
Modül: | mod_status
Uyumluluk: | Apache 1.3.2 ve sonrasında mevcuttur.

Bu ayarlama sunucunun tamamını etkiler ve sanal konaklar için ayrı ayrı etkin kılınamaz veya iptal edilemez. Ek durum bilgisinin toplanması sunucuyu yavaşlatabilir.

SeeRequestTail Yönergesi

Açıklama: | İsteğin kendisi 63 karakterden uzun olduğunda, isteğin ilk 63 karakterinin mi yoksa son 63 karakterinin mi gösterileceğini belirler.
Sözdizimi: | SeeRequestTail On|Off
Öntanımlı: | SeeRequestTail Off
Bağlam: | sunucu geneli
Durum: | Temel
Modül: | mod_status
Uyumluluk: | Apache 2.2.7 ve sonrasında mevcuttur.

mod_status, ExtendedStatus On olduğunda isteğin kendisini de gösterir. Tarihsel nedenlerle, göstermek için isteğin sadece 63 karakteri saklanır. Bu yönerge ilk 63 karakterin mi yoksa son 63 karakterin mi saklanacağını belirtmek için kullanılır. Bu, elbette, istek 64 karakterlik veya daha uzunsa uygulanır.

Apache şöyle bir istek alsaydı:
GET  /disk1/storage/apache/htdocs/images/imagestore1/food/apples.jpg  HTTP/1.1
mod_status bu isteği şöyle gösterirdi:

Off (öntanımlı) | GET /disk1/storage/apache/htdocs/images/imagestore1/food/apples
On | orage/apache/htdocs/images/imagestore1/food/apples.jpg HTTP/1.1

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_substitute - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_substitute

Description: | Perform search and replace operations on response bodies
Status: | Extension
Module Identifier: | substitute_module
Source File: | mod_substitute.c
Compatibility: | Available in Apache 2.2.7 and later

Summary

mod_substitute provides a mechanism to perform both regular expression and fixed string substitutions on response bodies.

Substitute Directive

Description: | Pattern to filter the response content
Syntax: | Substitute s/pattern/substitution/[infq]
Context: | directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_substitute

The Substitute directive specifies a search and replace pattern to apply to the response body.

The meaning of the pattern can be modified by using any combination of these flags:

i
Perform a case-insensitive match.
n
By default the pattern is treated as a regular expression. Using the n flag forces the pattern to be treated as a fixed string.
f
The f flag causes mod_substitute to flatten the result of a substitution allowing for later substitutions to take place on the boundary of this one. This is the default.
q
The q flag causes mod_substitute to not flatten the buckets after each substitution. This can result in much faster response and a decrease in memory utilization, but should only be used if there is no possibility that the result of one substitution will ever match a pattern or regex of a subsequent one.

Example

<Location /> AddOutputFilterByType SUBSTITUTE text/html
Substitute s/foo/bar/ni
 </Location>

If either the pattern or the substitution contain a slash character then an alternative delimiter should be used:

Example of using an alternate delimiter

<Location /> AddOutputFilterByType SUBSTITUTE text/html
Substitute "s|<BR */?>|<br />|i" </Location>


mod_suexec - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_suexec

Açıklama: | CGI betiklerinin belli bir kullanıcı ve grubun aidiyetinde çalışmasını mümkün kılar.
Durum: | Eklenti
Modül Betimleyici: | suexec_module
Kaynak Dosyası: | mod_suexec.c
Uyumluluk: | Apache 2.0 ve sonrasında mevcuttur.

Özet

Bu modül suexec programı ile birlikte CGI betiklerinin belli bir kullanıcı ve grubun aidiyetinde çalışmasını mümkün kılar.

Ayrıca bakınız:

  • SuEXEC Desteği

SuexecUserGroup Yönergesi

Açıklama: | CGI betiklerini çalıştıracak kullanıcı ve grup belirtilir.
Sözdizimi: | SuexecUserGroup Kullanıcı Grup
Bağlam: | sunucu geneli, sanal konak
Durum: | Eklenti
Modül: | mod_suexec
Uyumluluk: | Apache 2.0 ve sonrasında mevcuttur.

SuexecUserGroup yönergesi CGI programlarını çalıştıracak kullanıcı ve grubu belirtmeye yarar. CGI harici istekler hala User yönergesinde belirtilen kullanıcı tarafından yerine getirilir. Bu yönerge, Apache 1.3 yapılandırmasında sanal konak bölümlerindeki User ve Group yönergelerinin yerini almak üzere tasarlanmıştır.

Örnek

SuexecUserGroup nobody nogroup

Ayrıca bakınız:

  • Suexec

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_unique_id - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_unique_id

Description: | Provides an environment variable with a unique identifier for each request
Status: | Extension
Module Identifier: | unique_id_module
Source File: | mod_unique_id.c

Summary

This module provides a magic token for each request which is guaranteed to be unique across "all" requests under very specific conditions. The unique identifier is even unique across multiple machines in a properly configured cluster of machines. The environment variable UNIQUE_ID is set to the identifier for each request. Unique identifiers are useful for various reasons which are beyond the scope of this document.

Theory

First a brief recap of how the Apache server works on Unix machines. This feature currently isn't supported on Windows NT. On Unix machines, Apache creates several children, the children process requests one at a time. Each child can serve multiple requests in its lifetime. For the purpose of this discussion, the children don't share any data with each other. We'll refer to the children as httpd processes.

Your website has one or more machines under your administrative control, together we'll call them a cluster of machines. Each machine can possibly run multiple instances of Apache. All of these collectively are considered "the universe", and with certain assumptions we'll show that in this universe we can generate unique identifiers for each request, without extensive communication between machines in the cluster.

The machines in your cluster should satisfy these requirements. (Even if you have only one machine you should synchronize its clock with NTP.)

  • The machines' times are synchronized via NTP or other network time protocol.
  • The machines' hostnames all differ, such that the module can do a hostname lookup on the hostname and receive a different IP address for each machine in the cluster.

As far as operating system assumptions go, we assume that pids (process ids) fit in 32-bits. If the operating system uses more than 32-bits for a pid, the fix is trivial but must be performed in the code.

Given those assumptions, at a single point in time we can identify any httpd process on any machine in the cluster from all other httpd processes. The machine's IP address and the pid of the httpd process are sufficient to do this. So in order to generate unique identifiers for requests we need only distinguish between different points in time.

To distinguish time we will use a Unix timestamp (seconds since January 1, 1970 UTC), and a 16-bit counter. The timestamp has only one second granularity, so the counter is used to represent up to 65536 values during a single second. The quadruple ( ip_addr, pid, time_stamp, counter ) is sufficient to enumerate 65536 requests per second per httpd process. There are issues however with pid reuse over time, and the counter is used to alleviate this issue.

When an httpd child is created, the counter is initialized with ( current microseconds divided by 10 ) modulo 65536 (this formula was chosen to eliminate some variance problems with the low order bits of the microsecond timers on some systems). When a unique identifier is generated, the time stamp used is the time the request arrived at the web server. The counter is incremented every time an identifier is generated (and allowed to roll over).

The kernel generates a pid for each process as it forks the process, and pids are allowed to roll over (they're 16-bits on many Unixes, but newer systems have expanded to 32-bits). So over time the same pid will be reused. However unless it is reused within the same second, it does not destroy the uniqueness of our quadruple. That is, we assume the system does not spawn 65536 processes in a one second interval (it may even be 32768 processes on some Unixes, but even this isn't likely to happen).

Suppose that time repeats itself for some reason. That is, suppose that the system's clock is screwed up and it revisits a past time (or it is too far forward, is reset correctly, and then revisits the future time). In this case we can easily show that we can get pid and time stamp reuse. The choice of initializer for the counter is intended to help defeat this. Note that we really want a random number to initialize the counter, but there aren't any readily available numbers on most systems (i.e., you can't use rand() because you need to seed the generator, and can't seed it with the time because time, at least at one second resolution, has repeated itself). This is not a perfect defense.

How good a defense is it? Suppose that one of your machines serves at most 500 requests per second (which is a very reasonable upper bound at this writing, because systems generally do more than just shovel out static files). To do that it will require a number of children which depends on how many concurrent clients you have. But we'll be pessimistic and suppose that a single child is able to serve 500 requests per second. There are 1000 possible starting counter values such that two sequences of 500 requests overlap. So there is a 1.5% chance that if time (at one second resolution) repeats itself this child will repeat a counter value, and uniqueness will be broken. This was a very pessimistic example, and with real world values it's even less likely to occur. If your system is such that it's still likely to occur, then perhaps you should make the counter 32 bits (by editing the code).

You may be concerned about the clock being "set back" during summer daylight savings. However this isn't an issue because the times used here are UTC, which "always" go forward. Note that x86 based Unixes may need proper configuration for this to be true -- they should be configured to assume that the motherboard clock is on UTC and compensate appropriately. But even still, if you're running NTP then your UTC time will be correct very shortly after reboot.

The UNIQUE_ID environment variable is constructed by encoding the 112-bit (32-bit IP address, 32 bit pid, 32 bit time stamp, 16 bit counter) quadruple using the alphabet [A-Za-z0-9@-] in a manner similar to MIME base64 encoding, producing 19 characters. The MIME base64 alphabet is actually [A-Za-z0-9+/] however + and / need to be specially encoded in URLs, which makes them less desirable. All values are encoded in network byte ordering so that the encoding is comparable across architectures of different byte ordering. The actual ordering of the encoding is: time stamp, IP address, pid, counter. This ordering has a purpose, but it should be emphasized that applications should not dissect the encoding. Applications should treat the entire encoded UNIQUE_ID as an opaque token, which can be compared against other UNIQUE_IDs for equality only.

The ordering was chosen such that it's possible to change the encoding in the future without worrying about collision with an existing database of UNIQUE_IDs. The new encodings should also keep the time stamp as the first element, and can otherwise use the same alphabet and bit length. Since the time stamps are essentially an increasing sequence, it's sufficient to have a flag second in which all machines in the cluster stop serving and request, and stop using the old encoding format. Afterwards they can resume requests and begin issuing the new encodings.

This we believe is a relatively portable solution to this problem. It can be extended to multithreaded systems like Windows NT, and can grow with future needs. The identifiers generated have essentially an infinite life-time because future identifiers can be made longer as required. Essentially no communication is required between machines in the cluster (only NTP synchronization is required, which is low overhead), and no communication between httpd processes is required (the communication is implicit in the pid value assigned by the kernel). In very specific situations the identifier can be shortened, but more information needs to be assumed (for example the 32-bit IP address is overkill for any site, but there is no portable shorter replacement for it).


mod_userdir - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_userdir

Açıklama: | Kullanıcılara özel dizinler
Durum: | Temel
Modül Betimleyici: | userdir_module
Kaynak Dosyası: | mod_userdir.c

Özet

Bu modül kullanıcılara özel dizinlere http://mesela.dom/~kullanıcı/ sözdizimi kullanılarak erişilebilmesini mümkün kılar.

Ayrıca bakınız:

  • URL’lerin Dosya Sistemi ile Eşleştirilmesi
  • public_html eğitmeni

UserDir Yönergesi

Açıklama: | Kullanıcıya özel dizinlerin yeri
Sözdizimi: | UserDir dizin [dizin] ...
Bağlam: | sunucu geneli, sanal konak
Durum: | Temel
Modül: | mod_userdir

UserDir yönergesi, bir kullanıcıya ait bir belge için bir istek yapıldığında, isteğin kullanıcının ev dizininde bulunan belli bir dizinden karşılanmasını sağlar. dizin olarak şunlar belirtilebilir:

  • Dizinin ismi veya aşağıdakiler gibi bir kalıp.
  • disabled anahtar sözcüğü. enabled anahtar sözcüğü ile sonradan etkin kılınmadıkça tüm kullanıcı-dizin dönüşümlerini iptal eder (aşağıya bakınız).
  • disabled anahtar sözcüğünü takibeden boşluk ayraçlı kullanıcı isimleri listesi. Bu listede yer alan kullanıcı isimlerine, sonradan bir enabled listesinde görünse bile, dizin dönüşümleri asla uygulanmaz.
  • enabled anahtar sözcüğünü takibeden boşluk ayraçlı kullanıcı isimleri listesi. Genel bir iptal sözkonusu olsa bile, kullanıcı ismi bir disabled listesinde yer almadıkça, bu listede yer alan dizinlere dönüşüm uygulanır.

Userdir yönergesinde ne enabled ne de disabled varsa, argüman bir dosya ismi kalıbı olarak ele alınır ve kullanıcı belge kök dizininin yolunu oluşturmakta kullanılır. http://mesela.dom/~ali/bir/iki.html şöyle dönüştürülür:

Kullanılan UserDir yönergesi | Elde edilen yol
UserDir public_html | ~ali/public_html/bir/iki.html
UserDir /usr/siteler | /usr/siteler/ali/bir/iki.html
UserDir /home/*/htdocs | /home/ali/htdocs/bir/iki.html

Aşağıdaki yönergelerle istemciye gönderilecek yönlendirmeler:

Kullanılan UserDir yönergesi | Elde edilen yönlendirme
UserDir http://mesela.dom/users | http://mesela.dom/users/ali/bir/iki.html
UserDir http://mesela.dom/*/usr | http://mesela.dom/ali/usr/bir/iki.html
UserDir http://mesela.dom/~*/ | http://mesela.dom/~ali/bir/iki.html
Bu yönergeyi kullanırken dikkatli olun; örneğin, "UserDir ./" şeklinde bir atama "/~root" isteklerini "/" dizinine yönlendirir ki bu elbette istenmez. Bu bakımdan yapılandırmanızda mutlaka bir "UserDir disabled root" satırının yer almasını tavsiye ederiz. Daha fazla bilgi için Directory yönergesine ve Güvenlik İpuçları sayfasına bakınız.

Diğer örnekler:

Bir kaç kullanıcı hariç kalan herkesin UserDir dizinlerini iptal etmek için şunu yapabilirsiniz:

UserDir disabled
UserDir enabled birey1 birey2 birey3

Bir kaç kullanıcı hariç kalan herkesin UserDir dizinlerini etkin kılmak için şunu yapabilirsiniz:

UserDir disabled birey4 birey5 birey6

Birden fazla dizin belirtmek de mümkündür:

Userdir public_html /usr/siteler http://mesela.dom/

Bu örneğe göre, http://mesela.dom/~ali/bir/iki.html şeklinde bir istek alındığında sunucu önce http://mesela.dom/~ali/bir/iki.html yönlendirmesini deneyecektir. Onu bulamazsa isteği /usr/siteler/ali/bir/iki.html dosyasını arayacak onu da bulamazsa istemciyi http://mesela.dom/ali/bir/iki.html adresine yönlendirecektir.

Argüman listesine bir yönlendirme ekleyecekseniz, bu, listenin son elemanı olmalıdır. Apache yönlendirmenin başarılı sonuç verip vermediğini bilemeyecektir. Bu bakımdan, listede bu yönlendirmeden sonra bir yönlendirme daha bulunması daha iyi olacaktır.

Kullanıcı dizini dönüşümü Apache 2.1.4 sürümü ve sonrasında öntanımlı olarak etkin değildir. Daha önceki sürümlerde bir UserDir yönergesinin yokluğunda UserDir public_html öntanımlıydı.

Ayrıca bakınız:

  • public_html eğitmeni

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


mod_usertrack - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_usertrack

Description: | Clickstream logging of user activity on a site
Status: | Extension
Module Identifier: | usertrack_module
Source File: | mod_usertrack.c

Summary

Previous releases of Apache have included a module which generates a 'clickstream' log of user activity on a site using cookies. This was called the "cookies" module, mod_cookies. In Apache 1.2 and later this module has been renamed the "user tracking" module, mod_usertrack. This module has been simplified and new directives added.

Logging

Previously, the cookies module (now the user tracking module) did its own logging, using the CookieLog directive. In this release, this module does no logging at all. Instead, a configurable log format file should be used to log user click-streams. This is possible because the logging module now allows multiple log files. The cookie itself is logged by using the text %{cookie}n in the log file format. For example:

CustomLog logs/clickstream "%{cookie}n %r %t"

For backward compatibility the configurable log module implements the old CookieLog directive, but this should be upgraded to the above CustomLog directive.

2-digit or 4-digit dates for cookies?

(the following is from message <022701bda43d$9d32bbb0$1201a8c0@christian.office.sane.com> in the new-httpd archives)

From: "Christian Allen" <christian@sane.com>
Subject: Re: Apache Y2K bug in mod_usertrack.c
Date: Tue, 30 Jun 1998 11:41:56 -0400

Did some work with cookies and dug up some info that might be useful.

True, Netscape claims that the correct format NOW is four digit dates, and
four digit dates do in fact work... for Netscape 4.x (Communicator), that
is.  However, 3.x and below do NOT accept them.  It seems that Netscape
originally had a 2-digit standard, and then with all of the Y2K hype and
probably a few complaints, changed to a four digit date for Communicator.
Fortunately, 4.x also understands the 2-digit format, and so the best way to
ensure that your expiration date is legible to the client's browser is to
use 2-digit dates.

However, this does not limit expiration dates to the year 2000; if you use
an expiration year of "13", for example, it is interpreted as 2013, NOT
1913!  In fact, you can use an expiration year of up to "37", and it will be
understood as "2037" by both MSIE and Netscape versions 3.x and up (not sure
about versions previous to those).  Not sure why Netscape used that
particular year as its cut-off point, but my guess is that it was in respect
to UNIX's 2038 problem.  Netscape/MSIE 4.x seem to be able to understand
2-digit years beyond that, at least until "50" for sure (I think they
understand up until about "70", but not for sure).

Summary:  Mozilla 3.x and up understands two digit dates up until "37"
(2037).  Mozilla 4.x understands up until at least "50" (2050) in 2-digit
form, but also understands 4-digit years, which can probably reach up until
9999.  Your best bet for sending a long-life cookie is to send it for some
time late in the year "37".

CookieDomain Directive

Description: | The domain to which the tracking cookie applies
Syntax: | CookieDomain domain
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_usertrack

This directive controls the setting of the domain to which the tracking cookie applies. If not present, no domain is included in the cookie header field.

The domain string must begin with a dot, and must include at least one embedded dot. That is, .example.com is legal, but foo.example.com and .com are not.

Most browsers in use today will not allow cookies to be set for a two-part top level domain, such as .co.uk, although such a domain ostensibly fulfills the requirements above.
These domains are equivalent to top level domains such as .com, and allowing such cookies may be a security risk. Thus, if you are under a two-part top level domain, you should still use your actual domain, as you would with any other top level domain (for example, use .foo.co.uk).

CookieExpires Directive

Description: | Expiry time for the tracking cookie
Syntax: | CookieExpires expiry-period
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_usertrack

When used, this directive sets an expiry time on the cookie generated by the usertrack module. The expiry-period can be given either as a number of seconds, or in the format such as "2 weeks 3 days 7 hours". Valid denominations are: years, months, weeks, days, hours, minutes and seconds. If the expiry time is in any format other than one number indicating the number of seconds, it must be enclosed by double quotes.

If this directive is not used, cookies last only for the current browser session.

CookieName Directive

Description: | Name of the tracking cookie
Syntax: | CookieName token
Default: | CookieName Apache
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_usertrack

This directive allows you to change the name of the cookie this module uses for its tracking purposes. By default the cookie is named "Apache".

You must specify a valid cookie name; results are unpredictable if you use a name containing unusual characters. Valid characters include A-Z, a-z, 0-9, "_", and "-".

CookieStyle Directive

Description: | Format of the cookie header field
Syntax: | CookieStyle Netscape|Cookie|Cookie2|RFC2109|RFC2965
Default: | CookieStyle Netscape
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_usertrack

This directive controls the format of the cookie header field. The three formats allowed are:

  • Netscape, which is the original but now deprecated syntax. This is the default, and the syntax Apache has historically used.
  • Cookie or RFC2109, which is the syntax that superseded the Netscape syntax.
  • Cookie2 or RFC2965, which is the most current cookie syntax.

Not all clients can understand all of these formats, but you should use the newest one that is generally acceptable to your users' browsers. At the time of writing, most browsers only fully support CookieStyle Netscape.

CookieTracking Directive

Description: | Enables tracking cookie
Syntax: | CookieTracking on|off
Default: | CookieTracking off
Context: | server config, virtual host, directory, .htaccess
Override: | FileInfo
Status: | Extension
Module: | mod_usertrack

When mod_usertrack is loaded, and CookieTracking on is set, Apache will send a user-tracking cookie for all new requests. This directive can be used to turn this behavior on or off on a per-server or per-directory basis. By default, enabling mod_usertrack will not activate cookies.


mod_version - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Modules

Apache Module mod_version

Description: | Version dependent configuration
Status: | Extension
Module Identifier: | version_module
Source File: | mod_version.c
Compatibility: | Available in version 2.0.56 and later

Summary

This module is designed for the use in test suites and large networks which have to deal with different httpd versions and different configurations. It provides a new container -- <IfVersion>, which allows a flexible version checking including numeric comparisons and regular expressions.

Examples

<IfVersion 2.1.0>
# current httpd version is exactly 2.1.0
 </IfVersion>

<IfVersion >= 2.2>
# use really new features :-)
 </IfVersion>

See below for further possibilities.

<IfVersion> Directive

Description: | contains version dependent configuration
Syntax: | <IfVersion [[!]operator] version> ... </IfVersion>
Context: | server config, virtual host, directory, .htaccess
Override: | All
Status: | Extension
Module: | mod_version

The <IfVersion> section encloses configuration directives which are executed only if the httpd version matches the desired criteria. For normal (numeric) comparisons the version argument has the format major[.minor[.patch]], e.g. 2.1.0 or 2.2. minor and patch are optional. If these numbers are omitted, they are assumed to be zero. The following numerical operators are possible:

operator | description
= or == | httpd version is equal
> | httpd version is greater than
>= | httpd version is greater or equal
< | httpd version is less than
<= | httpd version is less or equal

Example

<IfVersion >= 2.1>
# this happens only in versions greater or
# equal 2.1.0.
 </IfVersion>

Besides the numerical comparison it is possible to match a regular expression against the httpd version. There are two ways to write it:

operator | description
= or == | version has the form /regex/
~ | version has the form regex

Example

<IfVersion = /^2.1.[01234]$/>
# e.g. workaround for buggy versions </IfVersion>

In order to reverse the meaning, all operators can be preceded by an exclamation mark (!):

<IfVersion !~ ^2.1.[01234]$>
# not for those versions
 </IfVersion>

If the operator is omitted, it is assumed to be =.


mod_vhost_alias - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Apache Modülü mod_vhost_alias

Açıklama: | Kitlesel sanal konakların devingen olarak yapılandırılmasını sağlar
Durum: | Eklenti
Modül Betimleyici: | vhost_alias_module
Kaynak Dosyası: | mod_vhost_alias.c

Özet

Bu modül, hangi dosyaların sunulacağını saptamak için dosya yolunun parçası olarak HTTP isteğinin Host: başlığının ve/veya IP adresinin kullanılmasını mümkün kılarak devingen yapılandırmalı sanal konaklar oluşturur. Böylece benzer yapılandırmaya sahip çok büyük sayıda sanal konak kullanımı kolaşlaşır.

Bilginize

URI’leri dosya isimlerine dönüştürmek için mod_alias veya mod_userdir kullanılmışsa bunlar mod_vhost_alias yönergeleri tarafından aşağıda açıklandığı gibi geçersiz kılınırlar. Örneğin, aşağıdaki yapılandırma her durumda /cgi-bin/script.pl betiğini /usr/local/apache2/cgi-bin/script.pl betiğine eşleyecektir:

ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
VirtualScriptAlias /nerede/bilinmiyor/%0/cgi-bin/

Ayrıca bakınız:

  • UseCanonicalName
  • Devingen olarak Yapılandırılan Kitlesel Sanal Barındırma

Dizin İsimlerinin Elde Edilmesi

Bu modüldeki tüm yönergeler bir dizgeyi bir dosya yoluna dönüştürerek çalışırlar. Dönüşüm dizgesi (bundan sonra “isim” diyeceğiz) ya sunucu ismi olur (bunun nasıl belirlendiğini öğrenmek için UseCanonicalName yönergesine bakınız) ya da sunucu üzerindeki sanal konağın IP adresi olur. Dönüşümü, printf’inkilerin benzeri birkaç biçem belirteci denetler:

%% | Bir % imi yerleştirir.
%p | Sanal konağın IP adresini yerleştirir.
%N.M | İsmin parçalarını yerleştirir.

N ve M ismin alt dizgelerini belirtmek için kullanılır. N, ismin noktalarla ayrılmış bileşenlerinden seçim yaparken M, N ile seçilen parçadan karakter seçmekte kullanılır. M isteğe bağlı olup mevcut olmaması halinde öntanımlı olarak sıfırdır. Noktanın varlığı M’nin varlığına bağlıdır. Dönüşüm şöyle uygulanır:

0 | ismin tamamı
1 | ilk parça
2 | ikinci parça
-1 | son parça
-2 | sondan bir önceki parça
2+ | ikinci parça ve sonraki parçaların hepsi
-2+ | sondan bir önceki parça ve daha önceki parçaların hepsi
1+ ve -1+ | 0 ile aynı

N veya M parça sayısından büyükse dönüşüm dizgesi sadece alt çizgi karakterini içerir.

Örnekler

Sunucu yapılandırma dosyanızda isme dayalı sanal konaklar için aşağıdaki yönergeler kullanılıyor olsun:

UseCanonicalName Off
VirtualDocumentRoot /usr/local/apache/sankonlar/%0

http://mesela.dom/dizin/dosya.html için yapılan bir istek /usr/local/apache/sankonlar/mesela.dom/dizin/dosya.html dosyası ile yerine getirilecektir.

Çok büyük sayıda sanal konak için sankonlar dizininin boyutlarını küçük tutmak amacıyla dosyalar düzenlenebilir. Bunu yapılandırma dosyanızda şöyle yapabilirsiniz:

UseCanonicalName Off
VirtualDocumentRoot /usr/local/apache/sankonlar/%3+/%2.1/%2.2/%2.3/%2

http://falan.filan.mesela.dom/dizin/dosya.html için yapılan bir istek /usr/local/apache/sankonlar/mesela.dom/f/i/l/filan/dizin/dosya.html ile yerine getirilecektir.

Bu sefer de parçaları ismin sonundan toplayalım:

VirtualDocumentRoot /usr/local/apache/sankonlar/%3+/%2.-1/%2.-2/%2.-3/%2

Bu durumda istek /usr/local/apache/sankonlar/mesela.dom/n/a/l/filan/dizin/dosya.html ile karşılanırdı.

Şöyle bir şey de yapabilirsiniz:

VirtualDocumentRoot /usr/local/apache/sankonlar/%3+/%2.1/%2.2/%2.3/%2.4+

Bu örnek için istek /usr/local/apache/sankonlar/mesela.dom/f/i/l/an/dizin/dosya.html dosyasından karşılanırdı.

IP’ye dayalı sanal konaklar için yapılandırma dosyanızda şu satırlar olabilirdi:

UseCanonicalName DNS
VirtualDocumentRootIP /usr/local/apache/sankonlar/%1/%2/%3/%4/belgeler
VirtualScriptAliasIP /usr/local/apache/sankonlar/%1/%2/%3/%4/cgi-bin

http://falan.filan.mesela.dom/dizin/dosya.html için yapılan bir istek eğer falan.filan.mesela.dom’un IP adresi 10.20.30.40 olsaydı, /usr/local/apache/sankonlar/10/20/30/40/belgeler/dizin/dosya.html dosyası ile karşılanırdı. http://falan.filan.mesela.dom/cgi-bin/betik.pl için yapılan bir istek ise /usr/local/apache/sankonlar/10/20/30/40/cgi-bin/betik.pl betiğinin çalıştırılması ile sağlanırdı.

Bir VirtualDocumentRoot yönergesinin . karakterini içermesini isterseniz, bir biçem belirteci ile karışıklığa sebep olmaksızın bunu şöyle sağlayabilirsiniz:

VirtualDocumentRoot /usr/local/apache/sankonlar/%2.0.%3.0

Bu durumda http://falan.filan.mesela.dom/dizin/dosya.html için yapılan bir istek /usr/local/apache/sankonlar/filan.mesela/dizin/dosya.html dosyası ile karşılanacaktır.

LogFormat yönergesinin %V ve %A biçem belirteçleri bu modülle birlikte kullanıldığında çok yararlı olurlar.

VirtualDocumentRoot Yönergesi

Açıklama: | Bir sanal konağın belge kök dizinini devingen olarak yapılandırır.
Sözdizimi: | VirtualDocumentRoot hesaplanan-dizin|none
Öntanımlı: | VirtualDocumentRoot none
Bağlam: | sunucu geneli, sanal konak
Durum: | Eklenti
Modül: | mod_vhost_alias

VirtualDocumentRoot yönergesi sunucu ismine göre belgelerin bulunacağı yeri Apache’nin saptamasını sağlar. hesaplanan-dizin’in dönüşüm sonucu DocumentRoot yönergesinin değeriymiş gibi belge ağacının kök dizini olarak kullanılır. hesaplanan-dizin yerine none belirtilmişse VirtualDocumentRoot iptal edilmiş olur. Bu yönerge VirtualDocumentRootIP yönergesinin kullanıldığı bağlamda yer alamaz.

VirtualDocumentRootIP Yönergesi

Açıklama: | Bir sanal konağın belge kök dizinini devingen olarak yapılandırır.
Sözdizimi: | VirtualDocumentRootIP hesaplanan-dizin|none
Öntanımlı: | VirtualDocumentRootIP none
Bağlam: | sunucu geneli, sanal konak
Durum: | Eklenti
Modül: | mod_vhost_alias

VirtualDocumentRootIP yönergesi, dizinin saptanmasında sunucu ismi yerine bağlantının sonlandığı sunucunun IP adresini kullanması dışında VirtualDocumentRoot gibidir.

VirtualScriptAlias Yönergesi

Açıklama: | Bir sanal konağın CGI dizinini devingen olarak yapılandırır.
Sözdizimi: | VirtualScriptAlias hesaplanan-dizin|none
Öntanımlı: | VirtualScriptAlias none
Bağlam: | sunucu geneli, sanal konak
Durum: | Eklenti
Modül: | mod_vhost_alias

VirtualScriptAlias yönergesi, CGI betiklerinin bulunacağı yeri Apache’nin saptamasını sağlamak bakımından VirtualDocumentRoot yönergesinin yaptığını yapar. /cgi-bin/ ile başlayan istekler için ise ScriptAlias yönergesinin yaptığını yapar.

VirtualScriptAliasIP Yönergesi

Açıklama: | Bir sanal konağın CGI dizinini devingen olarak yapılandırır.
Sözdizimi: | VirtualScriptAliasIP hesaplanan-dizin|none
Öntanımlı: | VirtualScriptAliasIP none
Bağlam: | sunucu geneli, sanal konak
Durum: | Eklenti
Modül: | mod_vhost_alias

VirtualScriptAliasIP yönergesi, dizinin saptanmasında sunucu ismi yerine bağlantının sonlandığı sunucunun IP adresini kullanması dışında VirtualScriptAlias gibidir.

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Developer Documentation for Apache 2.x - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2

Developer Documentation for Apache 2.x

Warning

Many of the documents listed here are in need of update. They are in different stages of progress. Please be patient, and point out any discrepancies or errors on the developer/ pages directly to the dev@httpd.apache.org mailing list.

Topics

  • Apache 1.3 API Notes
  • Apache 2.0 Hook Functions
  • Request Processing in Apache 2.0
  • How filters work in Apache 2.0
  • Converting Modules from Apache 1.3 to Apache 2.0
  • Documenting Apache 2.0
  • Apache 2.x Thread Safety Issues

External Resources

  • Developer articles at apachetutor include:
    • Request Processing in Apache
    • Configuration for Modules
    • Resource Management in Apache
    • Connection Pooling in Apache
    • Introduction to Buckets and Brigades


Apache 1.3 API notes - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Developer Documentation

Apache 1.3 API notes

Warning

This document has not been updated to take into account changes made in the 2.0 version of the Apache HTTP Server. Some of the information may still be relevant, but please use it with care.

These are some notes on the Apache API and the data structures you have to deal with, etc. They are not yet nearly complete, but hopefully, they will help you get your bearings. Keep in mind that the API is still subject to change as we gain experience with it. (See the TODO file for what might be coming). However, it will be easy to adapt modules to any changes that are made. (We have more modules to adapt than you do).

A few notes on general pedagogical style here. In the interest of conciseness, all structure declarations here are incomplete -- the real ones have more slots that I'm not telling you about. For the most part, these are reserved to one component of the server core or another, and should be altered by modules with caution. However, in some cases, they really are things I just haven't gotten around to yet. Welcome to the bleeding edge.

Finally, here's an outline, to give you some bare idea of what's coming up, and in what order:

  • Basic concepts.
    • Handlers, Modules, and Requests
    • A brief tour of a module
  • How handlers work
    • A brief tour of the request_rec
    • Where request_rec structures come from
    • Handling requests, declining, and returning error codes
    • Special considerations for response handlers
    • Special considerations for authentication handlers
    • Special considerations for logging handlers
  • Resource allocation and resource pools
  • Configuration, commands and the like
    • Per-directory configuration structures
    • Command handling
    • Side notes --- per-server configuration, virtual servers, etc.

Basic concepts

We begin with an overview of the basic concepts behind the API, and how they are manifested in the code.

Handlers, Modules, and Requests

Apache breaks down request handling into a series of steps, more or less the same way the Netscape server API does (although this API has a few more stages than NetSite does, as hooks for stuff I thought might be useful in the future). These are:

  • URI -> Filename translation
  • Auth ID checking [is the user who they say they are?]
  • Auth access checking [is the user authorized here?]
  • Access checking other than auth
  • Determining MIME type of the object requested
  • `Fixups' -- there aren't any of these yet, but the phase is intended as a hook for possible extensions like SetEnv, which don't really fit well elsewhere.
  • Actually sending a response back to the client.
  • Logging the request

These phases are handled by looking at each of a succession of modules, looking to see if each of them has a handler for the phase, and attempting invoking it if so. The handler can typically do one of three things:

  • Handle the request, and indicate that it has done so by returning the magic constant OK.
  • Decline to handle the request, by returning the magic integer constant DECLINED. In this case, the server behaves in all respects as if the handler simply hadn't been there.
  • Signal an error, by returning one of the HTTP error codes. This terminates normal handling of the request, although an ErrorDocument may be invoked to try to mop up, and it will be logged in any case.

Most phases are terminated by the first module that handles them; however, for logging, `fixups', and non-access authentication checking, all handlers always run (barring an error). Also, the response phase is unique in that modules may declare multiple handlers for it, via a dispatch table keyed on the MIME type of the requested object. Modules may declare a response-phase handler which can handle any request, by giving it the key */* (i.e., a wildcard MIME type specification). However, wildcard handlers are only invoked if the server has already tried and failed to find a more specific response handler for the MIME type of the requested object (either none existed, or they all declined).

The handlers themselves are functions of one argument (a request_rec structure. vide infra), which returns an integer, as above.

A brief tour of a module

At this point, we need to explain the structure of a module. Our candidate will be one of the messier ones, the CGI module -- this handles both CGI scripts and the ScriptAlias config file command. It's actually a great deal more complicated than most modules, but if we're going to have only one example, it might as well be the one with its fingers in every place.

Let's begin with handlers. In order to handle the CGI scripts, the module declares a response handler for them. Because of ScriptAlias, it also has handlers for the name translation phase (to recognize ScriptAliased URIs), the type-checking phase (any ScriptAliased request is typed as a CGI script).

The module needs to maintain some per (virtual) server information, namely, the ScriptAliases in effect; the module structure therefore contains pointers to a functions which builds these structures, and to another which combines two of them (in case the main server and a virtual server both have ScriptAliases declared).

Finally, this module contains code to handle the ScriptAlias command itself. This particular module only declares one command, but there could be more, so modules have command tables which declare their commands, and describe where they are permitted, and how they are to be invoked.

A final note on the declared types of the arguments of some of these commands: a pool is a pointer to a resource pool structure; these are used by the server to keep track of the memory which has been allocated, files opened, etc., either to service a particular request, or to handle the process of configuring itself. That way, when the request is over (or, for the configuration pool, when the server is restarting), the memory can be freed, and the files closed, en masse, without anyone having to write explicit code to track them all down and dispose of them. Also, a cmd_parms structure contains various information about the config file being read, and other status information, which is sometimes of use to the function which processes a config-file command (such as ScriptAlias). With no further ado, the module itself:

        /* Declarations of handlers. */

int translate_scriptalias (request_rec *);
int type_scriptalias (request_rec *);
int cgi_handler (request_rec *);

/* Subsidiary dispatch table for response-phase
* handlers, by MIME type */

handler_rec cgi_handlers[] = {
{ "application/x-httpd-cgi", cgi_handler },
{ NULL }
};

/* Declarations of routines to manipulate the
* module's configuration info.  Note that these are
* returned, and passed in, as void *'s; the server
* core keeps track of them, but it doesn't, and can't,
* know their internal structure.
*/

void *make_cgi_server_config (pool *);
void *merge_cgi_server_config (pool *, void *, void *);

/* Declarations of routines to handle config-file commands */

extern char *script_alias(cmd_parms *, void *per_dir_config, char *fake,
                                  char *real);

command_rec cgi_cmds[] = {
{ "ScriptAlias", script_alias, NULL, RSRC_CONF, TAKE2,
"a fakename and a realname"},
{ NULL }
};

module cgi_module = {

  STANDARD_MODULE_STUFF,
  NULL,                     /* initializer */
  NULL,                     /* dir config creator */
  NULL,                     /* dir merger */
  make_cgi_server_config,   /* server config */
  merge_cgi_server_config,  /* merge server config */
  cgi_cmds,                 /* command table */
  cgi_handlers,             /* handlers */
  translate_scriptalias,    /* filename translation */
  NULL,                     /* check_user_id */
  NULL,                     /* check auth */
  NULL,                     /* check access */
  type_scriptalias,         /* type_checker */
  NULL,                     /* fixups */
  NULL,                     /* logger */
  NULL                      /* header parser */
};

How handlers work

The sole argument to handlers is a request_rec structure. This structure describes a particular request which has been made to the server, on behalf of a client. In most cases, each connection to the client generates only one request_rec structure.

A brief tour of the request_rec

The request_rec contains pointers to a resource pool which will be cleared when the server is finished handling the request; to structures containing per-server and per-connection information, and most importantly, information on the request itself.

The most important such information is a small set of character strings describing attributes of the object being requested, including its URI, filename, content-type and content-encoding (these being filled in by the translation and type-check handlers which handle the request, respectively).

Other commonly used data items are tables giving the MIME headers on the client's original request, MIME headers to be sent back with the response (which modules can add to at will), and environment variables for any subprocesses which are spawned off in the course of servicing the request. These tables are manipulated using the ap_table_get and ap_table_set routines.

Note that the Content-type header value cannot be set by module content-handlers using the ap_table_*() routines. Rather, it is set by pointing the content_type field in the request_rec structure to an appropriate string. e.g.,

r->content_type = "text/html";

Finally, there are pointers to two data structures which, in turn, point to per-module configuration structures. Specifically, these hold pointers to the data structures which the module has built to describe the way it has been configured to operate in a given directory (via .htaccess files or <Directory> sections), for private data it has built in the course of servicing the request (so modules' handlers for one phase can pass `notes' to their handlers for other phases). There is another such configuration vector in the server_rec data structure pointed to by the request_rec, which contains per (virtual) server configuration data.

Here is an abridged declaration, giving the fields most commonly used:

struct request_rec {

pool *pool;
conn_rec *connection;
server_rec *server;

/* What object is being requested */

char *uri;
char *filename;
char *path_info;

char *args;           /* QUERY_ARGS, if any */
struct stat finfo;    /* Set by server core;
                       * st_mode set to zero if no such file */

char *content_type;
char *content_encoding;

/* MIME header environments, in and out. Also,
 * an array containing environment variables to
 * be passed to subprocesses, so people can write
 * modules to add to that environment.
 *
 * The difference between headers_out and
 * err_headers_out is that the latter are printed
 * even on error, and persist across internal
 * redirects (so the headers printed for
 * ErrorDocument handlers will have them).
 */

table *headers_in;
table *headers_out;
table *err_headers_out;
table *subprocess_env;

/* Info about the request itself... */

int header_only;     /* HEAD request, as opposed to GET */
char *protocol;      /* Protocol, as given to us, or HTTP/0.9 */
char *method;        /* GET, HEAD, POST, etc. */
int method_number;   /* M_GET, M_POST, etc. */

/* Info for logging */

char *the_request;
int bytes_sent;

/* A flag which modules can set, to indicate that
 * the data being returned is volatile, and clients
 * should be told not to cache it.
 */

int no_cache;

/* Various other config info which may change
 * with .htaccess files
 * These are config vectors, with one void*
 * pointer for each module (the thing pointed
 * to being the module's business).
 */

void *per_dir_config;   /* Options set in config files, etc. */
void *request_config;   /* Notes on *this* request */

};

Where request_rec structures come from

Most request_rec structures are built by reading an HTTP request from a client, and filling in the fields. However, there are a few exceptions:

  • If the request is to an imagemap, a type map (i.e., a *.var file), or a CGI script which returned a local `Location:', then the resource which the user requested is going to be ultimately located by some URI other than what the client originally supplied. In this case, the server does an internal redirect, constructing a new request_rec for the new URI, and processing it almost exactly as if the client had requested the new URI directly.
  • If some handler signaled an error, and an ErrorDocument is in scope, the same internal redirect machinery comes into play.

  • Finally, a handler occasionally needs to investigate `what would happen if' some other request were run. For instance, the directory indexing module needs to know what MIME type would be assigned to a request for each directory entry, in order to figure out what icon to use.

    Such handlers can construct a sub-request, using the functions ap_sub_req_lookup_file, ap_sub_req_lookup_uri, and ap_sub_req_method_uri; these construct a new request_rec structure and processes it as you would expect, up to but not including the point of actually sending a response. (These functions skip over the access checks if the sub-request is for a file in the same directory as the original request).

    (Server-side includes work by building sub-requests and then actually invoking the response handler for them, via the function ap_run_sub_req).

Handling requests, declining, and returning error codes

As discussed above, each handler, when invoked to handle a particular request_rec, has to return an int to indicate what happened. That can either be

  • OK -- the request was handled successfully. This may or may not terminate the phase.
  • DECLINED -- no erroneous condition exists, but the module declines to handle the phase; the server tries to find another.
  • an HTTP error code, which aborts handling of the request.

Note that if the error code returned is REDIRECT, then the module should put a Location in the request's headers_out, to indicate where the client should be redirected to.

Special considerations for response handlers

Handlers for most phases do their work by simply setting a few fields in the request_rec structure (or, in the case of access checkers, simply by returning the correct error code). However, response handlers have to actually send a request back to the client.

They should begin by sending an HTTP response header, using the function ap_send_http_header. (You don't have to do anything special to skip sending the header for HTTP/0.9 requests; the function figures out on its own that it shouldn't do anything). If the request is marked header_only, that's all they should do; they should return after that, without attempting any further output.

Otherwise, they should produce a request body which responds to the client as appropriate. The primitives for this are ap_rputc and ap_rprintf, for internally generated output, and ap_send_fd, to copy the contents of some FILE * straight to the client.

At this point, you should more or less understand the following piece of code, which is the handler which handles GET requests which have no more specific handler; it also shows how conditional GETs can be handled, if it's desirable to do so in a particular response handler -- ap_set_last_modified checks against the If-modified-since value supplied by the client, if any, and returns an appropriate code (which will, if nonzero, be USE_LOCAL_COPY). No similar considerations apply for ap_set_content_length, but it returns an error code for symmetry.

        int default_handler (request_rec *r)
{
int errstatus;
FILE *f;

if (r->method_number != M_GET) return DECLINED;
if (r->finfo.st_mode == 0) return NOT_FOUND;

if ((errstatus = ap_set_content_length (r, r->finfo.st_size))
||
             (errstatus = ap_set_last_modified (r, r->finfo.st_mtime)))
return errstatus;

f = fopen (r->filename, "r");

if (f == NULL) {
log_reason("file permissions deny server access", r->filename, r);
return FORBIDDEN;
}

register_timeout ("send", r);
ap_send_http_header (r);

if (!r->header_only) send_fd (f, r);
ap_pfclose (r->pool, f);
return OK;
}

Finally, if all of this is too much of a challenge, there are a few ways out of it. First off, as shown above, a response handler which has not yet produced any output can simply return an error code, in which case the server will automatically produce an error response. Secondly, it can punt to some other handler by invoking ap_internal_redirect, which is how the internal redirection machinery discussed above is invoked. A response handler which has internally redirected should always return OK.

(Invoking ap_internal_redirect from handlers which are not response handlers will lead to serious confusion).

Special considerations for authentication handlers

Stuff that should be discussed here in detail:

  • Authentication-phase handlers not invoked unless auth is configured for the directory.
  • Common auth configuration stored in the core per-dir configuration; it has accessors ap_auth_type, ap_auth_name, and ap_requires.
  • Common routines, to handle the protocol end of things, at least for HTTP basic authentication (ap_get_basic_auth_pw, which sets the connection->user structure field automatically, and ap_note_basic_auth_failure, which arranges for the proper WWW-Authenticate: header to be sent back).

Special considerations for logging handlers

When a request has internally redirected, there is the question of what to log. Apache handles this by bundling the entire chain of redirects into a list of request_rec structures which are threaded through the r->prev and r->next pointers. The request_rec which is passed to the logging handlers in such cases is the one which was originally built for the initial request from the client; note that the bytes_sent field will only be correct in the last request in the chain (the one for which a response was actually sent).

Resource allocation and resource pools

One of the problems of writing and designing a server-pool server is that of preventing leakage, that is, allocating resources (memory, open files, etc.), without subsequently releasing them. The resource pool machinery is designed to make it easy to prevent this from happening, by allowing resource to be allocated in such a way that they are automatically released when the server is done with them.

The way this works is as follows: the memory which is allocated, file opened, etc., to deal with a particular request are tied to a resource pool which is allocated for the request. The pool is a data structure which itself tracks the resources in question.

When the request has been processed, the pool is cleared. At that point, all the memory associated with it is released for reuse, all files associated with it are closed, and any other clean-up functions which are associated with the pool are run. When this is over, we can be confident that all the resource tied to the pool have been released, and that none of them have leaked.

Server restarts, and allocation of memory and resources for per-server configuration, are handled in a similar way. There is a configuration pool, which keeps track of resources which were allocated while reading the server configuration files, and handling the commands therein (for instance, the memory that was allocated for per-server module configuration, log files and other files that were opened, and so forth). When the server restarts, and has to reread the configuration files, the configuration pool is cleared, and so the memory and file descriptors which were taken up by reading them the last time are made available for reuse.

It should be noted that use of the pool machinery isn't generally obligatory, except for situations like logging handlers, where you really need to register cleanups to make sure that the log file gets closed when the server restarts (this is most easily done by using the function ap_pfopen, which also arranges for the underlying file descriptor to be closed before any child processes, such as for CGI scripts, are execed), or in case you are using the timeout machinery (which isn't yet even documented here). However, there are two benefits to using it: resources allocated to a pool never leak (even if you allocate a scratch string, and just forget about it); also, for memory allocation, ap_palloc is generally faster than malloc.

We begin here by describing how memory is allocated to pools, and then discuss how other resources are tracked by the resource pool machinery.

Allocation of memory in pools

Memory is allocated to pools by calling the function ap_palloc, which takes two arguments, one being a pointer to a resource pool structure, and the other being the amount of memory to allocate (in chars). Within handlers for handling requests, the most common way of getting a resource pool structure is by looking at the pool slot of the relevant request_rec; hence the repeated appearance of the following idiom in module code:

int my_handler(request_rec *r)
{
struct my_structure *foo;
...

foo = (foo *)ap_palloc (r->pool, sizeof(my_structure));
 }

Note that there is no ap_pfree -- ap_palloced memory is freed only when the associated resource pool is cleared. This means that ap_palloc does not have to do as much accounting as malloc(); all it does in the typical case is to round up the size, bump a pointer, and do a range check.

(It also raises the possibility that heavy use of ap_palloc could cause a server process to grow excessively large. There are two ways to deal with this, which are dealt with below; briefly, you can use malloc, and try to be sure that all of the memory gets explicitly freed, or you can allocate a sub-pool of the main pool, allocate your memory in the sub-pool, and clear it out periodically. The latter technique is discussed in the section on sub-pools below, and is used in the directory-indexing code, in order to avoid excessive storage allocation when listing directories with thousands of files).

Allocating initialized memory

There are functions which allocate initialized memory, and are frequently useful. The function ap_pcalloc has the same interface as ap_palloc, but clears out the memory it allocates before it returns it. The function ap_pstrdup takes a resource pool and a char * as arguments, and allocates memory for a copy of the string the pointer points to, returning a pointer to the copy. Finally ap_pstrcat is a varargs-style function, which takes a pointer to a resource pool, and at least two char * arguments, the last of which must be NULL. It allocates enough memory to fit copies of each of the strings, as a unit; for instance:

ap_pstrcat (r->pool, "foo", "/", "bar", NULL);

returns a pointer to 8 bytes worth of memory, initialized to "foo/bar".

Commonly-used pools in the Apache Web server

A pool is really defined by its lifetime more than anything else. There are some static pools in http_main which are passed to various non-http_main functions as arguments at opportune times. Here they are:

permanent_pool
never passed to anything else, this is the ancestor of all pools
pconf
  • subpool of permanent_pool
  • created at the beginning of a config "cycle"; exists until the server is terminated or restarts; passed to all config-time routines, either via cmd->pool, or as the "pool *p" argument on those which don't take pools
  • passed to the module init() functions
ptemp
  • sorry I lie, this pool isn't called this currently in 1.3, I renamed it this in my pthreads development. I'm referring to the use of ptrans in the parent... contrast this with the later definition of ptrans in the child.
  • subpool of permanent_pool
  • created at the beginning of a config "cycle"; exists until the end of config parsing; passed to config-time routines via cmd->temp_pool. Somewhat of a "bastard child" because it isn't available everywhere. Used for temporary scratch space which may be needed by some config routines but which is deleted at the end of config.
pchild
  • subpool of permanent_pool
  • created when a child is spawned (or a thread is created); lives until that child (thread) is destroyed
  • passed to the module child_init functions
  • destruction happens right after the child_exit functions are called... (which may explain why I think child_exit is redundant and unneeded)
ptrans
  • should be a subpool of pchild, but currently is a subpool of permanent_pool, see above
  • cleared by the child before going into the accept() loop to receive a connection
  • used as connection->pool
r->pool
  • for the main request this is a subpool of connection->pool; for subrequests it is a subpool of the parent request's pool.
  • exists until the end of the request (i.e., ap_destroy_sub_req, or in child_main after process_request has finished)
  • note that r itself is allocated from r->pool; i.e., r->pool is first created and then r is the first thing palloc()d from it

For almost everything folks do, r->pool is the pool to use. But you can see how other lifetimes, such as pchild, are useful to some modules... such as modules that need to open a database connection once per child, and wish to clean it up when the child dies.

You can also see how some bugs have manifested themself, such as setting connection->user to a value from r->pool -- in this case connection exists for the lifetime of ptrans, which is longer than r->pool (especially if r->pool is a subrequest!). So the correct thing to do is to allocate from connection->pool.

And there was another interesting bug in mod_include / mod_cgi. You'll see in those that they do this test to decide if they should use r->pool or r->main->pool. In this case the resource that they are registering for cleanup is a child process. If it were registered in r->pool, then the code would wait() for the child when the subrequest finishes. With mod_include this could be any old #include, and the delay can be up to 3 seconds... and happened quite frequently. Instead the subprocess is registered in r->main->pool which causes it to be cleaned up when the entire request is done -- i.e., after the output has been sent to the client and logging has happened.

Tracking open files, etc.

As indicated above, resource pools are also used to track other sorts of resources besides memory. The most common are open files. The routine which is typically used for this is ap_pfopen, which takes a resource pool and two strings as arguments; the strings are the same as the typical arguments to fopen, e.g.,

...
FILE *f = ap_pfopen (r->pool, r->filename, "r");

if (f == NULL) { ... } else { ... }

There is also a ap_popenf routine, which parallels the lower-level open system call. Both of these routines arrange for the file to be closed when the resource pool in question is cleared.

Unlike the case for memory, there are functions to close files allocated with ap_pfopen, and ap_popenf, namely ap_pfclose and ap_pclosef. (This is because, on many systems, the number of files which a single process can have open is quite limited). It is important to use these functions to close files allocated with ap_pfopen and ap_popenf, since to do otherwise could cause fatal errors on systems such as Linux, which react badly if the same FILE* is closed more than once.

(Using the close functions is not mandatory, since the file will eventually be closed regardless, but you should consider it in cases where your module is opening, or could open, a lot of files).

Other sorts of resources -- cleanup functions

More text goes here. Describe the cleanup primitives in terms of which the file stuff is implemented; also, spawn_process.

Pool cleanups live until clear_pool() is called: clear_pool(a) recursively calls destroy_pool() on all subpools of a; then calls all the cleanups for a; then releases all the memory for a. destroy_pool(a) calls clear_pool(a) and then releases the pool structure itself. i.e., clear_pool(a) doesn't delete a, it just frees up all the resources and you can start using it again immediately.

Fine control -- creating and dealing with sub-pools, with a note on sub-requests

On rare occasions, too-free use of ap_palloc() and the associated primitives may result in undesirably profligate resource allocation. You can deal with such a case by creating a sub-pool, allocating within the sub-pool rather than the main pool, and clearing or destroying the sub-pool, which releases the resources which were associated with it. (This really is a rare situation; the only case in which it comes up in the standard module set is in case of listing directories, and then only with very large directories. Unnecessary use of the primitives discussed here can hair up your code quite a bit, with very little gain).

The primitive for creating a sub-pool is ap_make_sub_pool, which takes another pool (the parent pool) as an argument. When the main pool is cleared, the sub-pool will be destroyed. The sub-pool may also be cleared or destroyed at any time, by calling the functions ap_clear_pool and ap_destroy_pool, respectively. (The difference is that ap_clear_pool frees resources associated with the pool, while ap_destroy_pool also deallocates the pool itself. In the former case, you can allocate new resources within the pool, and clear it again, and so forth; in the latter case, it is simply gone).

One final note -- sub-requests have their own resource pools, which are sub-pools of the resource pool for the main request. The polite way to reclaim the resources associated with a sub request which you have allocated (using the ap_sub_req_... functions) is ap_destroy_sub_req, which frees the resource pool. Before calling this function, be sure to copy anything that you care about which might be allocated in the sub-request's resource pool into someplace a little less volatile (for instance, the filename in its request_rec structure).

(Again, under most circumstances, you shouldn't feel obliged to call this function; only 2K of memory or so are allocated for a typical sub request, and it will be freed anyway when the main request pool is cleared. It is only when you are allocating many, many sub-requests for a single main request that you should seriously consider the ap_destroy_... functions).

Configuration, commands and the like

One of the design goals for this server was to maintain external compatibility with the NCSA 1.3 server --- that is, to read the same configuration files, to process all the directives therein correctly, and in general to be a drop-in replacement for NCSA. On the other hand, another design goal was to move as much of the server's functionality into modules which have as little as possible to do with the monolithic server core. The only way to reconcile these goals is to move the handling of most commands from the central server into the modules.

However, just giving the modules command tables is not enough to divorce them completely from the server core. The server has to remember the commands in order to act on them later. That involves maintaining data which is private to the modules, and which can be either per-server, or per-directory. Most things are per-directory, including in particular access control and authorization information, but also information on how to determine file types from suffixes, which can be modified by AddType and DefaultType directives, and so forth. In general, the governing philosophy is that anything which can be made configurable by directory should be; per-server information is generally used in the standard set of modules for information like Aliases and Redirects which come into play before the request is tied to a particular place in the underlying file system.

Another requirement for emulating the NCSA server is being able to handle the per-directory configuration files, generally called .htaccess files, though even in the NCSA server they can contain directives which have nothing at all to do with access control. Accordingly, after URI -> filename translation, but before performing any other phase, the server walks down the directory hierarchy of the underlying filesystem, following the translated pathname, to read any .htaccess files which might be present. The information which is read in then has to be merged with the applicable information from the server's own config files (either from the <Directory> sections in access.conf, or from defaults in srm.conf, which actually behaves for most purposes almost exactly like <Directory />).

Finally, after having served a request which involved reading .htaccess files, we need to discard the storage allocated for handling them. That is solved the same way it is solved wherever else similar problems come up, by tying those structures to the per-transaction resource pool.

Per-directory configuration structures

Let's look out how all of this plays out in mod_mime.c, which defines the file typing handler which emulates the NCSA server's behavior of determining file types from suffixes. What we'll be looking at, here, is the code which implements the AddType and AddEncoding commands. These commands can appear in .htaccess files, so they must be handled in the module's private per-directory data, which in fact, consists of two separate tables for MIME types and encoding information, and is declared as follows:

typedef struct {
    table *forced_types;      /* Additional AddTyped stuff */
    table *encoding_types;    /* Added with AddEncoding... */
} mime_dir_config;

When the server is reading a configuration file, or <Directory> section, which includes one of the MIME module's commands, it needs to create a mime_dir_config structure, so those commands have something to act on. It does this by invoking the function it finds in the module's `create per-dir config slot', with two arguments: the name of the directory to which this configuration information applies (or NULL for srm.conf), and a pointer to a resource pool in which the allocation should happen.

(If we are reading a .htaccess file, that resource pool is the per-request resource pool for the request; otherwise it is a resource pool which is used for configuration data, and cleared on restarts. Either way, it is important for the structure being created to vanish when the pool is cleared, by registering a cleanup on the pool if necessary).

For the MIME module, the per-dir config creation function just ap_pallocs the structure above, and a creates a couple of tables to fill it. That looks like this:

void *create_mime_dir_config (pool *p, char *dummy)
{
mime_dir_config *new =
(mime_dir_config *) ap_palloc (p, sizeof(mime_dir_config));
new->forced_types = ap_make_table (p, 4);
new->encoding_types = ap_make_table (p, 4);

return new;
 }

Now, suppose we've just read in a .htaccess file. We already have the per-directory configuration structure for the next directory up in the hierarchy. If the .htaccess file we just read in didn't have any AddType or AddEncoding commands, its per-directory config structure for the MIME module is still valid, and we can just use it. Otherwise, we need to merge the two structures somehow.

To do that, the server invokes the module's per-directory config merge function, if one is present. That function takes three arguments: the two structures being merged, and a resource pool in which to allocate the result. For the MIME module, all that needs to be done is overlay the tables from the new per-directory config structure with those from the parent:

void *merge_mime_dir_configs (pool *p, void *parent_dirv, void *subdirv)
{
mime_dir_config *parent_dir = (mime_dir_config *)parent_dirv;
mime_dir_config *subdir = (mime_dir_config *)subdirv;
mime_dir_config *new =
(mime_dir_config *)ap_palloc (p, sizeof(mime_dir_config));
new->forced_types = ap_overlay_tables (p, subdir->forced_types,
parent_dir->forced_types);
 new->encoding_types = ap_overlay_tables (p, subdir->encoding_types,
parent_dir->encoding_types);
return new;
 }

As a note -- if there is no per-directory merge function present, the server will just use the subdirectory's configuration info, and ignore the parent's. For some modules, that works just fine (e.g., for the includes module, whose per-directory configuration information consists solely of the state of the XBITHACK), and for those modules, you can just not declare one, and leave the corresponding structure slot in the module itself NULL.

Command handling

Now that we have these structures, we need to be able to figure out how to fill them. That involves processing the actual AddType and AddEncoding commands. To find commands, the server looks in the module's command table. That table contains information on how many arguments the commands take, and in what formats, where it is permitted, and so forth. That information is sufficient to allow the server to invoke most command-handling functions with pre-parsed arguments. Without further ado, let's look at the AddType command handler, which looks like this (the AddEncoding command looks basically the same, and won't be shown here):

char *add_type(cmd_parms *cmd, mime_dir_config *m, char *ct, char *ext)
{
if (*ext == '.') ++ext;
ap_table_set (m->forced_types, ext, ct);
return NULL;
 }

This command handler is unusually simple. As you can see, it takes four arguments, two of which are pre-parsed arguments, the third being the per-directory configuration structure for the module in question, and the fourth being a pointer to a cmd_parms structure. That structure contains a bunch of arguments which are frequently of use to some, but not all, commands, including a resource pool (from which memory can be allocated, and to which cleanups should be tied), and the (virtual) server being configured, from which the module's per-server configuration data can be obtained if required.

Another way in which this particular command handler is unusually simple is that there are no error conditions which it can encounter. If there were, it could return an error message instead of NULL; this causes an error to be printed out on the server's stderr, followed by a quick exit, if it is in the main config files; for a .htaccess file, the syntax error is logged in the server error log (along with an indication of where it came from), and the request is bounced with a server error response (HTTP error status, code 500).

The MIME module's command table has entries for these commands, which look like this:

command_rec mime_cmds[] = {
{ "AddType", add_type, NULL, OR_FILEINFO, TAKE2,
"a mime type followed by a file extension" },
 { "AddEncoding", add_encoding, NULL, OR_FILEINFO, TAKE2,
"an encoding (e.g., gzip), followed by a file extension" },
 { NULL }
 };

The entries in these tables are:

  • The name of the command
  • The function which handles it
  • a (void *) pointer, which is passed in the cmd_parms structure to the command handler --- this is useful in case many similar commands are handled by the same function.
  • A bit mask indicating where the command may appear. There are mask bits corresponding to each AllowOverride option, and an additional mask bit, RSRC_CONF, indicating that the command may appear in the server's own config files, but not in any .htaccess file.
  • A flag indicating how many arguments the command handler wants pre-parsed, and how they should be passed in. TAKE2 indicates two pre-parsed arguments. Other options are TAKE1, which indicates one pre-parsed argument, FLAG, which indicates that the argument should be On or Off, and is passed in as a boolean flag, RAW_ARGS, which causes the server to give the command the raw, unparsed arguments (everything but the command name itself). There is also ITERATE, which means that the handler looks the same as TAKE1, but that if multiple arguments are present, it should be called multiple times, and finally ITERATE2, which indicates that the command handler looks like a TAKE2, but if more arguments are present, then it should be called multiple times, holding the first argument constant.
  • Finally, we have a string which describes the arguments that should be present. If the arguments in the actual config file are not as required, this string will be used to help give a more specific error message. (You can safely leave this NULL).

Finally, having set this all up, we have to use it. This is ultimately done in the module's handlers, specifically for its file-typing handler, which looks more or less like this; note that the per-directory configuration structure is extracted from the request_rec's per-directory configuration vector by using the ap_get_module_config function.

        int find_ct(request_rec *r)
{
int i;
char *fn = ap_pstrdup (r->pool, r->filename);
mime_dir_config *conf = (mime_dir_config *)
ap_get_module_config(r->per_dir_config, &mime_module);
char *type;

if (S_ISDIR(r->finfo.st_mode)) {
r->content_type = DIR_MAGIC_TYPE;
return OK;
}

if((i=ap_rind(fn,'.')) < 0) return DECLINED;
++i;

if ((type = ap_table_get (conf->encoding_types, &fn[i])))
{
r->content_encoding = type;

/* go back to previous extension to try to use it as a type */
fn[i-1] = '\0';
if((i=ap_rind(fn,'.')) < 0) return OK;
++i;
}

if ((type = ap_table_get (conf->forced_types, &fn[i])))
{
r->content_type = type;
}

return OK;

        }

Side notes -- per-server configuration, virtual servers, etc.

The basic ideas behind per-server module configuration are basically the same as those for per-directory configuration; there is a creation function and a merge function, the latter being invoked where a virtual server has partially overridden the base server configuration, and a combined structure must be computed. (As with per-directory configuration, the default if no merge function is specified, and a module is configured in some virtual server, is that the base configuration is simply ignored).

The only substantial difference is that when a command needs to configure the per-server private module data, it needs to go to the cmd_parms data to get at it. Here's an example, from the alias module, which also indicates how a syntax error can be returned (note that the per-directory configuration argument to the command handler is declared as a dummy, since the module doesn't actually have per-directory config data):

char *add_redirect(cmd_parms *cmd, void *dummy, char *f, char *url)
{
server_rec *s = cmd->server;
alias_server_conf *conf = (alias_server_conf *)
ap_get_module_config(s->module_config,&alias_module);
 alias_entry *new = ap_push_array (conf->redirects);

if (!ap_is_url (url)) return "Redirect to non-URL";

new->fake = f; new->real = url;
return NULL;
 }


Debugging Memory Allocation in APR - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Developer Documentation

Debugging Memory Allocation in APR

This document has been removed.


Documenting Apache 2.0 - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Developer Documentation

Documenting Apache 2.0

Apache 2.0 uses Doxygen to document the APIs and global variables in the code. This will explain the basics of how to document using Doxygen.

Brief Description

To start a documentation block, use /**
To end a documentation block, use */

In the middle of the block, there are multiple tags we can use:

Description of this functions purpose
@param parameter_name description
@return description
@deffunc signature of the function

The deffunc is not always necessary. DoxyGen does not have a full parser in it, so any prototype that use a macro in the return type declaration is too complex for scandoc. Those functions require a deffunc. An example (using &gt; rather than >):

/**
 * return the final element of the pathname
 * @param pathname The path to get the final element of
 * @return the final element of the path
 * @tip Examples:
 * <pre>
 * "/foo/bar/gum" -&gt; "gum"
 * "/foo/bar/gum/" -&gt; ""
 * "gum" -&gt; "gum"
 * "wi\\n32\\stuff" -&gt; "stuff"
 * </pre>
 * @deffunc const char * ap_filename_of_pathname(const char *pathname)
 */

At the top of the header file, always include:

/**
 * @package Name of library header
 */

Doxygen uses a new HTML file for each package. The HTML files are named {Name_of_library_header}.html, so try to be concise with your names.

For a further discussion of the possibilities please refer to the Doxygen site.


Apache 2.0 Hook Functions - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Developer Documentation

Apache 2.0 Hook Functions

Warning

This document is still in development and may be partially out of date.

In general, a hook function is one that Apache will call at some point during the processing of a request. Modules can provide functions that are called, and specify when they get called in comparison to other modules.

Creating a hook function

In order to create a new hook, four things need to be done:

Declare the hook function

Use the AP_DECLARE_HOOK macro, which needs to be given the return type of the hook function, the name of the hook, and the arguments. For example, if the hook returns an int and takes a request_rec * and an int and is called do_something, then declare it like this:

AP_DECLARE_HOOK(int, do_something, (request_rec *r, int n))

This should go in a header which modules will include if they want to use the hook.

Create the hook structure

Each source file that exports a hook has a private structure which is used to record the module functions that use the hook. This is declared as follows:

APR_HOOK_STRUCT(
APR_HOOK_LINK(do_something)
...
 )

Implement the hook caller

The source file that exports the hook has to implement a function that will call the hook. There are currently three possible ways to do this. In all cases, the calling function is called ap_run_hookname().

Void hooks

If the return value of a hook is void, then all the hooks are called, and the caller is implemented like this:

AP_IMPLEMENT_HOOK_VOID(do_something, (request_rec *r, int n), (r, n))

The second and third arguments are the dummy argument declaration and the dummy arguments as they will be used when calling the hook. In other words, this macro expands to something like this:

void ap_run_do_something(request_rec *r, int n)
{
...
do_something(r, n);
 }

Hooks that return a value

If the hook returns a value, then it can either be run until the first hook that does something interesting, like so:

AP_IMPLEMENT_HOOK_RUN_FIRST(int, do_something, (request_rec *r, int n), (r, n), DECLINED)

The first hook that does not return DECLINED stops the loop and its return value is returned from the hook caller. Note that DECLINED is the traditional hook return value meaning "I didn't do anything", but it can be whatever suits you.

Alternatively, all hooks can be run until an error occurs. This boils down to permitting two return values, one of which means "I did something, and it was OK" and the other meaning "I did nothing". The first function that returns a value other than one of those two stops the loop, and its return is the return value. Declare these like so:

AP_IMPLEMENT_HOOK_RUN_ALL(int, do_something, (request_rec *r, int n), (r, n), OK, DECLINED)

Again, OK and DECLINED are the traditional values. You can use what you want.

Call the hook callers

At appropriate moments in the code, call the hook caller, like so:

int n, ret;
request_rec *r;

ret=ap_run_do_something(r, n);

Hooking the hook

A module that wants a hook to be called needs to do two things.

Implement the hook function

Include the appropriate header, and define a static function of the correct type:

static int my_something_doer(request_rec *r, int n)
{
...
return OK;
 }

Add a hook registering function

During initialisation, the server will call each modules hook registering function, which is included in the module structure:

static void my_register_hooks()
{
ap_hook_do_something(my_something_doer, NULL, NULL, APR_HOOK_MIDDLE);
 }

mode MODULE_VAR_EXPORT my_module =
{
...
my_register_hooks /* register hooks */
 };

Controlling hook calling order

In the example above, we didn't use the three arguments in the hook registration function that control calling order. There are two mechanisms for doing this. The first, rather crude, method, allows us to specify roughly where the hook is run relative to other modules. The final argument control this. There are three possible values: APR_HOOK_FIRST, APR_HOOK_MIDDLE and APR_HOOK_LAST.

All modules using any particular value may be run in any order relative to each other, but, of course, all modules using APR_HOOK_FIRST will be run before APR_HOOK_MIDDLE which are before APR_HOOK_LAST. Modules that don't care when they are run should use APR_HOOK_MIDDLE. These values are spaced out, so that positions like APR_HOOK_FIRST-2 are possible to hook slightly earlier than other functions.

Note that there are two more values, APR_HOOK_REALLY_FIRST and APR_HOOK_REALLY_LAST. These should only be used by the hook exporter.

The other method allows finer control. When a module knows that it must be run before (or after) some other modules, it can specify them by name. The second (third) argument is a NULL-terminated array of strings consisting of the names of modules that must be run before (after) the current module. For example, suppose we want "mod_xyz.c" and "mod_abc.c" to run before we do, then we'd hook as follows:

static void register_hooks()
{
static const char * const aszPre[] = { "mod_xyz.c", "mod_abc.c", NULL };

ap_hook_do_something(my_something_doer, aszPre, NULL, APR_HOOK_MIDDLE);
 }

Note that the sort used to achieve this is stable, so ordering set by APR_HOOK_ORDER is preserved, as far as is possible.

Ben Laurie, 15th August 1999

Copyright 2014 The Apache Software Foundation.
Licensed under the Apache License, Version 2.0.


Converting Modules from Apache 1.3 to Apache 2.0 - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Developer Documentation

Converting Modules from Apache 1.3 to Apache 2.0

This is a first attempt at writing the lessons I learned when trying to convert the mod_mmap_static module to Apache 2.0. It's by no means definitive and probably won't even be correct in some ways, but it's a start.

The easier changes ...

Cleanup Routines

These now need to be of type apr_status_t and return a value of that type. Normally the return value will be APR_SUCCESS unless there is some need to signal an error in the cleanup. Be aware that even though you signal an error not all code yet checks and acts upon the error.

Initialisation Routines

These should now be renamed to better signify where they sit in the overall process. So the name gets a small change from mmap_init to mmap_post_config. The arguments passed have undergone a radical change and now look like

  • apr_pool_t *p
  • apr_pool_t *plog
  • apr_pool_t *ptemp
  • server_rec *s

Data Types

A lot of the data types have been moved into the APR. This means that some have had a name change, such as the one shown above. The following is a brief list of some of the changes that you are likely to have to make.

  • pool becomes apr_pool_t
  • table becomes apr_table_t

The messier changes...

Register Hooks

The new architecture uses a series of hooks to provide for calling your functions. These you'll need to add to your module by way of a new function, static void register_hooks(void). The function is really reasonably straightforward once you understand what needs to be done. Each function that needs calling at some stage in the processing of a request needs to be registered, handlers do not. There are a number of phases where functions can be added, and for each you can specify with a high degree of control the relative order that the function will be called in.

This is the code that was added to mod_mmap_static:

static void register_hooks(void)
{
    static const char * const aszPre[]={ "http_core.c",NULL };
    ap_hook_post_config(mmap_post_config,NULL,NULL,HOOK_MIDDLE);
    ap_hook_translate_name(mmap_static_xlat,aszPre,NULL,HOOK_LAST);
};

This registers 2 functions that need to be called, one in the post_config stage (virtually every module will need this one) and one for the translate_name phase. note that while there are different function names the format of each is identical. So what is the format?

ap_hook_phase_name(function_name, predecessors, successors, position);

There are 3 hook positions defined...

  • HOOK_FIRST
  • HOOK_MIDDLE
  • HOOK_LAST

To define the position you use the position and then modify it with the predecessors and successors. Each of the modifiers can be a list of functions that should be called, either before the function is run (predecessors) or after the function has run (successors).

In the mod_mmap_static case I didn't care about the post_config stage, but the mmap_static_xlat must be called after the core module had done its name translation, hence the use of the aszPre to define a modifier to the position HOOK_LAST.

Module Definition

There are now a lot fewer stages to worry about when creating your module definition. The old defintion looked like

module MODULE_VAR_EXPORT module_name_module =
{
    STANDARD_MODULE_STUFF,
    /* initializer */
    /* dir config creater */
    /* dir merger --- default is to override */
    /* server config */
    /* merge server config */
    /* command handlers */
    /* handlers */
    /* filename translation */
    /* check_user_id */
    /* check auth */
    /* check access */
    /* type_checker */
    /* fixups */
    /* logger */
    /* header parser */
    /* child_init */
    /* child_exit */
    /* post read-request */
};

The new structure is a great deal simpler...

module MODULE_VAR_EXPORT module_name_module =
{
    STANDARD20_MODULE_STUFF,
    /* create per-directory config structures */
    /* merge per-directory config structures  */
    /* create per-server config structures    */
    /* merge per-server config structures     */
    /* command handlers */
    /* handlers */
    /* register hooks */
};

Some of these read directly across, some don't. I'll try to summarise what should be done below.

The stages that read directly across :

/* dir config creater */
/* create per-directory config structures */
/* server config */
/* create per-server config structures */
/* dir merger */
/* merge per-directory config structures */
/* merge server config */
/* merge per-server config structures */
/* command table */
/* command apr_table_t */
/* handlers */
/* handlers */

The remainder of the old functions should be registered as hooks. There are the following hook stages defined so far...

ap_hook_post_config
this is where the old _init routines get registered
ap_hook_http_method
retrieve the http method from a request. (legacy)
ap_hook_open_logs
open any specified logs
ap_hook_auth_checker
check if the resource requires authorization
ap_hook_access_checker
check for module-specific restrictions
ap_hook_check_user_id
check the user-id and password
ap_hook_default_port
retrieve the default port for the server
ap_hook_pre_connection
do any setup required just before processing, but after accepting
ap_hook_process_connection
run the correct protocol
ap_hook_child_init
call as soon as the child is started
ap_hook_create_request
??
ap_hook_fixups
last chance to modify things before generating content
ap_hook_handler
generate the content
ap_hook_header_parser
lets modules look at the headers, not used by most modules, because they use post_read_request for this
ap_hook_insert_filter
to insert filters into the filter chain
ap_hook_log_transaction
log information about the request
ap_hook_optional_fn_retrieve
retrieve any functions registered as optional
ap_hook_post_read_request
called after reading the request, before any other phase
ap_hook_quick_handler
called before any request processing, used by cache modules.
ap_hook_translate_name
translate the URI into a filename
ap_hook_type_checker
determine and/or set the doc type


Request Processing in the Apache HTTP Server 2.x - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Developer Documentation

Request Processing in the Apache HTTP Server 2.x

Warning

Warning - this is a first (fast) draft that needs further revision!

Several changes in 2.0 and above affect the internal request processing mechanics. Module authors need to be aware of these changes so they may take advantage of the optimizations and security enhancements.

The first major change is to the subrequest and redirect mechanisms. There were a number of different code paths in the Apache HTTP Server 1.3 to attempt to optimize subrequest or redirect behavior. As patches were introduced to 2.0, these optimizations (and the server behavior) were quickly broken due to this duplication of code. All duplicate code has been folded back into ap_process_request_internal() to prevent the code from falling out of sync again.

This means that much of the existing code was 'unoptimized'. It is the Apache HTTP Project's first goal to create a robust and correct implementation of the HTTP server RFC. Additional goals include security, scalability and optimization. New methods were sought to optimize the server (beyond the performance of 1.3) without introducing fragile or insecure code.

The Request Processing Cycle

All requests pass through ap_process_request_internal() in request.c, including subrequests and redirects. If a module doesn't pass generated requests through this code, the author is cautioned that the module may be broken by future changes to request processing.

To streamline requests, the module author can take advantage of the hooks offered to drop out of the request cycle early, or to bypass core hooks which are irrelevant (and costly in terms of CPU.)

The Request Parsing Phase

Unescapes the URL

The request's parsed_uri path is unescaped, once and only once, at the beginning of internal request processing.

This step is bypassed if the proxyreq flag is set, or the parsed_uri.path element is unset. The module has no further control of this one-time unescape operation, either failing to unescape or multiply unescaping the URL leads to security repercussions.

Strips Parent and This Elements from the URI

All /../ and /./ elements are removed by ap_getparents(). This helps to ensure the path is (nearly) absolute before the request processing continues.

This step cannot be bypassed.

Initial URI Location Walk

Every request is subject to an ap_location_walk() call. This ensures that <Location> sections are consistently enforced for all requests. If the request is an internal redirect or a sub-request, it may borrow some or all of the processing from the previous or parent request's ap_location_walk, so this step is generally very efficient after processing the main request.

translate_name

Modules can determine the file name, or alter the given URI in this step. For example, mod_vhost_alias will translate the URI's path into the configured virtual host, mod_alias will translate the path to an alias path, and if the request falls back on the core, the DocumentRoot is prepended to the request resource.

If all modules DECLINE this phase, an error 500 is returned to the browser, and a "couldn't translate name" error is logged automatically.

Hook: map_to_storage

After the file or correct URI was determined, the appropriate per-dir configurations are merged together. For example, mod_proxy compares and merges the appropriate <Proxy> sections. If the URI is nothing more than a local (non-proxy) TRACE request, the core handles the request and returns DONE. If no module answers this hook with OK or DONE, the core will run the request filename against the <Directory> and <Files> sections. If the request 'filename' isn't an absolute, legal filename, a note is set for later termination.

URI Location Walk

Every request is hardened by a second ap_location_walk() call. This reassures that a translated request is still subjected to the configured <Location> sections. The request again borrows some or all of the processing from its previous location_walk above, so this step is almost always very efficient unless the translated URI mapped to a substantially different path or Virtual Host.

Hook: header_parser

The main request then parses the client's headers. This prepares the remaining request processing steps to better serve the client's request.

The Security Phase

Needs Documentation. Code is:

switch (ap_satisfies(r)) {
case SATISFY_ALL:
case SATISFY_NOSPEC:
        if ((access_status = ap_run_access_checker(r)) != 0) {
            return decl_die(access_status, "check access", r);
        }

    if (ap_some_auth_required(r)) {
        if (((access_status = ap_run_check_user_id(r)) != 0)
            || !ap_auth_type(r)) {
            return decl_die(access_status, ap_auth_type(r)
                          ? "check user.  No user file?"
                          : "perform authentication. AuthType not set!",
                          r);
        }

        if (((access_status = ap_run_auth_checker(r)) != 0)
            || !ap_auth_type(r)) {
            return decl_die(access_status, ap_auth_type(r)
                          ? "check access.  No groups file?"
                          : "perform authentication. AuthType not set!",
                          r);
        }
    }
    break;

case SATISFY_ANY:
    if (((access_status = ap_run_access_checker(r)) != 0)) {
        if (!ap_some_auth_required(r)) {
            return decl_die(access_status, "check access", r);
        }

        if (((access_status = ap_run_check_user_id(r)) != 0)
            || !ap_auth_type(r)) {
            return decl_die(access_status, ap_auth_type(r)
                          ? "check user.  No user file?"
                          : "perform authentication. AuthType not set!",
                          r);
        }

        if (((access_status = ap_run_auth_checker(r)) != 0)
            || !ap_auth_type(r)) {
            return decl_die(access_status, ap_auth_type(r)
                          ? "check access.  No groups file?"
                          : "perform authentication. AuthType not set!",
                          r);
        }
    }
    break;
}

The Preparation Phase

Hook: type_checker

The modules have an opportunity to test the URI or filename against the target resource, and set mime information for the request. Both mod_mime and mod_mime_magic use this phase to compare the file name or contents against the administrator's configuration and set the content type, language, character set and request handler. Some modules may set up their filters or other request handling parameters at this time.

If all modules DECLINE this phase, an error 500 is returned to the browser, and a "couldn't find types" error is logged automatically.

Hook: fixups

Many modules are 'trounced' by some phase above. The fixups phase is used by modules to 'reassert' their ownership or force the request's fields to their appropriate values. It isn't always the cleanest mechanism, but occasionally it's the only option.

The Handler Phase

This phase is not part of the processing in ap_process_request_internal(). Many modules prepare one or more subrequests prior to creating any content at all. After the core, or a module calls ap_process_request_internal() it then calls ap_invoke_handler() to generate the request.

Hook: insert_filter

Modules that transform the content in some way can insert their values and override existing filters, such that if the user configured a more advanced filter out-of-order, then the module can move its order as need be. There is no result code, so actions in this hook better be trusted to always succeed.

Hook: handler

The module finally has a chance to serve the request in its handler hook. Note that not every prepared request is sent to the handler hook. Many modules, such as mod_autoindex, will create subrequests for a given URI, and then never serve the subrequest, but simply lists it for the user. Remember not to put required teardown from the hooks above into this module, but register pool cleanups against the request pool to free resources as required.


How filters work in Apache 2.0 - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Developer Documentation

How filters work in Apache 2.0

Warning

This is a cut 'n paste job from an email (<022501c1c529$f63a9550$7f00000a@KOJ>) and only reformatted for better readability. It's not up to date but may be a good start for further research.

Filter Types

There are three basic filter types (each of these is actually broken down into two categories, but that comes later).

CONNECTION
Filters of this type are valid for the lifetime of this connection. (AP_FTYPE_CONNECTION, AP_FTYPE_NETWORK)
PROTOCOL
Filters of this type are valid for the lifetime of this request from the point of view of the client, this means that the request is valid from the time that the request is sent until the time that the response is received. (AP_FTYPE_PROTOCOL, AP_FTYPE_TRANSCODE)
RESOURCE
Filters of this type are valid for the time that this content is used to satisfy a request. For simple requests, this is identical to PROTOCOL, but internal redirects and sub-requests can change the content without ending the request. (AP_FTYPE_RESOURCE, AP_FTYPE_CONTENT_SET)

It is important to make the distinction between a protocol and a resource filter. A resource filter is tied to a specific resource, it may also be tied to header information, but the main binding is to a resource. If you are writing a filter and you want to know if it is resource or protocol, the correct question to ask is: "Can this filter be removed if the request is redirected to a different resource?" If the answer is yes, then it is a resource filter. If it is no, then it is most likely a protocol or connection filter. I won't go into connection filters, because they seem to be well understood. With this definition, a few examples might help:

Byterange
We have coded it to be inserted for all requests, and it is removed if not used. Because this filter is active at the beginning of all requests, it can not be removed if it is redirected, so this is a protocol filter.
http_header
This filter actually writes the headers to the network. This is obviously a required filter (except in the asis case which is special and will be dealt with below) and so it is a protocol filter.
Deflate
The administrator configures this filter based on which file has been requested. If we do an internal redirect from an autoindex page to an index.html page, the deflate filter may be added or removed based on config, so this is a resource filter.

The further breakdown of each category into two more filter types is strictly for ordering. We could remove it, and only allow for one filter type, but the order would tend to be wrong, and we would need to hack things to make it work. Currently, the RESOURCE filters only have one filter type, but that should change.

How are filters inserted?

This is actually rather simple in theory, but the code is complex. First of all, it is important that everybody realize that there are three filter lists for each request, but they are all concatenated together. So, the first list is r->output_filters, then r->proto_output_filters, and finally r->connection->output_filters. These correspond to the RESOURCE, PROTOCOL, and CONNECTION filters respectively. The problem previously, was that we used a singly linked list to create the filter stack, and we started from the "correct" location. This means that if I had a RESOURCE filter on the stack, and I added a CONNECTION filter, the CONNECTION filter would be ignored. This should make sense, because we would insert the connection filter at the top of the c->output_filters list, but the end of r->output_filters pointed to the filter that used to be at the front of c->output_filters. This is obviously wrong. The new insertion code uses a doubly linked list. This has the advantage that we never lose a filter that has been inserted. Unfortunately, it comes with a separate set of headaches.

The problem is that we have two different cases were we use subrequests. The first is to insert more data into a response. The second is to replace the existing response with an internal redirect. These are two different cases and need to be treated as such.

In the first case, we are creating the subrequest from within a handler or filter. This means that the next filter should be passed to make_sub_request function, and the last resource filter in the sub-request will point to the next filter in the main request. This makes sense, because the sub-request's data needs to flow through the same set of filters as the main request. A graphical representation might help:

Default_handler --> includes_filter --> byterange --> ...

If the includes filter creates a sub request, then we don't want the data from that sub-request to go through the includes filter, because it might not be SSI data. So, the subrequest adds the following:

Default_handler --> includes_filter -/-> byterange --> ...
                                    /
Default_handler --> sub_request_core

What happens if the subrequest is SSI data? Well, that's easy, the includes_filter is a resource filter, so it will be added to the sub request in between the Default_handler and the sub_request_core filter.

The second case for sub-requests is when one sub-request is going to become the real request. This happens whenever a sub-request is created outside of a handler or filter, and NULL is passed as the next filter to the make_sub_request function.

In this case, the resource filters no longer make sense for the new request, because the resource has changed. So, instead of starting from scratch, we simply point the front of the resource filters for the sub-request to the front of the protocol filters for the old request. This means that we won't lose any of the protocol filters, neither will we try to send this data through a filter that shouldn't see it.

The problem is that we are using a doubly-linked list for our filter stacks now. But, you should notice that it is possible for two lists to intersect in this model. So, you do you handle the previous pointer? This is a very difficult question to answer, because there is no "right" answer, either method is equally valid. I looked at why we use the previous pointer. The only reason for it is to allow for easier addition of new servers. With that being said, the solution I chose was to make the previous pointer always stay on the original request.

This causes some more complex logic, but it works for all cases. My concern in having it move to the sub-request, is that for the more common case (where a sub-request is used to add data to a response), the main filter chain would be wrong. That didn't seem like a good idea to me.

Asis

The final topic. :-) Mod_Asis is a bit of a hack, but the handler needs to remove all filters except for connection filters, and send the data. If you are using mod_asis, all other bets are off.

Explanations

The absolutely last point is that the reason this code was so hard to get right, was because we had hacked so much to force it to work. I wrote most of the hacks originally, so I am very much to blame. However, now that the code is right, I have started to remove some hacks. Most people should have seen that the reset_filters and add_required_filters functions are gone. Those inserted protocol level filters for error conditions, in fact, both functions did the same thing, one after the other, it was really strange. Because we don't lose protocol filters for error cases any more, those hacks went away. The HTTP_HEADER, Content-length, and Byterange filters are all added in the insert_filters phase, because if they were added earlier, we had some interesting interactions. Now, those could all be moved to be inserted with the HTTP_IN, CORE, and CORE_IN filters. That would make the code easier to follow.


Apache 2.0 Thread Safety Issues - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Developer Documentation

Apache 2.0 Thread Safety Issues

When using any of the threaded mpms in Apache 2.0 it is important that every function called from Apache be thread safe. When linking in 3rd party extensions it can be difficult to determine whether the resulting server will be thread safe. Casual testing generally won't tell you this either as thread safety problems can lead to subtle race conditons that may only show up in certain conditions under heavy load.

Global and static variables

When writing your module or when trying to determine if a module or 3rd party library is thread safe there are some common things to keep in mind.

First, you need to recognize that in a threaded model each individual thread has its own program counter, stack and registers. Local variables live on the stack, so those are fine. You need to watch out for any static or global variables. This doesn't mean that you are absolutely not allowed to use static or global variables. There are times when you actually want something to affect all threads, but generally you need to avoid using them if you want your code to be thread safe.

In the case where you have a global variable that needs to be global and accessed by all threads, be very careful when you update it. If, for example, it is an incrementing counter, you need to atomically increment it to avoid race conditions with other threads. You do this using a mutex (mutual exclusion). Lock the mutex, read the current value, increment it and write it back and then unlock the mutex. Any other thread that wants to modify the value has to first check the mutex and block until it is cleared.

If you are using APR, have a look at the apr_atomic_* functions and the apr_thread_mutex_* functions.

errno

This is a common global variable that holds the error number of the last error that occurred. If one thread calls a low-level function that sets errno and then another thread checks it, we are bleeding error numbers from one thread into another. To solve this, make sure your module or library defines _REENTRANT or is compiled with -D_REENTRANT. This will make errno a per-thread variable and should hopefully be transparent to the code. It does this by doing something like this:

#define errno (*(__errno_location()))

which means that accessing errno will call __errno_location() which is provided by the libc. Setting _REENTRANT also forces redefinition of some other functions to their *_r equivalents and sometimes changes the common getc/putc macros into safer function calls. Check your libc documentation for specifics. Instead of, or in addition to _REENTRANT the symbols that may affect this are _POSIX_C_SOURCE, _THREAD_SAFE, _SVID_SOURCE, and _BSD_SOURCE.

Common standard troublesome functions

Not only do things have to be thread safe, but they also have to be reentrant. strtok() is an obvious one. You call it the first time with your delimiter which it then remembers and on each subsequent call it returns the next token. Obviously if multiple threads are calling it you will have a problem. Most systems have a reentrant version of of the function called strtok_r() where you pass in an extra argument which contains an allocated char * which the function will use instead of its own static storage for maintaining the tokenizing state. If you are using APR you can use apr_strtok().

crypt() is another function that tends to not be reentrant, so if you run across calls to that function in a library, watch out. On some systems it is reentrant though, so it is not always a problem. If your system has crypt_r() chances are you should be using that, or if possible simply avoid the whole mess by using md5 instead.

Common 3rd Party Libraries

The following is a list of common libraries that are used by 3rd party Apache modules. You can check to see if your module is using a potentially unsafe library by using tools such as ldd(1) and nm(1). For PHP, for example, try this:

% ldd libphp4.so
libsablot.so.0 => /usr/local/lib/libsablot.so.0 (0x401f6000)
libexpat.so.0 => /usr/lib/libexpat.so.0 (0x402da000)
libsnmp.so.0 => /usr/lib/libsnmp.so.0 (0x402f9000)
libpdf.so.1 => /usr/local/lib/libpdf.so.1 (0x40353000)
libz.so.1 => /usr/lib/libz.so.1 (0x403e2000)
libpng.so.2 => /usr/lib/libpng.so.2 (0x403f0000)
libmysqlclient.so.11 => /usr/lib/libmysqlclient.so.11 (0x40411000)
libming.so => /usr/lib/libming.so (0x40449000)
libm.so.6 => /lib/libm.so.6 (0x40487000)
libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0x404a8000)
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x404e7000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x40505000)
libssl.so.2 => /lib/libssl.so.2 (0x40532000)
libcrypto.so.2 => /lib/libcrypto.so.2 (0x40560000)
libresolv.so.2 => /lib/libresolv.so.2 (0x40624000)
libdl.so.2 => /lib/libdl.so.2 (0x40634000)
libnsl.so.1 => /lib/libnsl.so.1 (0x40637000)
libc.so.6 => /lib/libc.so.6 (0x4064b000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)

In addition to these libraries you will need to have a look at any libraries linked statically into the module. You can use nm(1) to look for individual symbols in the module.

Library List

Please drop a note to dev@httpd.apache.org if you have additions or corrections to this list.

Library | Version | Thread Safe? | Notes
ASpell/PSpell |  | ? |
Berkeley DB | 3.x, 4.x | Yes | Be careful about sharing a connection across threads.
bzip2 |  | Yes | Both low-level and high-level APIs are thread-safe. However, high-level API requires thread-safe access to errno.
cdb |  | ? |
C-Client |  | Perhaps | c-client uses strtok() and gethostbyname() which are not thread-safe on most C library implementations. c-client's static data is meant to be shared across threads. If strtok() and gethostbyname() are thread-safe on your OS, c-client may be thread-safe.
libcrypt |  | ? |
Expat |  | Yes | Need a separate parser instance per thread
FreeTDS |  | ? |
FreeType |  | ? |
GD 1.8.x |  | ? |
GD 2.0.x |  | ? |
gdbm |  | No | Errors returned via a static gdbm_error variable
ImageMagick | 5.2.2 | Yes | ImageMagick docs claim it is thread safe since version 5.2.2 (see Change log).
Imlib2 |  | ? |
libjpeg | v6b | ? |
libmysqlclient |  | Yes | Use mysqlclient_r library variant to ensure thread-safety. For more information, please read http://dev.mysql.com/doc/mysql/en/Threaded_clients.html.
Ming | 0.2a | ? |
Net-SNMP | 5.0.x | ? |
OpenLDAP | 2.1.x | Yes | Use ldap_r library variant to ensure thread-safety.
OpenSSL | 0.9.6g | Yes | Requires proper usage of CRYPTO_num_locks, CRYPTO_set_locking_callback, CRYPTO_set_id_callback
liboci8 (Oracle 8+) | 8.x,9.x | ? |
pdflib | 5.0.x | Yes | PDFLib docs claim it is thread safe; changes.txt indicates it has been partially thread-safe since V1.91: http://www.pdflib.com/products/pdflib-family/pdflib/.
libpng | 1.0.x | ? |
libpng | 1.2.x | ? |
libpq (PostgreSQL) | 8.x | Yes | Don't share connections across threads and watch out for crypt() calls
Sablotron | 0.95 | ? |
zlib | 1.1.4 | Yes | Relies upon thread-safe zalloc and zfree functions Default is to use libc's calloc/free which are thread-safe.


Terim Sözlüğü - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Terim Sözlüğü

Bu sözlük, genelinde HTML sayfa sunumuna, özelinde Apache HTTP Sunucusuna özgü ortak terminolojinin bir kısmını içerir. Her kavram ile ilgili daha ayrıntılı bilgi bağlarla sağlanmıştır.

Tanımlar

Algoritma
Bir sorunu sonlu sayıda adımda çözümlemek için uygulanan kurallar kümesi veya anlam belirsizliği içermeyen bir formül. Şifreleme için kullanılan algoritmalara şifre denir.
Aktarım Katmanı Güvenliği
İngilizcesi: Transport Layer Security (TLS)
TCP/IP ağları üzerinden genel iletişimin kimlik doğrulamalı ve şifreli yapılabilmesi için SSL’nin ardılı olarak Genel Ağ Mühendisliği Görev Gücü (IETF) tarafından oluşturulmuş protokol. TLS’nin 1. sürümü ile SSL’in 3. sürümü hemen hemen aynıdır.
Bakınız: SSL/TLS Şifrelemesi
Anahtar Parolası
Özel anahtar dosyalarını yetkisiz kişilerden koruyan sözcük veya cümle. Genellikle sadece şifreler için kullanılan gizli şifreleme/şifre çözme anahtarını korur.
Bakınız: SSL/TLS Şifrelemesi
Apache Eklenti Aracı (apxs)
İngilizcesi: APache eXtension Tool - apxs
Modül kaynak kodlarının devinen paylaşımlı nesneler (DSO) halinde derlenmesine ve Apache Sunucusu içinde kurulmasına yardım eden bir Perl betiği.
Daha ayrıntılı bilgi için apxs kılavuz sayfasına bakınız.
Apache Taşınabilir Arayüzü (APR)
İngilizcesi: Apache Portable Runtime - APR
Sunucu ile işletim sistemi arasındaki temel arayüzleri oluşturan kütüphaneler kümesine verilen ad. APR, Apache HTTP Sunucusuna paralel bağımsız bir proje olarak geliştirilmektedir.
Bakınız: Apache Taşınabilir Arayüzü Projesi
Bağlam
Yapılandırma dosyalarında sadece belli türdeki yönergelerin bulunmasına izin verilen bir bölge.
Bakınız: Apache Yönergelerini Açıklamak için Kullanılan Terimler
Bakışımlı Şifreleme Tekniği
Şifreleme ve şifre çözme için tek bir anahtarın kullanıldığı bir şifreleme tekniği.
Bakınız: SSL/TLS Şifrelemesi
Başlık
Bir HTTP isteğinin parçası olarak, gönderilen yanıtta asıl içerikten önce yer alan ve içerik hakkında mecazlar içeren veri.
CONNECT
Ham veri kanallarını HTTP üzerinden yönlendirmek için kullanılan bir HTTP yöntemi. SSL protokolü gibi diğer protokolleri sarmalamakta kullanılabilir.
Devingen Paylaşımlı Nesne (DSO)
İngilizcesi: Dynamic Shared Object (DSO)
İstek halinde yüklenebilen, Apache httpd çalıştırılabilir dosyasından ayrı olarak derlenmiş modüllerin ortak adı.
Bakınız: Devingen Paylaşımlı Nesne Desteği
Düz Metin
Şifrelenmemiş metin.
Düzenli İfade (Regex)
Metin içinde bir şablon tanımlama yolu. Örneğin, “A harfi ile başlayan bütün sözcükler” veya “10 rakamlı telefon numaraları” ya da “Baş harfi Z olmayan ve iki virgül içeren cümleler” gibi. Düzenli ifadeler, Apache’de belli özniteliklere uygun dosya veya özkaynakları toplamak için esnek bir yol sağlamasından ötürü oldukça yararlıdır. Örneğin, “resimler” dizini altındaki dosyalardan .gif ve .jpg uzantılı olanları toplamak için “/resimler/.*(jpg|gif)$” düzenli ifadesi yazılabilir. Apache, PCRE kütüphanesi ile sağlanan Perl uyumlu düzenli ifadeleri kullanır. PCRE'nin düzenli ifade sözdizimi hakkıda bilgi edinmek için bu siteye veya Wikipedia'ya bakabilirsiniz.
Erişim Denetimi
Ağ bölgelerine erişimin kısıtlanması. Apache bağlamında normal olarak belli URL’lere erişimi kısıtlamak şeklinde uygulanır.
Bakınız: Kimlik Doğrulama, Yetkilendirme ve Erişim Denetimi
Eylemci
Bir dosya istendiğinde uygulanacak eylemi Apache içinde gerçekleştiren nesne. Genellikle dosyalar, dosya türüne bağlı dolaylı eylemcilere sahiptir. Normalde tüm dosyalar sunucu tarafından sıradan birer dosya olarak işleme sokulduğu halde bazı belli dosyalar diğerlerinden ayrı ele alınır. Örneğin, cgi-script eylemcisi dosyaları CGI’ler tarafından işlenebilir hale getirmek üzere işleme sokar.
Bakınız: Apache Eylemcilerinin Kullanımı
Genel Anahtar
Genel Anahtarlı Şifreleme Tekniğinde, sahibinin yaptığı imzaları çözmeye ve sahibine gönderilen iletileri şifrelemeye yarayan genel erişime açık anahtar.
Bakınız: SSL/TLS Şifrelemesi
Genel Anahtarlı Şifreleme Tekniği
Şifreleme ve şifre çözme için iki ayrı anahtarın kullanıldığı bakışımsız şifreleme sistemlerinin konusu veya uygulaması. Bu amaçla kullanılan anahtarlar bir anahtar çiftinden oluşur. Genel Anahtarlı Şifrelemeye Bakışımsız Şifreleme de denir.
Bakınız: SSL/TLS Şifrelemesi
Gizli Anahtar
Genel Anahtarlı Şifreleme Tekniğinde, giden iletileri imzalamak ve gelen iletilerin şifrelerini çözmek amacıyla kullanılan gizli anahtar.
Bakınız: SSL/TLS Şifrelemesi
Güvenli Hiper Metin Aktarım Protokolü (HTTPS)
İngilizcesi: The HyperText Transfer Protocol (Secure), (HTTPS)
Güvenli Hiper Metin Aktarım Protokolü, Genel Ağ’da kullanılan standart şifreli iletişim mekanizmasıdır. Aslında HTTP protokolünün SSL üzerinden gerçekleştirilmesinden başka bir şey değildir.
Bakınız: SSL/TLS Şifrelemesi
Güvenli Soket Katmanı
İngilizcesi: Secure Sockets Layer (SSL)
TCP/IP ağları üzerinden genel iletişimin kimlik doğrulamalı ve şifreli yapılabilmesi için Netscape Communications Corporation tarafından oluşturulmuş bir protokol. Günümüzde en çok HTTPS, yani SSL üzerinden Hiper Metin Aktarım Protokolü şeklinde kullanılmaktadır.
Bakınız: SSL/TLS Şifrelemesi
Hiper Metin Aktarım Protokolü (HTTP)
İngilizcesi: HyperText Transfer Protocol (HTTP)
Genel Ağ’da kullanılan standart aktarım protokollerinden biri. Apache, RFC 2616 ile tanımlanmış protokolün HTTP/1.1 olarak bilinen 1.1 sürümünü gerçekler.
.htaccess
Belge dosyaları ağacı içine yerleştirilen bir yapılandırma dosyası olup yerleştiği dizine ve o dizinin alt dizinlerine yapılandırma yönergeleri uygulanmasını sağlar. İsmine rağmen böyle bir dosyanın içerebileceği yönergeler erişim denetleme yönergeleri ile sınırlı değildir; hemen her tür yönergeyi içerebilir.
Bakınız: Yapılandırma Dosyaları
httpd.conf
Ana Apache yapılandırma dosyası. Dosya sistemindeki öntanımlı yeri /usr/local/apache2/conf/httpd.conf olup derleme sırasındaki yapılandırmayla veya çalışma anındaki yapılandırmayla başka bir yer belirtilebilir.
Bakınız: Yapılandırma Dosyaları
İhracat Engelli
İngilizcesi: Export-Crippled
Amerika Birleşik Devletlerinin İhracat Yönetim Düzenlemelerine (EAR) uymak için şifreleme yoluyla sakatlanmış yazılım. İhracat engelli olması için şifrelenmiş yazılımları birer şifreli metin haline getiren şifre anahtarları küçük boyutlu olduğundan şifreleme zor kullanılarak kırılabilir.
Bakınız: SSL/TLS Şifrelemesi
İleti Özeti
İngilizcesi: Message Digest
Aktarım sırasında içeriğinin değişme olasılığı bulunan bir iletinin içeriğini doğrulamak için kullanılan bir özet.
Bakınız: SSL/TLS Şifrelemesi
Karşı Vekil
İstemciye kendini asıl sunucu imiş gibi gösteren bir vekil sunucu. Güvenlik, yük dengelemesi gibi sebeplerle asıl sunucuyu istemcilerden gizlemek için yararlıdır.
Kimlik Doğrulama
Sunucu, istemci veya kullanıcı gibi bir ağ öğesinin kimliğinin olumlanması.
Bakınız: Kimlik Doğrulama, Yetkilendirme ve Erişim Denetimi
MIME türü
Aktarılan belgenin çeşidini betimlemenin bir yolu. MIME, Türkçe’ye ‘Çok Amaçlı Genel Ağ Posta Eklentileri’ olarak çevrilebilecek olan "Multipurpose Internet Mail Extensions" sözcüklerinden türetilmiş bir kısaltmadır. MIME türleri bir bölü çizgisi ile ayrılmış bir ana ve bir alt belge türünün birleşiminden oluşur. text/html, image/gif ve application/octet-stream örnek olarak verilebilir. HTTP protokolünde MIME türleri Content-Type başlığında aktarılır.
Bakınız: mod_mime
Modül
Bir programın bağımsız parçalarından her biri. Apache işlevselliğinin çoğu yapılandırmaya dahil edilip edilmeyeceğine kullanıcı tarafından karar verilebilen modüllerden oluşur. Apache httpd çalıştırılabiliri içinde derlenmiş modüllere durağan modüller adı verilirken ayrı bir yerde saklanan ve çalışma anında isteğe bağlı olarak yüklenebilen modüllere devingen modüller veya DSO’lar denir. Yapılandırmaya öntanımlı olarak dahil edilen modüllere temel modüller denir. Apache için kullanılabilecek modüllerin çoğu Apache HTTP Sunucusunun tar paketi içinde dağıtılmaz; bunlara üçüncü parti modüller denir.
Bakınız: Modül Dizini
OpenSSL
SSL/TLS için açık kaynak kodlu araç kiti.
Daha ayrıntılı bilgi için http://www.openssl.org/ adresine bakınız.
Ortak Ağgeçidi Arayüzü (CGI)
İngilizcesi: Common Gateway Interface (CGI)
Bir HTTP sunucusunun bir harici programa hizmet istekleri yapmasını mümkün kılan, sunucu ile bir harici program arasındaki bir arayüz standardı. Özgün arayüz NCSA tarafından tanımlanmış olmakla birlikte ayrıca bir CGI RFC’si de vardır.
Bakınız: CGI ile Devingen İçerik
Ortam Değişkeni (ortam-değişkeni)
İşletim sistemi kabuğu tarafından yönetilen ve programlar arasında bilgi alışverişi amacıyla kullanılan isimli değişkenler. Ayrıca, Apache de ortam değişkenleri olarak tanımlanabilecek dahili değişkenler içerir fakat bunlar kabuk ortamında değil dahili Apache yapıları içinde saklanır.
Bakınız: Apache Ortam Değişkenleri
Oturum
Bir iletişimin bağlamsal bilgileri.
Özet
Uzunluğu değişebilen bir dizgenin belli bir durumuna ilişkin sabit uzunlukta bir dizge üretmek için kullanılan geri dönüşümsüz bir algoritma. Algoritmaya girdi olan farklı uzunluktaki dizgeler (özet işlevine bağlı olarak) aynı uzunlukta farklı özetler üretir.
Sanal Konaklık
Tek bir Apache sunucusundan çok sayıda site sunulması. IP tabanlı sanal konaklıkta siteler birbirlerinden IP adreslerine göre ayrılırken, isim tabanlı sanal konaklıkta siteler aynı IP adresinden kendi isimleriyle sunulabilirler.
Bakınız: Apache Sanal Konak Belgeleri
Sayısal İmza
Bir sertifikayı veya bir dosyayı doğrulamakta kullanılan şifreli bir metin. Bir imza Sertifika Makamı tarafından bir sertifikaya gömülü olan genel anahtardan bir özet üretilerek oluşturulur. İmza şifresi sadece sertifika sahibi ağ öğesinin kimliğini doğrulayacak SM’nin genel anahtarı kullanılarak çözülebilir.
Bakınız: SSL/TLS Şifrelemesi
Sertifika
Sunucu, istemci gibi ağ öğelerinin kimliğini kanıtlamakta kullanılan bir veri kaydı. Bir sertifika, sertifika sahibi (buna sertifikanın konusu da denir), sertifikayı imzalayan Sertifika Makamı (SM) (buna sertifika yayıncısı da denir), sertifika sahibinin genel anahtarı ve SM tarafından üretilen imza gibi parçalardan oluşan X.509 bilgisi içerir. Ağ öğeleri bu imzaları SM sertifikalarını kullanarak doğrular.
Bakınız: SSL/TLS Şifrelemesi
Sertifika İmzalama İsteği (Sİİ)
İngilizcesi: Certificate Signing Request (CSR)
İmzasız bir sertifikayı Sertifika Makamına kendi SM Sertifikasının özel anahtarı ile imzalaması için yapılan istek. Sİİ imzalanınca bir gerçek sertifika haline gelir.
Bakınız: SSL/TLS Şifrelemesi
Sertifika Makamı (SM)
İngilizcesi: Certification Authority (CA)
Ağ öğelerinin güvenilir olarak kimliklerinin doğrulanması için sertifikaları imzalayan güvenilir üçüncü şahıs. Diğer ağ öğeleri, sertifikalı bir öğenin kimliğini kanıtlayan bir SM’yi doğrulamak için imzayı sınayabilir.
Bakınız: SSL/TLS Şifrelemesi
Sihirli Modül Numarası (SMN)
Sihirli Modül Numarası, modüllerin ikil uyumluluğu ile ilgili olarak Apache kaynak kodunda tanımlanmış bir sabittir. Apache dahili yapıları, uygulama programlama arayüzünün önemli parçaları ve işlev çağrıları artık ikil uyumluluğun garanti edilemeyeceği kadar değiştiği zaman SMN değiştirilir. Bir SMN değişikliğinde ve bazen de sırf yeni bir Apache sürümü ile çalışmak icabettiğinde tüm üçüncü parti modüllerin en azından yeniden derlenmesi gerekir.
SSLeay
Eric A. Young tarafından geliştirilmiş özgün SSL/TLS gerçeklenim kütüphanesi.
Sunucu İsmi Belirtimi
İngilizcesi: Server Name Indication (SNI)
İstenen sunucunun konak ismini ilk SSL uzlaşım iletisinde aktarmayı ve böylece SSL uzlaşım işleminde kullanılacak sanal konak yapılandırmasının doğru seçilebilmesini sağlayan bir SSL işlevi. RFC 3546'da TLS eklentileri ile birlikte SSL'ye eklenmiştir.
Bakınız: SSL FAQ ve RFC 3546
Sunucu Taraflı İçerik Yerleştirme
İngilizcesi: Server Side Includes (SSI)
İşlem yönergelerini HTML dosyalara gömme tekniği.
Bakınız: Sunucu Taraflı İçerik Yerleştirmeye Giriş
Süzgeç
Sunucu tarafından alınan ve gönderilen veriye uygulanan bir işlem. Giriş süzgeçleri sunucuya istemci tarafından gönderilen veriyi işlerken çıkış süzgeçleri sunucu tarafından istemciye gönderilen belgeleri işler. Örneğin, INCLUDES çıkış süzgeci, belgeleri sunucu taraflı içerik için işleme sokar.
Bakınız: Süzgeçler
Şifre
Veri şifrelemek için kullanılan bir algoritma veya sistem. DES, IDEA veya RC4 örnek verilebilir.
Bakınız: SSL/TLS Şifrelemesi
Şifreli Metin
Bir Düz Metin bir Şifreden geçirilince elde edilen sonuç.
Bakınız: SSL/TLS Şifrelemesi
Tam Alan Adı (TAA)
İngilizcesi: Fully-Qualified Domain-Name (FQDN)
Bir IP adresiyle eşleşebilen, bir konak adıyla bir alan adının birleşiminden oluşan eşsiz bir ağ öğesi ismi. Örneğin, httpd.apache.org tam alan adında httpd bir konak adıyken apache.org bir alan adıdır.
Tar Paketi
tar uygulaması kullanılarak bir araya getirilmiş dosyalardan oluşan bir paket. Apache dağıtımları sıkıştırılmış tar arşivleri içinde veya pkzip kullanılarak saklanır.
Tektip Özkaynak Betimleyici
İngilizcesi: Uniform Resource Identifier (URI)
Soyut veya somut bir özkaynağı betimlemek için kullanılan bütünleşik bir karakter dizisi. Aslen RFC 2396 tarafından tanımlanmıştır. Genel Ağ’da kullanılan URI’lerden genellikle URL’ler olarak bahsedilir.
Tektip Özkaynak Konumlayıcı
İngilizcesi: Uniform Resource Locator (URL)
Genel Ağ üzerindeki bir özkaynağın ismi veya adresi. Aslen Tektip Özkaynak Betimleyici denilen terimin gayrı resmi karşılığıdır. URL’ler http veya https gibi bir şemayı takip eden bir konak adı ve bir dosya yolundan oluşurlar. Örneğin, bu sayfanın URL’si http://httpd.apache.org/docs/2.2/glossary.html olurdu.
Vekil
Asıl sunucu ile istemci arasında aracılık yapan sunucu. İstemciden aldığı istekleri asıl sunucuya gönderip, ondan aldığı yanıtları istemciye gönderir. Aynı içeriğe birden fazla istemci talip olursa vekil sunucu bu istekleri her seferinde asıl sunucudan istemek yerine kendi deposundan karşılar, böylece yanıt zamanı kısalır.
Bakınız: mod_proxy
Yapılandırma Dosyası
Apache yapılandırmasını denetim altına alan yönergeleri içeren bir metin dosyası.
Bakınız: Yapılandırma Dosyaları
Yapılandırma Yönergesi
Bakınız: Yönerge
Yönerge
Belli Apache davranışlarından bir veya daha fazlasını denetim altına alan bir yapılandırma komutu. Yönergeler yapılandırma dosyalarına yerleştirilir.
Bakınız: Yönerge Dizini
Yöntem
HTTP bağlamında, istemci tarafından istek satırında belirtilen, bir özkaynağa uygulanacak bir eylem. HTTP bağlamında belirtilebilecek yöntemlere örnek olarak GET, POST ve PUT verilebilir.
X.509
SSL/TLS kimlik doğrulamasında kullanılmak üzere Uluslararası Telekom Birliği (ITU-T) tarafından önerilmiş bir kimlik doğrulama sertitifası şeması
Bakınız: SSL/TLS Şifrelemesi

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Modül Dizini - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Modül Dizini

Apache dağıtımının parçası olarak gelen modüllerin tamamı aşağıda listelenmiştir. Ayrıca, tüm Apache yönergelerinin alfabetik olarak listelendiği bir Yönerge Dizini de mevcuttur.

Ayrıca bakınız:

  • Çok Süreçlilik Modülleri (MPM’ler)
  • Hızlı Yönerge Kılavuzu

Temel Özellikler ve Çoklu İşlem Modülleri

core
Apache HTTP Sunucusunda daima mevcut olan çekirdek özellikler
mpm_common
Birden fazla Çok Süreçlilik Modülü (MPM) tarafından gerçeklenmiş yönergeler bütünü.
beos
This Multi-Processing Module is optimized for BeOS.
event
An experimental variant of the standard worker MPM
mpm_netware
Multi-Processing Module implementing an exclusively threaded web server optimized for Novell NetWare
mpmt_os2
Hybrid multi-process, multi-threaded MPM for OS/2
prefork
Evresiz ön çatallamalı HTTP sunucusu oluşturur
mpm_winnt
This Multi-Processing Module is optimized for Windows NT.
worker
Çok evreli ve çok süreçli melez bir HTTP sunucusu oluşturan çok süreçlilik modülü.

Diğer Modüller

A | C | D | E | F | H | I | L | M | N | P | R | S | U | V

mod_actions
This module provides for executing CGI scripts based on media type or request method.
mod_alias
Belge ağacının parçalarının dosya sisteminin parçalarıyla eşlenmesini sağlar ve URL yönlendirmesi yapar.
mod_asis
Sends files that contain their own HTTP headers
mod_auth_basic
Basic authentication
mod_auth_digest
User authentication using MD5 Digest Authentication.
mod_authn_alias
Provides the ability to create extended authentication providers based on actual providers
mod_authn_anon
Allows "anonymous" user access to authenticated areas
mod_authn_dbd
User authentication using an SQL database
mod_authn_dbm
User authentication using DBM files
mod_authn_default
Authentication fallback module
mod_authn_file
User authentication using text files
mod_authnz_ldap
Allows an LDAP directory to be used to store the database for HTTP Basic authentication.
mod_authz_dbm
Group authorization using DBM files
mod_authz_default
Authorization fallback module
mod_authz_groupfile
Group authorization using plaintext files
mod_authz_host
Group authorizations based on host (name or IP address)
mod_authz_owner
Authorization based on file ownership
mod_authz_user
User Authorization
mod_autoindex
Unix ls veya Win32 dir kabuk komutunun yaptığı gibi dizin içeriğini listeler.
mod_cache
Content cache keyed to URIs.
mod_cern_meta
CERN httpd metafile semantics
mod_cgi
Execution of CGI scripts
mod_cgid
Execution of CGI scripts using an external CGI daemon
mod_charset_lite
Specify character set translation or recoding
mod_dav
Distributed Authoring and Versioning (WebDAV) functionality
mod_dav_fs
filesystem provider for mod_dav
mod_dav_lock
generic locking module for mod_dav
mod_dbd
Manages SQL database connections
mod_deflate
Compress content before it is delivered to the client
mod_dir
Bölü çizgisiyle biten yönlendirmeleri yapar ve dizin içeriği dosyalarını sunar.
mod_disk_cache
Content cache storage manager keyed to URIs
mod_dumpio
Dumps all I/O to error log as desired.
mod_echo
A simple echo server to illustrate protocol modules
mod_env
CGI betiklerine ve SSI sayfalarına aktarılan değişkenlere müdahale etmek için kullanılır.
mod_example
Illustrates the Apache module API
mod_expires
Generation of Expires and Cache-Control HTTP headers according to user-specified criteria
mod_ext_filter
Pass the response body through an external program before delivery to the client
mod_file_cache
Caches a static list of files in memory
mod_filter
Context-sensitive smart filter configuration module
mod_headers
Customization of HTTP request and response headers
mod_ident
RFC 1413 ident lookups
mod_imagemap
Server-side imagemap processing
mod_include
Server-parsed html documents (Server Side Includes)
mod_info
Provides a comprehensive overview of the server configuration
mod_isapi
ISAPI Extensions within Apache for Windows
mod_ldap
LDAP connection pooling and result caching services for use by other LDAP modules
mod_log_config
Sunucuya yapılan isteklerin günlük kayıtlarının tutulması
mod_log_forensic
Sunucuya yapılan isteklerin adli günlük kayıtlarının tutulması
mod_logio
Her isteğin girdi ve çıktı uzunluklarının günlüklenmesi.
mod_mem_cache
Content cache keyed to URIs
mod_mime
Associates the requested filename's extensions with the file's behavior (handlers and filters) and content (mime-type, language, character set and encoding)
mod_mime_magic
Determines the MIME type of a file by looking at a few bytes of its contents
mod_negotiation
Provides for content negotiation
mod_nw_ssl
Enable SSL encryption for NetWare
mod_proxy
HTTP/1.1 proxy/gateway server
mod_proxy_ajp
AJP support module for mod_proxy
mod_proxy_balancer
mod_proxy extension for load balancing
mod_proxy_connect
mod_proxy extension for CONNECT request handling
mod_proxy_ftp
FTP support module for mod_proxy
mod_proxy_http
HTTP support module for mod_proxy
mod_proxy_scgi
SCGI gateway module for mod_proxy
mod_reqtimeout
Set timeout and minimum data rate for receiving requests
mod_rewrite
Provides a rule-based rewriting engine to rewrite requested URLs on the fly
mod_setenvif
Ortam değişkenlerinin isteğin özelliklerine uygun olarak atanmasını sağlar
mod_so
Modüllerin ve çalıştırılabilir kodun sunucunun başlatılması veya yeniden başlatılması sırasında yüklenmesini sağlar.
mod_speling
Attempts to correct mistaken URLs that users might have entered by ignoring capitalization and by allowing up to one misspelling
mod_ssl
Strong cryptography using the Secure Sockets Layer (SSL) and Transport Layer Security (TLS) protocols
mod_status
Sunucu etkinliği ve başarımı hakkında bilgi sağlar.
mod_substitute
Perform search and replace operations on response bodies
mod_suexec
CGI betiklerinin belli bir kullanıcı ve grubun aidiyetinde çalışmasını mümkün kılar.
mod_unique_id
Provides an environment variable with a unique identifier for each request
mod_userdir
Kullanıcılara özel dizinler
mod_usertrack
Clickstream logging of user activity on a site
mod_version
Version dependent configuration
mod_vhost_alias
Kitlesel sanal konakların devingen olarak yapılandırılmasını sağlar

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Yönerge Dizini - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Yönerge Dizini

Standart Apache dağıtımında bulunan yönergelerin tamamı burada listelenmiştir. Hepsi aralarında şekilsel bir uyum sağlanarak açıklanmışlardır. Açıklamalarında kullanılan terimler için Yönerge Sözlüğüne bakabilirsiniz.

Ayrıca, yönerge ayrıntılarının bir özet olarak listelendiği bir Hızlı Yönerge Kılavuzu da mevcuttur.

A | B | C | D | E | F | G | H | I | K | L | M | N | O | P | R | S | T | U | V | W | X

  • AcceptFilter
  • AcceptMutex
  • AcceptPathInfo
  • AccessFileName
  • Action
  • AddAlt
  • AddAltByEncoding
  • AddAltByType
  • AddCharset
  • AddDefaultCharset
  • AddDescription
  • AddEncoding
  • AddHandler
  • AddIcon
  • AddIconByEncoding
  • AddIconByType
  • AddInputFilter
  • AddLanguage
  • AddModuleInfo
  • AddOutputFilter
  • AddOutputFilterByType
  • AddType
  • Alias
  • AliasMatch
  • Allow
  • AllowCONNECT
  • AllowEncodedSlashes
  • AllowOverride
  • Anonymous
  • Anonymous_LogEmail
  • Anonymous_MustGiveEmail
  • Anonymous_NoUserID
  • Anonymous_VerifyEmail
  • AuthBasicAuthoritative
  • AuthBasicProvider
  • AuthDBDUserPWQuery
  • AuthDBDUserRealmQuery
  • AuthDBMGroupFile
  • AuthDBMType
  • AuthDBMUserFile
  • AuthDefaultAuthoritative
  • AuthDigestAlgorithm
  • AuthDigestDomain
  • AuthDigestNcCheck
  • AuthDigestNonceFormat
  • AuthDigestNonceLifetime
  • AuthDigestProvider
  • AuthDigestQop
  • AuthDigestShmemSize
  • AuthGroupFile
  • AuthLDAPBindAuthoritative
  • AuthLDAPBindDN
  • AuthLDAPBindPassword
  • AuthLDAPCharsetConfig
  • AuthLDAPCompareDNOnServer
  • AuthLDAPDereferenceAliases
  • AuthLDAPGroupAttribute
  • AuthLDAPGroupAttributeIsDN
  • AuthLDAPRemoteUserAttribute
  • AuthLDAPRemoteUserIsDN
  • AuthLDAPUrl
  • AuthName
  • <AuthnProviderAlias>
  • AuthType
  • AuthUserFile
  • AuthzDBMAuthoritative
  • AuthzDBMType
  • AuthzDefaultAuthoritative
  • AuthzGroupFileAuthoritative
  • AuthzLDAPAuthoritative
  • AuthzOwnerAuthoritative
  • AuthzUserAuthoritative
  • BalancerMember
  • BrowserMatch
  • BrowserMatchNoCase
  • BufferedLogs
  • CacheDefaultExpire
  • CacheDirLength
  • CacheDirLevels
  • CacheDisable
  • CacheEnable
  • CacheFile
  • CacheIgnoreCacheControl
  • CacheIgnoreHeaders
  • CacheIgnoreNoLastMod
  • CacheIgnoreQueryString
  • CacheIgnoreURLSessionIdentifiers
  • CacheLastModifiedFactor
  • CacheLock
  • CacheLockMaxAge
  • CacheLockPath
  • CacheMaxExpire
  • CacheMaxFileSize
  • CacheMinFileSize
  • CacheNegotiatedDocs
  • CacheRoot
  • CacheStoreNoStore
  • CacheStorePrivate
  • CGIDScriptTimeout
  • CGIMapExtension
  • CharsetDefault
  • CharsetOptions
  • CharsetSourceEnc
  • CheckCaseOnly
  • CheckSpelling
  • ChrootDir
  • ContentDigest
  • CookieDomain
  • CookieExpires
  • CookieLog
  • CookieName
  • CookieStyle
  • CookieTracking
  • CoreDumpDirectory
  • CustomLog
  • Dav
  • DavDepthInfinity
  • DavGenericLockDB
  • DavLockDB
  • DavMinTimeout
  • DBDExptime
  • DBDKeep
  • DBDMax
  • DBDMin
  • DBDParams
  • DBDPersist
  • DBDPrepareSQL
  • DBDriver
  • DefaultIcon
  • DefaultLanguage
  • DefaultType
  • DeflateBufferSize
  • DeflateCompressionLevel
  • DeflateFilterNote
  • DeflateInflateLimitRequestBody
  • DeflateInflateRatioBurst
  • DeflateInflateRatioLimit
  • DeflateMemLevel
  • DeflateWindowSize
  • Deny
  • <Directory>
  • DirectoryIndex
  • <DirectoryMatch>
  • DirectorySlash
  • DocumentRoot
  • DumpIOInput
  • DumpIOLogLevel
  • DumpIOOutput
  • EnableExceptionHook
  • EnableMMAP
  • EnableSendfile
  • ErrorDocument
  • ErrorLog
  • Example
  • ExpiresActive
  • ExpiresByType
  • ExpiresDefault
  • ExtendedStatus
  • ExtFilterDefine
  • ExtFilterOptions
  • FallbackResource
  • FileETag
  • <Files>
  • <FilesMatch>
  • FilterChain
  • FilterDeclare
  • FilterProtocol
  • FilterProvider
  • FilterTrace
  • ForceLanguagePriority
  • ForceType
  • ForensicLog
  • GprofDir
  • GracefulShutdownTimeout
  • Group
  • Header
  • HeaderName
  • HostnameLookups
  • IdentityCheck
  • IdentityCheckTimeout
  • <IfDefine>
  • <IfModule>
  • <IfVersion>
  • ImapBase
  • ImapDefault
  • ImapMenu
  • Include
  • IndexHeadInsert
  • IndexIgnore
  • IndexOptions
  • IndexOrderDefault
  • IndexStyleSheet
  • ISAPIAppendLogToErrors
  • ISAPIAppendLogToQuery
  • ISAPICacheFile
  • ISAPIFakeAsync
  • ISAPILogNotSupported
  • ISAPIReadAheadBuffer
  • KeepAlive
  • KeepAliveTimeout
  • LanguagePriority
  • LDAPCacheEntries
  • LDAPCacheTTL
  • LDAPConnectionTimeout
  • LDAPOpCacheEntries
  • LDAPOpCacheTTL
  • LDAPSharedCacheFile
  • LDAPSharedCacheSize
  • LDAPTrustedClientCert
  • LDAPTrustedGlobalCert
  • LDAPTrustedMode
  • LDAPVerifyServerCert
  • <Limit>
  • <LimitExcept>
  • LimitInternalRecursion
  • LimitRequestBody
  • LimitRequestFields
  • LimitRequestFieldSize
  • LimitRequestLine
  • LimitXMLRequestBody
  • Listen
  • ListenBackLog
  • LoadFile
  • LoadModule
  • <Location>
  • <LocationMatch>
  • LockFile
  • LogFormat
  • LogLevel
  • MaxClients
  • MaxKeepAliveRequests
  • MaxMemFree
  • MaxRanges
  • MaxRequestsPerChild
  • MaxRequestsPerThread
  • MaxSpareServers
  • MaxSpareThreads
  • MaxThreads
  • MCacheMaxObjectCount
  • MCacheMaxObjectSize
  • MCacheMaxStreamingBuffer
  • MCacheMinObjectSize
  • MCacheRemovalAlgorithm
  • MCacheSize
  • MergeTrailers
  • MetaDir
  • MetaFiles
  • MetaSuffix
  • MimeMagicFile
  • MinSpareServers
  • MinSpareThreads
  • MMapFile
  • ModMimeUsePathInfo
  • MultiviewsMatch
  • NameVirtualHost
  • NoProxy
  • NWSSLTrustedCerts
  • NWSSLUpgradeable
  • Options
  • Order
  • PassEnv
  • PidFile
  • Protocol
  • ProtocolEcho
  • <Proxy>
  • ProxyBadHeader
  • ProxyBlock
  • ProxyDomain
  • ProxyErrorOverride
  • ProxyFtpDirCharset
  • ProxyIOBufferSize
  • <ProxyMatch>
  • ProxyMaxForwards
  • ProxyPass
  • ProxyPassInterpolateEnv
  • ProxyPassMatch
  • ProxyPassReverse
  • ProxyPassReverseCookieDomain
  • ProxyPassReverseCookiePath
  • ProxyPreserveHost
  • ProxyReceiveBufferSize
  • ProxyRemote
  • ProxyRemoteMatch
  • ProxyRequests
  • ProxySCGIInternalRedirect
  • ProxySCGISendfile
  • ProxySet
  • ProxyStatus
  • ProxyTimeout
  • ProxyVia
  • ReadmeName
  • ReceiveBufferSize
  • Redirect
  • RedirectMatch
  • RedirectPermanent
  • RedirectTemp
  • RemoveCharset
  • RemoveEncoding
  • RemoveHandler
  • RemoveInputFilter
  • RemoveLanguage
  • RemoveOutputFilter
  • RemoveType
  • RequestHeader
  • RequestReadTimeout
  • Require
  • RewriteBase
  • RewriteCond
  • RewriteEngine
  • RewriteLock
  • RewriteLog
  • RewriteLogLevel
  • RewriteMap
  • RewriteOptions
  • RewriteRule
  • RLimitCPU
  • RLimitMEM
  • RLimitNPROC
  • Satisfy
  • ScoreBoardFile
  • Script
  • ScriptAlias
  • ScriptAliasMatch
  • ScriptInterpreterSource
  • ScriptLog
  • ScriptLogBuffer
  • ScriptLogLength
  • ScriptSock
  • SecureListen
  • SeeRequestTail
  • SendBufferSize
  • ServerAdmin
  • ServerAlias
  • ServerLimit
  • ServerName
  • ServerPath
  • ServerRoot
  • ServerSignature
  • ServerTokens
  • SetEnv
  • SetEnvIf
  • SetEnvIfNoCase
  • SetHandler
  • SetInputFilter
  • SetOutputFilter
  • SSIEnableAccess
  • SSIEndTag
  • SSIErrorMsg
  • SSIETag
  • SSILastModified
  • SSIStartTag
  • SSITimeFormat
  • SSIUndefinedEcho
  • SSLCACertificateFile
  • SSLCACertificatePath
  • SSLCADNRequestFile
  • SSLCADNRequestPath
  • SSLCARevocationFile
  • SSLCARevocationPath
  • SSLCertificateChainFile
  • SSLCertificateFile
  • SSLCertificateKeyFile
  • SSLCipherSuite
  • SSLCompression
  • SSLCryptoDevice
  • SSLEngine
  • SSLFIPS
  • SSLHonorCipherOrder
  • SSLInsecureRenegotiation
  • SSLMutex
  • SSLOptions
  • SSLPassPhraseDialog
  • SSLProtocol
  • SSLProxyCACertificateFile
  • SSLProxyCACertificatePath
  • SSLProxyCARevocationFile
  • SSLProxyCARevocationPath
  • SSLProxyCheckPeerCN
  • SSLProxyCheckPeerExpire
  • SSLProxyCipherSuite
  • SSLProxyEngine
  • SSLProxyMachineCertificateChainFile
  • SSLProxyMachineCertificateFile
  • SSLProxyMachineCertificatePath
  • SSLProxyProtocol
  • SSLProxyVerify
  • SSLProxyVerifyDepth
  • SSLRandomSeed
  • SSLRenegBufferSize
  • SSLRequire
  • SSLRequireSSL
  • SSLSessionCache
  • SSLSessionCacheTimeout
  • SSLStrictSNIVHostCheck
  • SSLUserName
  • SSLVerifyClient
  • SSLVerifyDepth
  • StartServers
  • StartThreads
  • Substitute
  • Suexec
  • SuexecUserGroup
  • ThreadLimit
  • ThreadsPerChild
  • ThreadStackSize
  • TimeOut
  • TraceEnable
  • TransferLog
  • TypesConfig
  • UnsetEnv
  • UseCanonicalName
  • UseCanonicalPhysicalPort
  • User
  • UserDir
  • VirtualDocumentRoot
  • VirtualDocumentRootIP
  • <VirtualHost>
  • VirtualScriptAlias
  • VirtualScriptAliasIP
  • Win32DisableAcceptEx
  • XBitHack

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Hızlı Yönerge Kılavuzu - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2 > Modüller

Hızlı Yönerge Kılavuzu

Bu hızlı yönerge kılavuzunda Apache yapılandırma yönergelerinin kullanımı, öntanımlı değerleri, durumu ve bağlamı gösterilmiştir. Bunların her biri hakkında ayrıntılı bilgi almak için Yönerge Sözlüğüne bakınız.

İlk sütunda yönergenin ismi ve kullanımı belirtilmiştir. İkinci sütunda yönergenin varsa öntanımlı değeri gösterilmiştir. Eğer öntanımlı değer sütuna sığmayacak kadar uzunsa sığmayan kısım atılıp yerine “+” imi konmuştur.

Aşağıda sağdaki gösterge tablolarına uygun olarak, üçüncü sütunda yönergenin kullanımına izin verilen bağlamlar, dördüncü sütunda ise yönergenin durumu gösterilmiştir.

A | B | C | D | E | F | G | H | I | K | L | M | N | O | P | R | S | T | U | V | W | X
s | sunucu geneli
k | sanal konak
d | dizin
h | .htaccess

Ç | Çekirdek
M | MPM
T | Temel
E | Eklenti
D | Deneysel
AcceptFilter protocol kabul_süzgeci |  | s | Ç
Bir protokolün dinleyici soketleri için en iyilemeleri ayarlar
AcceptMutex Default|yöntem | Default | s | M
Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden çok sayıda çocuk süreci sıraya sokmak için kullandığı yöntemi belirler.
AcceptPathInfo On|Off|Default | Default | skdh | Ç
Dosya isminden sonra belirtilen yol verisini kabul veya reddeder.
AccessFileName filename [filename] ... | .htaccess | sk | Ç
Dağıtık yapılandırma dosyasının ismi belirtilir.
Action action-type cgi-script [virtual] |  | skdh | T
Activates a CGI script for a particular handler or content-type
AddAlt metin dosya [dosya] ... |  | skdh | T
Dosyaya göre seçilen simgenin yerinde gösterilecek metni belirler.
AddAltByEncoding metin MIME-kodlaması [MIME-kodlaması] ... |  | skdh | T
Dosyanın MIME kodlamasına göre seçilen simgenin yerinde gösterilecek metni belirler.
AddAltByType metin MIME-türü [MIME-türü] ... |  | skdh | T
Dosyanın MIME türüne göre seçilen simgenin yerinde gösterilecek metni belirler.
AddCharset charset extension [extension] ... |  | skdh | T
Maps the given filename extensions to the specified content charset
AddDefaultCharset On|Off|karküm | Off | skdh | Ç
Bir yanıtın içerik türü text/plain veya text/html olduğunda eklenecek öntanımlı karakter kümesi parametresini belirler.
AddDescription metin dosya [dosya] ... |  | skdh | T
Bir dosya için gösterilecek açıklama belirtilir.
AddEncoding MIME-enc extension [extension] ... |  | skdh | T
Maps the given filename extensions to the specified encoding type
AddHandler handler-name extension [extension] ... |  | skdh | T
Maps the filename extensions to the specified handler
AddIcon simge isim [isim] ... |  | skdh | T
Bir dosya için gösterilecek simgeyi dosya adına göre belirler.
AddIconByEncoding simge MIME-kodlaması [MIME-kodlaması] ... |  | skdh | T
Bir dosya için gösterilecek simgeyi dosyanın MIME kodlamasına göre belirler.
AddIconByType simge MIME-türü [MIME-türü] ... |  | skdh | T
Bir dosya için gösterilecek simgeyi dosyanın MIME türüne göre belirler.
AddInputFilter filter[;filter...] extension [extension] ... |  | skdh | T
Maps filename extensions to the filters that will process client requests
AddLanguage MIME-lang extension [extension] ... |  | skdh | T
Maps the given filename extension to the specified content language
AddModuleInfo module-name string |  | sk | E
Adds additional information to the module information displayed by the server-info handler
AddOutputFilter filter[;filter...] extension [extension] ... |  | skdh | T
Maps filename extensions to the filters that will process responses from the server
AddOutputFilterByType süzgeç[;süzgeç...] MIME-türü [MIME-türü] ... |  | skdh | Ç
Belli bir MIME türüne bir çıktı süzgeci atar.
AddType MIME-type extension [extension] ... |  | skdh | T
Maps the given filename extensions onto the specified content type
Alias URL-yolu dosya-yolu|dizin-yolu |  | sk | T
URL’leri dosya sistemi konumlarıyla eşler.
AliasMatch düzenli-ifade dosya-yolu|dizin-yolu |  | sk | T
URL’leri dosya sistemi konumlarıyla düzenli ifadeleri kullanarak eşler.
Allow from all|host|env=[!]env-variable [host|env=[!]env-variable] ... |  | dh | T
Controls which hosts can access an area of the server
AllowCONNECT port [port] ... | 443 563 | sk | E
Ports that are allowed to CONNECT through the proxy
AllowEncodedSlashes On|Off|NoDecode | Off | sk | Ç
Kodlanmış dosya yolu ayracı içeren URL’lere izin verilip verilmeyeceğini belirler.
AllowOverride All|None|yönerge-türü [yönerge-türü] ... | All | d | Ç
.htaccess dosyalarında bulunmasına izin verilen yönerge türleri belirtilir.
Anonymous user [user] ... |  | dh | E
Specifies userIDs that are allowed access without password verification
Anonymous_LogEmail On|Off | On | dh | E
Sets whether the password entered will be logged in the error log
Anonymous_MustGiveEmail On|Off | On | dh | E
Specifies whether blank passwords are allowed
Anonymous_NoUserID On|Off | Off | dh | E
Sets whether the userID field may be empty
Anonymous_VerifyEmail On|Off | Off | dh | E
Sets whether to check the password field for a correctly formatted email address
AuthBasicAuthoritative On|Off | On | dh | T
Sets whether authorization and authentication are passed to lower level modules
AuthBasicProvider provider-name [provider-name] ... | file | dh | T
Sets the authentication provider(s) for this location
AuthDBDUserPWQuery query |  | d | E
SQL query to look up a password for a user
AuthDBDUserRealmQuery query |  | d | E
SQL query to look up a password hash for a user and realm.
AuthDBMGroupFile file-path |  | dh | E
Sets the name of the database file containing the list of user groups for authorization
AuthDBMType default|SDBM|GDBM|NDBM|DB | default | dh | E
Sets the type of database file that is used to store passwords
AuthDBMUserFile file-path |  | dh | E
Sets the name of a database file containing the list of users and passwords for authentication
AuthDefaultAuthoritative On|Off | On | dh | T
Sets whether authentication is passed to lower level modules
AuthDigestAlgorithm MD5|MD5-sess | MD5 | dh | E
Selects the algorithm used to calculate the challenge and response hashes in digest authentication
AuthDigestDomain URI [URI] ... |  | dh | E
URIs that are in the same protection space for digest authentication
AuthDigestNcCheck On|Off | Off | s | E
Enables or disables checking of the nonce-count sent by the server
AuthDigestNonceFormat format |  | dh | E
Determines how the nonce is generated
AuthDigestNonceLifetime seconds | 300 | dh | E
How long the server nonce is valid
AuthDigestProvider provider-name [provider-name] ... | file | dh | E
Sets the authentication provider(s) for this location
AuthDigestQop none|auth|auth-int [auth|auth-int] | auth | dh | E
Determines the quality-of-protection to use in digest authentication
AuthDigestShmemSize size | 1000 | s | E
The amount of shared memory to allocate for keeping track of clients
AuthGroupFile file-path |  | dh | T
Sets the name of a text file containing the list of user groups for authorization
AuthLDAPBindAuthoritativeoff|on | on | dh | E
Determines if other authentication providers are used when a user can be mapped to a DN but the server cannot successfully bind with the user's credentials.
AuthLDAPBindDN distinguished-name |  | dh | E
Optional DN to use in binding to the LDAP server
AuthLDAPBindPassword password |  | dh | E
Password used in conjuction with the bind DN
AuthLDAPCharsetConfig file-path |  | s | E
Language to charset conversion configuration file
AuthLDAPCompareDNOnServer on|off | on | dh | E
Use the LDAP server to compare the DNs
AuthLDAPDereferenceAliases never|searching|finding|always | Always | dh | E
When will the module de-reference aliases
AuthLDAPGroupAttribute attribute | member uniquemember + | dh | E
LDAP attributes used to check for group membership
AuthLDAPGroupAttributeIsDN on|off | on | dh | E
Use the DN of the client username when checking for group membership
AuthLDAPRemoteUserAttribute uid |  | dh | E
Use the value of the attribute returned during the user query to set the REMOTE_USER environment variable
AuthLDAPRemoteUserIsDN on|off | off | dh | E
Use the DN of the client username to set the REMOTE_USER environment variable
AuthLDAPUrl url [NONE|SSL|TLS|STARTTLS] |  | dh | E
URL specifying the LDAP search parameters
AuthName yetki-alanı |  | dh | Ç
HTTP kimlik doğrulamasında kullanmak için yetki alanı ismi
<AuthnProviderAlias baseProvider Alias> ... </AuthnProviderAlias> |  | s | E
Enclose a group of directives that represent an extension of a base authentication provider and referenced by the specified alias
AuthType Basic|Digest |  | dh | Ç
Kullanıcı kimlik doğrulaması türü
AuthUserFile file-path |  | dh | T
Sets the name of a text file containing the list of users and passwords for authentication
AuthzDBMAuthoritative On|Off | On | dh | E
Sets whether authorization will be passed on to lower level modules
AuthzDBMType default|SDBM|GDBM|NDBM|DB | default | dh | E
Sets the type of database file that is used to store list of user groups
AuthzDefaultAuthoritative On|Off | On | dh | T
Sets whether authorization is passed to lower level modules
AuthzGroupFileAuthoritative On|Off | On | dh | T
Sets whether authorization will be passed on to lower level modules
AuthzLDAPAuthoritative on|off | on | dh | E
Prevent other authentication modules from authenticating the user if this one fails
AuthzOwnerAuthoritative On|Off | On | dh | E
Sets whether authorization will be passed on to lower level modules
AuthzUserAuthoritative On|Off | On | dh | T
Sets whether authorization will be passed on to lower level modules
BalancerMember [balancerurl] url [key=value [key=value ...]] |  | d | E
Add a member to a load balancing group
BrowserMatch düzifd [!]ort-değişkeni[=değer] [[!]ort-değişkeni[=değer]] ... |  | skdh | T
Ortam değişkenlerini HTTP kullanıcı arayüzüne göre belirler.
BrowserMatchNoCase düzifd [!]ort-değişkeni[=değer] [[!]ort-değişkeni[=değer]] ... |  | skdh | T
Ortam değişkenlerini HTTP kullanıcı arayüzünün harf büyüklüğüne duyarsız eşleşmelerine bağlı olarak belirler.
BufferedLogs On|Off | Off | s | T
Günlük girdilerini diske yazmadan önce bellekte tamponlar
CacheDefaultExpire seconds | 3600 (one hour) | sk | E
The default duration to cache a document when no expiry date is specified.
CacheDirLength length | 2 | sk | E
The number of characters in subdirectory names
CacheDirLevels levels | 3 | sk | E
The number of levels of subdirectories in the cache.
CacheDisable url-string |  | sk | E
Disable caching of specified URLs
CacheEnable cache_type url-string |  | sk | E
Enable caching of specified URLs using a specified storage manager
CacheFile file-path [file-path] ... |  | s | D
Cache a list of file handles at startup time
CacheIgnoreCacheControl On|Off | Off | sk | E
Ignore request to not serve cached content to client
CacheIgnoreHeaders header-string [header-string] ... | None | sk | E
Do not store the given HTTP header(s) in the cache.
CacheIgnoreNoLastMod On|Off | Off | sk | E
Ignore the fact that a response has no Last Modified header.
CacheIgnoreQueryString On|Off | Off | sk | E
Ignore query string when caching
CacheIgnoreURLSessionIdentifiers identifier [identifier] ... | None | sk | E
Ignore defined session identifiers encoded in the URL when caching
CacheLastModifiedFactor float | 0.1 | sk | E
The factor used to compute an expiry date based on the LastModified date.
CacheLock on|off | off | sk | E
Enable the thundering herd lock.
CacheLockMaxAge integer | 5 | sk | E
Set the maximum possible age of a cache lock.
CacheLockPath directory | /tmp/mod_cache-lock + | sk | E
Set the lock path directory.
CacheMaxExpire seconds | 86400 (one day) | sk | E
The maximum time in seconds to cache a document
CacheMaxFileSize bytes | 1000000 | sk | E
The maximum size (in bytes) of a document to be placed in the cache
CacheMinFileSize bytes | 1 | sk | E
The minimum size (in bytes) of a document to be placed in the cache
CacheNegotiatedDocs On|Off | Off | sk | T
Allows content-negotiated documents to be cached by proxy servers
CacheRoot directory |  | sk | E
The directory root under which cache files are stored
CacheStoreNoStore On|Off | Off | sk | E
Attempt to cache requests or responses that have been marked as no-store.
CacheStorePrivate On|Off | Off | sk | E
Attempt to cache responses that the server has marked as private
CGIDScriptTimeout time[s|ms] |  | skdh | T
The length of time to wait for more output from the CGI program
CGIMapExtension cgi-yolu .uzantı |  | dh | Ç
CGI betik yorumlayıcısını saptama tekniğini belirler.
CharsetDefault charset |  | skdh | E
Charset to translate into
CharsetOptions option [option] ... | DebugLevel=0 NoImpl + | skdh | E
Configures charset translation behavior
CharsetSourceEnc charset |  | skdh | E
Source charset of files
CheckCaseOnly on|off | Off | skdh | E
Limits the action of the speling module to case corrections
CheckSpelling on|off | Off | skdh | E
Enables the spelling module
ChrootDir /dizin/yolu/ |  | s | M
Başlatıldıktan sonra Apache’nin chroot(8) yapacağı dizin
ContentDigest On|Off | Off | skdh | Ç
Content-MD5 HTTP yanıt başlıklarının üretimini etkin kılar.
CookieDomain domain |  | skdh | E
The domain to which the tracking cookie applies
CookieExpires expiry-period |  | skdh | E
Expiry time for the tracking cookie
CookieLog dosya-adı |  | sk | T
Çerezleri günlüğe kaydetmek için dosya ismi belirtmekte kullanılır.
CookieName token | Apache | skdh | E
Name of the tracking cookie
CookieStyle Netscape|Cookie|Cookie2|RFC2109|RFC2965 | Netscape | skdh | E
Format of the cookie header field
CookieTracking on|off | off | skdh | E
Enables tracking cookie
CoreDumpDirectory dizin |  | s | M
core dosyasını dökümlemek üzere Apache’nin geçmeye çalışacağı dizin.
CustomLog dosya|borulu-süreç biçem|takma-ad [env=[!]ortam-değişkeni] |  | sk | T
Günlük dosyasın ismini ve girdi biçemini belirler.
Dav On|Off|provider-name | Off | d | E
Enable WebDAV HTTP methods
DavDepthInfinity on|off | off | skd | E
Allow PROPFIND, Depth: Infinity requests
DavGenericLockDB file-path |  | skd | E
Location of the DAV lock database
DavLockDB file-path |  | sk | E
Location of the DAV lock database
DavMinTimeout seconds | 0 | skd | E
Minimum amount of time the server holds a lock on a DAV resource
DBDExptime time-in-seconds | 300 | sk | E
Keepalive time for idle connections
DBDKeep number | 2 | sk | E
Maximum sustained number of connections
DBDMax number | 10 | sk | E
Maximum number of connections
DBDMin number | 1 | sk | E
Minimum number of connections
DBDParams param1=value1[,param2=value2] |  | sk | E
Parameters for database connection
DBDPersist On|Off |  | sk | E
Whether to use persistent connections
DBDPrepareSQL "SQL statement" label |  | sk | E
Define an SQL prepared statement
DBDriver name |  | sk | E
Specify an SQL driver
DefaultIcon URL-yolu |  | skdh | T
Özel bir simge atanmamış dosyalar için gösterilecek simgeyi belirler.
DefaultLanguage MIME-lang |  | skdh | T
Sets all files in the given scope to the specified language
DefaultType MIME-türü|none | text/plain | skdh | Ç
Sunucunun MIME türünü saptayamadığı durumda göndereceği MIME içerik türünü belirler.
DeflateBufferSize value | 8096 | sk | E
Fragment size to be compressed at one time by zlib
DeflateCompressionLevel value |  | sk | E
How much compression do we apply to the output
DeflateFilterNote [type] notename |  | sk | E
Places the compression ratio in a note for logging
DeflateInflateLimitRequestBodyvalue |  | skdh | E
Maximum size of inflated request bodies
DeflateInflateRatioBurst value |  | skdh | E
Maximum number of times the inflation ratio for request bodies can be crossed
DeflateInflateRatioLimit value |  | skdh | E
Maximum inflation ratio for request bodies
DeflateMemLevel value | 9 | sk | E
How much memory should be used by zlib for compression
DeflateWindowSize value | 15 | sk | E
Zlib compression window size
Deny from all|host|env=[!]env-variable [host|env=[!]env-variable] ... |  | dh | T
Controls which hosts are denied access to the server
<Directory dizin-yolu> ... </Directory> |  | sk | Ç
Sadece ismi belirtilen dosya sistemi dizinine ve bunun altdizinleri ile içeriklerine uygulanacak bir yönerge grubunu sarmalar.
DirectoryIndex yerel-url [yerel-url] ... | index.html | skdh | T
İstemci bir dizin istediğinde dizin içeriğini listeler.
<DirectoryMatch düzifd> ... </DirectoryMatch> |  | sk | Ç
Bir düzenli ifade ile eşleşen dosya sistemi dizininde ve bunun altdizinlerinde uygulanacak bir yönerge grubunu sarmalar.
DirectorySlash On|Off | On | skdh | T
Bölü çizgisi ile biten yönlendirmeleri açar/kapar.
DocumentRoot dizin-yolu | /usr/local/apache/h + | sk | Ç
İstemciye görünür olan ana belge ağacının kök dizinini belirler.
DumpIOInput On|Off | Off | s | E
Dump all input data to the error log
DumpIOLogLevel level | debug | s | E
Controls the logging level of the DumpIO output
DumpIOOutput On|Off | Off | s | E
Dump all output data to the error log
EnableExceptionHook On|Off | Off | s | M
Bir çöküş sonrası olağandışılık eylemcilerini çalıştıracak kancayı etkin kılar.
EnableMMAP On|Off | On | skdh | Ç
Teslimat sırasında okunacak dosyalar için bellek eşlemeyi etkin kılar.
EnableSendfile On|Off | On | skdh | Ç
Dosyaların istemciye tesliminde çekirdeğin dosya gönderme desteğinin kullanımını etkin kılar.
ErrorDocument hata-kodu belge |  | skdh | Ç
Bir hata durumunda sunucunun istemciye ne döndüreceğini belirler.
ErrorLog dosya-yolu|syslog[:oluşum] | logs/error_log (Uni + | sk | Ç
Sunucunun hata günlüğünü tutacağı yeri belirler.
Example |  | skdh | D
Demonstration directive to illustrate the Apache module API
ExpiresActive On|Off |  | skdh | E
Enables generation of Expires headers
ExpiresByType MIME-type <code>seconds |  | skdh | E
Value of the Expires header configured by MIME type
ExpiresDefault <code>seconds |  | skdh | E
Default algorithm for calculating expiration time
ExtendedStatus On|Off | Off | s | T
Her istekte ek durum bilgisinin toplanmasını sağlar.
ExtFilterDefine filtername parameters |  | s | E
Define an external filter
ExtFilterOptions option [option] ... | DebugLevel=0 NoLogS + | d | E
Configure mod_ext_filter options
FallbackResource disabled | yerel-url |  | skdh | T
Bir dosyayla eşleşmeyen istekler için öntanımlı bir URL tanımlar
FileETag bileşen ... | INode MTime Size | skdh | Ç
ETagDuruk dosyalar için HTTP yanıt başlığını oluşturmakta kullanılacak dosya özniteliklerini belirler.
<Files dosya-adı> ... </Files> |  | skdh | Ç
Dosya isimleriyle eşleşme halinde uygulanacak yönergeleri içerir.
<FilesMatch düzifd> ... </FilesMatch> |  | skdh | Ç
Düzenli ifadelerin dosya isimleriyle eşleşmesi halinde uygulanacak yönergeleri içerir.
FilterChain [+=-@!]filter-name ... |  | skdh | T
Configure the filter chain
FilterDeclare filter-name [type] |  | skdh | T
Declare a smart filter
FilterProtocol filter-name [provider-name] proto-flags |  | skdh | T
Deal with correct HTTP protocol handling
FilterProvider filter-name provider-name [req|resp|env]=dispatch match |  | skdh | T
Register a content filter
FilterTrace filter-name level |  | skd | T
Get debug/diagnostic information from mod_filter
ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] | Prefer | skdh | T
Action to take if a single acceptable document is not found
ForceType MIME-türü|None |  | dh | Ç
Bütün dosyaların belirtilen MIME içerik türüyle sunulmasına sebep olur.
ForensicLog dosya-adı|borulu-süreç |  | sk | E
Adli günlük için dosya ismini belirler.
GprofDir /tmp/gprof/|/tmp/gprof/% |  | sk | Ç
gmon.out profilleme verisinin yazılacağı dizin.
GracefulShutDownTimeout saniye |  | s | M
Sunucunun nazikçe kapatılmasının ardından ana süreç çıkana kadar geçecek süre için bir zaman aşımı belirler.
Group unix-grubu | #-1 | s | M
İsteklere yanıt verecek sunucunun ait olacağı grubu belirler.
Header [condition] set|append|merge|add|unset|echo|edit header [value] [replacement] [early|env=[!]variable] |  | skdh | E
Configure HTTP response headers
HeaderName dosya-ismi |  | skdh | T
Dizin listesinin tepesine yerleştirilecek dosyanın ismini belirler.
HostnameLookups On|Off|Double | Off | skd | Ç
İstemci IP adresleri üzerinde DNS sorgularını etkin kılar.
IdentityCheck On|Off | Off | skd | E
Enables logging of the RFC 1413 identity of the remote user
IdentityCheckTimeout seconds | 30 | skd | E
Determines the timeout duration for ident requests
<IfDefine [!]parametre-adı> ... </IfDefine> |  | skdh | Ç
Başlatma sırasında bir doğruluk sınamasından sonra işleme sokulacak yönergeleri sarmalar.
<IfModule [!]modül-dosyası|modül-betimleyici> ... </IfModule> |  | skdh | Ç
Belli bir modülün varlığına veya yokluğuna göre işleme sokulacak yönergeleri sarmalar.
<IfVersion [[!]operator] version> ... </IfVersion> |  | skdh | E
contains version dependent configuration
ImapBase map|referer|URL | http://servername/ | skdh | T
Default base for imagemap files
ImapDefault error|nocontent|map|referer|URL | nocontent | skdh | T
Default action when an imagemap is called with coordinates that are not explicitly mapped
ImapMenu none|formatted|semiformatted|unformatted |  | skdh | T
Action if no coordinates are given when calling an imagemap
Include dosya-yolu|dizin-yolu |  | skd | Ç
Sunucu yapılandırma dosyalarının başka dosyaları içermesini sağlar.
IndexHeadInsert "imlenim ..." |  | skdh | T
Bir dizin sayfasının HEAD bölümüne metin yerleştirir.
IndexIgnore dosya [dosya] ... | "." | skdh | T
Dizin içerik listesinden gizlenecek dosyaların listesi belirtilir.
IndexOptions [+|-]seçenek [[+|-]seçenek] ... |  | skdh | T
Dizin içerik listesini yapılandıracak seçenekler belirtilir.
IndexOrderDefault Ascending|Descending Name|Date|Size|Description | Ascending Name | skdh | T
Dizin içerik listesinin öntanımlı sıralamasını belirler.
IndexStyleSheet url-yolu |  | skdh | T
Dizin listesine bir biçembent ekler.
ISAPIAppendLogToErrors on|off | off | skdh | T
Record HSE_APPEND_LOG_PARAMETER requests from ISAPI extensions to the error log
ISAPIAppendLogToQuery on|off | on | skdh | T
Record HSE_APPEND_LOG_PARAMETER requests from ISAPI extensions to the query field
ISAPICacheFile file-path [file-path] ... |  | sk | T
ISAPI .dll files to be loaded at startup
ISAPIFakeAsync on|off | off | skdh | T
Fake asynchronous support for ISAPI callbacks
ISAPILogNotSupported on|off | off | skdh | T
Log unsupported feature requests from ISAPI extensions
ISAPIReadAheadBuffer size | 49152 | skdh | T
Size of the Read Ahead Buffer sent to ISAPI extensions
KeepAlive On|Off | On | sk | Ç
HTTP kalıcı bağlantılarını etkin kılar
KeepAliveTimeout saniye | 5 | sk | Ç
Bir kalıcı bağlantıda sunucunun bir sonraki isteği bekleme süresi
LanguagePriority MIME-lang [MIME-lang] ... |  | skdh | T
The precendence of language variants for cases where the client does not express a preference
LDAPCacheEntries number | 1024 | s | E
Maximum number of entries in the primary LDAP cache
LDAPCacheTTL seconds | 600 | s | E
Time that cached items remain valid
LDAPConnectionTimeout seconds |  | s | E
Specifies the socket connection timeout in seconds
LDAPOpCacheEntries number | 1024 | s | E
Number of entries used to cache LDAP compare operations
LDAPOpCacheTTL seconds | 600 | s | E
Time that entries in the operation cache remain valid
LDAPSharedCacheFile directory-path/filename |  | s | E
Sets the shared memory cache file
LDAPSharedCacheSize bytes | 500000 | s | E
Size in bytes of the shared-memory cache
LDAPTrustedClientCert type directory-path/filename/nickname [password] |  | skdh | E
Sets the file containing or nickname referring to a per connection client certificate. Not all LDAP toolkits support per connection client certificates.
LDAPTrustedGlobalCert type directory-path/filename [password] |  | s | E
Sets the file or database containing global trusted Certificate Authority or global client certificates
LDAPTrustedMode type |  | sk | E
Specifies the SSL/TLS mode to be used when connecting to an LDAP server.
LDAPVerifyServerCert On|Off | On | s | E
Force server certificate verification
<Limit yöntem [yöntem] ... > ... </Limit> |  | skdh | Ç
Erişimi sınırlanacak HTTP yöntemleri için erişim sınırlayıcıları sarmalar.
<LimitExcept yöntem [yöntem] ... > ... </LimitExcept> |  | skdh | Ç
İsimleri belirtilenler dışında kalan HTTP yöntemleri için kullanılacak erişim sınırlayıcıları sarmalar.
LimitInternalRecursion sayı [sayı] | 10 | sk | Ç
Dahili yönlendirmelerin ve istek içi isteklerin azami sayısını belirler.
LimitRequestBody bayt-sayısı | 0 | skdh | Ç
İstemci tarafından gönderilen HTTP istek gövdesinin toplam uzunluğunu sınırlar.
LimitRequestFields sayı | 100 | sk | Ç
İstemciden kabul edilecek HTTP isteği başlık alanlarının sayısını sınırlar.
LimitRequestFieldSize bayt-sayısı | 8190 | sk | Ç
İstemciden kabul edilecek HTTP isteği başlık uzunluğunu sınırlar.
LimitRequestLine bayt-sayısı | 8190 | sk | Ç
İstemciden kabul edilecek HTTP istek satırının uzunluğunu sınırlar.
LimitXMLRequestBody bayt-sayısı | 1000000 | skdh | Ç
Bir XML temelli istek gövdesinin uzunluğunu sınırlar.
Listen [IP-adresi:]port-numarası [protokol] |  | s | M
Sunucunun dinleyeceği IP adresini ve portu belirler.
ListenBacklog kuyruk-uzunluğu |  | s | M
Bekleyen bağlantılar kuyruğunun azami uzunluğunu belirler
LoadFile dosya-ismi [dosya-ismi] ... |  | s | E
Belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler.
LoadModule modül dosya-ismi |  | s | E
Belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler ve etkin modül listesine ekler.
<Location URL-yolu|URL> ... </Location> |  | sk | Ç
İçerdiği yönergeler sadece eşleşen URL’lere uygulanır.
<LocationMatch düzifade> ... </LocationMatch> |  | sk | Ç
İçerdiği yönergeler sadece düzenli ifadelerle eşleşen URL’lere uygulanır.
LockFile dosya | logs/accept.lock | s | M
Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden çok sayıda çocuk süreci sıraya sokarken kullandığı kilit dosyasının yerini belirler.
LogFormat biçem|takma-ad [takma-ad] | "%h %l %u %t \"%r\" + | sk | T
Bir günlük dosyasında kullanılmak üzere girdi biçemi tanımlar.
LogLevel seviye | warn | sk | Ç
Hata günlüklerinin ayrıntı seviyesini belirler.
MaxClients sayı |  | s | M
Aynı anda işleme sokulacak azami bağlantı sayısı
MaxKeepAliveRequests sayı | 100 | sk | Ç
Bir kalıcı bağlantıda izin verilen istek sayısı
MaxMemFree kB-sayısı | 0 | s | M
free() çağrılmaksızın ana bellek ayırıcının ayırmasına izin verilen azami bellek miktarını belirler.
MaxRanges default | unlimited | none | miktar | 200 | skd | Ç
Özkaynağın tamamı döndürülmeden önce gönderilebilecek HTTP range başlıklarının azami miktarı
MaxRequestsPerChild sayı | 10000 | s | M
Tek bir çocuk sürecin ömrü boyunca işleme sokabileceği istek sayısını sınırlamakta kullanılır.
MaxRequestsPerThread number | 0 | s | M
Limit on the number of requests that an individual thread will handle during its life
MaxSpareServers sayı | 10 | s | M
Boştaki çocuk süreçlerin azami sayısı
MaxSpareThreads number |  | s | M
Boştaki azami evre sayısını belirler
MaxThreads number | 2048 | s | M
Set the maximum number of worker threads
MCacheMaxObjectCount value | 1009 | s | E
The maximum number of objects allowed to be placed in the cache
MCacheMaxObjectSize bytes | 10000 | s | E
The maximum size (in bytes) of a document allowed in the cache
MCacheMaxStreamingBuffer size_in_bytes | the smaller of 1000 + | s | E
Maximum amount of a streamed response to buffer in memory before declaring the response uncacheable
MCacheMinObjectSize bytes | 1 | s | E
The minimum size (in bytes) of a document to be allowed in the cache
MCacheRemovalAlgorithm LRU|GDSF | GDSF | s | E
The algorithm used to select documents for removal from the cache
MCacheSize KBytes | 100 | s | E
The maximum amount of memory used by the cache in KBytes
MergeTrailers [on|off] | off | sk | Ç
Determins whether trailers are merged into headers
MetaDir directory | .web | skdh | E
Name of the directory to find CERN-style meta information files
MetaFiles on|off | off | skdh | E
Activates CERN meta-file processing
MetaSuffix suffix | .meta | skdh | E
File name suffix for the file containg CERN-style meta information
MimeMagicFile file-path |  | sk | E
Enable MIME-type determination based on file contents using the specified magic file
MinSpareServers sayı | 5 | s | M
Boştaki çocuk süreçlerin asgari sayısı
MinSpareThreads sayı |  | s | M
İsteklerin ani artışında devreye girecek boştaki evrelerin asgari sayısını belirler.
MMapFile file-path [file-path] ... |  | s | D
Map a list of files into memory at startup time
ModMimeUsePathInfo On|Off | Off | d | T
Tells mod_mime to treat path_info components as part of the filename
MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers [Handlers|Filters] | NegotiatedOnly | skdh | T
The types of files that will be included when searching for a matching file with MultiViews
NameVirtualHost adres[:port] |  | s | Ç
İsme dayalı sanal konaklar için IP adresi belirtir
NoProxy host [host] ... |  | sk | E
Hosts, domains, or networks that will be connected to directly
NWSSLTrustedCerts filename [filename] ... |  | s | T
List of additional client certificates
NWSSLUpgradeable [IP-address:]portnumber |  | s | T
Allows a connection to be upgraded to an SSL connection upon request
Options [+|-]seçenek [[+|-]seçenek] ... | All | skdh | Ç
Belli bir dizinde geçerli olacak özellikleri yapılandırır.
Order ordering | Deny,Allow | dh | T
Controls the default access state and the order in which Allow and Deny are evaluated.
PassEnv ortam-değişkeni [ortam-değişkeni] ... |  | skdh | T
Ortam değişkenlerini kabuktan aktarır.
PidFile dosya | logs/httpd.pid | s | M
Ana sürecin süreç kimliğinin (PID) kaydedileceği dosyayı belirler.
Protocol protokol |  | sk | Ç
Dinlenen bir soket için protokol
ProtocolEcho On|Off | Off | sk | D
Turn the echo server on or off
<Proxy wildcard-url> ...</Proxy> |  | sk | E
Container for directives applied to proxied resources
ProxyBadHeader IsError|Ignore|StartBody | IsError | sk | E
Determines how to handle bad header lines in a response
ProxyBlock *|word|host|domain [word|host|domain] ... |  | sk | E
Words, hosts, or domains that are banned from being proxied
ProxyDomain Domain |  | sk | E
Default domain name for proxied requests
ProxyErrorOverride On|Off | Off | sk | E
Override error pages for proxied content
ProxyFtpDirCharset character set | ISO-8859-1 | skd | E
Define the character set for proxied FTP listings
ProxyIOBufferSize bytes | 8192 | sk | E
Determine size of internal data throughput buffer
<ProxyMatch regex> ...</ProxyMatch> |  | sk | E
Container for directives applied to regular-expression-matched proxied resources
ProxyMaxForwards number | -1 | sk | E
Maximium number of proxies that a request can be forwarded through
ProxyPass [path] !|url [key=value [key=value ...]] [nocanon] [interpolate] |  | skd | E
Maps remote servers into the local server URL-space
ProxyPassInterpolateEnv On|Off | Off | skd | E
Enable Environment Variable interpolation in Reverse Proxy configurations
ProxyPassMatch [regex] !|url [key=value [key=value ...]] |  | skd | E
Maps remote servers into the local server URL-space using regular expressions
ProxyPassReverse [path] url [interpolate] |  | skd | E
Adjusts the URL in HTTP response headers sent from a reverse proxied server
ProxyPassReverseCookieDomain internal-domain public-domain [interpolate] |  | skd | E
Adjusts the Domain string in Set-Cookie headers from a reverse- proxied server
ProxyPassReverseCookiePath internal-path public-path [interpolate] |  | skd | E
Adjusts the Path string in Set-Cookie headers from a reverse- proxied server
ProxyPreserveHost On|Off | Off | sk | E
Use incoming Host HTTP request header for proxy request
ProxyReceiveBufferSize bytes | 0 | sk | E
Network buffer size for proxied HTTP and FTP connections
ProxyRemote match remote-server |  | sk | E
Remote proxy used to handle certain requests
ProxyRemoteMatch regex remote-server |  | sk | E
Remote proxy used to handle requests matched by regular expressions
ProxyRequests On|Off | Off | sk | E
Enables forward (standard) proxy requests
ProxySCGIInternalRedirect On|Off | On | skd | E
Enable or disable internal redirect responses from the backend
ProxySCGISendfile On|Off|Headername | Off | skd | E
Enable evaluation of X-Sendfile pseudo response header
ProxySet url key=value [key=value ...] |  | d | E
Set various Proxy balancer or member parameters
ProxyStatus Off|On|Full | Off | sk | E
Show Proxy LoadBalancer status in mod_status
ProxyTimeout seconds |  | sk | E
Network timeout for proxied requests
ProxyVia On|Off|Full|Block | Off | sk | E
Information provided in the Via HTTP response header for proxied requests
ReadmeName dosya-ismi |  | skdh | T
Dizin listesinin sonuna yerleştirilecek dosyanın ismini belirler.
ReceiveBufferSize bayt-sayısı | 0 | s | M
TCP alım tamponu boyu
Redirect [durum] URL-yolu URL |  | skdh | T
İstemciyi, bir yönlendirme isteği döndürerek farklı bir URL’ye yönlendirir.
RedirectMatch [durum] düzenli-ifade URL |  | skdh | T
Geçerli URL ile eşleşen bir düzenli ifadeye dayanarak bir harici yönlendirme gönderir.
RedirectPermanent URL-yolu URL |  | skdh | T
İstemciyi, kalıcı bir yönlendirme isteği döndürerek farklı bir URL’ye yönlendirir.
RedirectTemp URL-yolu URL |  | skdh | T
İstemciyi, geçici bir yönlendirme isteği döndürerek farklı bir URL’ye yönlendirir.
RemoveCharset extension [extension] ... |  | kdh | T
Removes any character set associations for a set of file extensions
RemoveEncoding extension [extension] ... |  | kdh | T
Removes any content encoding associations for a set of file extensions
RemoveHandler extension [extension] ... |  | kdh | T
Removes any handler associations for a set of file extensions
RemoveInputFilter extension [extension] ... |  | kdh | T
Removes any input filter associations for a set of file extensions
RemoveLanguage extension [extension] ... |  | kdh | T
Removes any language associations for a set of file extensions
RemoveOutputFilter extension [extension] ... |  | kdh | T
Removes any output filter associations for a set of file extensions
RemoveType extension [extension] ... |  | kdh | T
Removes any content type associations for a set of file extensions
RequestHeader set|append|merge|add|unset|edit header [value] [replacement] [early|env=[!]variable] |  | skdh | E
Configure HTTP request headers
RequestReadTimeout [header=timeout[[-maxtimeout],MinRate=rate] [body=timeout[[-maxtimeout],MinRate=rate] |  | sk | E
Set timeout values for receiving request headers and body from client.
Require öğe-adı [öğe-adı] ... |  | dh | Ç
Bir özkaynağa erişebilecek kimliği doğrulanmış kullanıcıları belirler
RewriteBase URL-path |  | dh | E
Sets the base URL for per-directory rewrites
RewriteCond TestString CondPattern |  | skdh | E
Defines a condition under which rewriting will take place
RewriteEngine on|off | off | skdh | E
Enables or disables runtime rewriting engine
RewriteLock file-path |  | s | E
Sets the name of the lock file used for RewriteMap synchronization
RewriteLog file-path|pipe |  | sk | E
Sets the name of the file used for logging rewrite engine processing
RewriteLogLevel Level | 0 | sk | E
Sets the verbosity of the log file used by the rewrite engine
RewriteMap MapName MapType:MapSource |  | sk | E
Defines a mapping function for key-lookup
RewriteOptions Options |  | skdh | E
Sets some special options for the rewrite engine
RewriteRule Pattern Substitution [flags] |  | skdh | E
Defines rules for the rewriting engine
RLimitCPU saniye|max [saniye|max] |  | skdh | Ç
Apache alt süreçleri tarafından çalıştırılan süreçlerin işlemci tüketimine sınırlama getirir.
RLimitMEM bayt-sayısı|max [bayt-sayısı|max] |  | skdh | Ç
Apache alt süreçleri tarafından çalıştırılan süreçlerin bellek tüketimine sınırlama getirir.
RLimitNPROC sayı|max [sayı|max] |  | skdh | Ç
Apache alt süreçleri tarafından çalıştırılabilecek süreç sayısına sınırlama getirir.
Satisfy Any|All | All | dh | Ç
Konak seviyesinde erişim denetimi ile kullanıcı kimlik doğrulaması arasındaki etkileşim
ScoreBoardFile dosya-yolu | logs/apache_runtime + | s | M
Çocuk süreçler için eşgüdüm verisini saklamakta kullanılan dosyanın yerini belirler.
Script method cgi-script |  | skd | T
Activates a CGI script for a particular request method.
ScriptAlias URL-yolu dosya-yolu|dizin-yolu |  | sk | T
Bir URL’yi dosya sistemindeki bir yere eşler ve hedefi bir CGI betiği olarak çalıştırır.
ScriptAliasMatch düzenli-ifade dosya-yolu|dizin-yolu |  | sk | T
Bir URL’yi dosya sistemindeki bir yere düzenli ifade kullanarak eşler ve hedefi bir CGI betiği olarak çalıştırır.
ScriptInterpreterSource Registry|Registry-Strict|Script | Script | skdh | Ç
CGI betikleri için yorumlayıcı belirleme tekniği
ScriptLog file-path |  | sk | T
Location of the CGI script error logfile
ScriptLogBuffer bytes | 1024 | sk | T
Maximum amount of PUT or POST requests that will be recorded in the scriptlog
ScriptLogLength bytes | 10385760 | sk | T
Size limit of the CGI script logfile
ScriptSock file-path | logs/cgisock | s | T
The filename prefix of the socket to use for communication with the cgi daemon
SecureListen [IP-address:]portnumber Certificate-Name [MUTUAL] |  | s | T
Enables SSL encryption for the specified port
SeeRequestTail On|Off | Off | s | T
İsteğin kendisi 63 karakterden uzun olduğunda, isteğin ilk 63 karakterinin mi yoksa son 63 karakterinin mi gösterileceğini belirler.
SendBufferSize bayt-sayısı | 0 | s | M
TCP tamponu boyu
ServerAdmin eposta-adresi|URL |  | sk | Ç
Sunucunun hata iletilerinde istemciye göstereceği eposta adresi
ServerAlias konakadı [konakadı] ... |  | k | Ç
İstekleri isme dayalı sanal konaklarla eşleştirilirken kullanılacak konak adları için başka isimler belirtebilmeyi sağlar.
ServerLimit sayı |  | s | M
Ayarlanabilir süreç sayısının üst sınırını belirler.
ServerName [şema://]tam-nitelenmiş-alan-adı[:port] |  | sk | Ç
Sunucunun özdeşleşeceği konak ismi ve port.
ServerPath URL-yolu |  | k | Ç
Uyumsuz bir tarayıcı tarafından erişilmesi için bir isme dayalı sanal konak için meşru URL yolu
ServerRoot dizin-yolu | /usr/local/apache | s | Ç
Sunucu yapılandırması için kök dizin
ServerSignature On|Off|EMail | Off | skdh | Ç
Sunucu tarafından üretilen belgelerin dipnotunu ayarlar.
ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full | Full | s | Ç
Server HTTP yanıt başlığını yapılandırır.
SetEnv ortam-değişkeni [değer] |  | skdh | T
Ortam değişkenlerini tanımlar.
SetEnvIf öznitelik düzifd [!]ort-değişkeni[=değer] [[!]ort-değişkeni[=değer]] ... |  | skdh | T
Ortam değişkenlerini isteğin özniteliklerine göre atar.
SetEnvIfNoCase öznitelik düzifd [!]ort-değişkeni[=değer] [[!]ort-değişkeni[=değer]] ... |  | skdh | T
Ortam değişkenlerini isteğin özniteliklerinde harf büyüklüğüne bağlı olmaksızın yapılmış tanımlara göre atar.
SetHandler eylemci-ismi|None |  | skdh | Ç
Eşleşen tüm dosyaların belli bir eylemci tarafından işlenmesine sebep olur.
SetInputFilter süzgeç[;süzgeç...] |  | skdh | Ç
POST girdilerini ve istemci isteklerini işleyecek süzgeçleri belirler.
SetOutputFilter süzgeç[;süzgeç...] |  | skdh | Ç
Sunucunun yanıtlarını işleyecek süzgeçleri belirler.
SSIEnableAccess on|off | off | dh | T
Enable the -A flag during conditional flow control processing.
SSIEndTag tag | "-->" | sk | T
String that ends an include element
SSIErrorMsg message | "[an error occurred + | skdh | T
Error message displayed when there is an SSI error
SSIETag on|off | off | dh | T
Controls whether ETags are generated by the server.
SSILastModified on|off | off | dh | T
Controls whether Last-Modified headers are generated by the server.
SSIStartTag tag | "<!--#" | sk | T
String that starts an include element
SSITimeFormat formatstring | "%A, %d-%b-%Y %H:%M + | skdh | T
Configures the format in which date strings are displayed
SSIUndefinedEcho string | "(none)" | skdh | T
String displayed when an unset variable is echoed
SSLCACertificateFile file-path |  | sk | E
File of concatenated PEM-encoded CA Certificates for Client Auth
SSLCACertificatePath directory-path |  | sk | E
Directory of PEM-encoded CA Certificates for Client Auth
SSLCADNRequestFile file-path |  | sk | E
File of concatenated PEM-encoded CA Certificates for defining acceptable CA names
SSLCADNRequestPath directory-path |  | sk | E
Directory of PEM-encoded CA Certificates for defining acceptable CA names
SSLCARevocationFile file-path |  | sk | E
File of concatenated PEM-encoded CA CRLs for Client Auth
SSLCARevocationPath directory-path |  | sk | E
Directory of PEM-encoded CA CRLs for Client Auth
SSLCertificateChainFile file-path |  | sk | E
File of PEM-encoded Server CA Certificates
SSLCertificateFile file-path |  | sk | E
Server PEM-encoded X.509 Certificate file
SSLCertificateKeyFile file-path |  | sk | E
Server PEM-encoded Private Key file
SSLCipherSuite cipher-spec | ALL:!ADH:RC4+RSA:+H + | skdh | E
Cipher Suite available for negotiation in SSL handshake
SSLCompression on|off | off | sk | E
Enable compression on the SSL level
SSLCryptoDevice engine | builtin | s | E
Enable use of a cryptographic hardware accelerator
SSLEngine on|off|optional | off | sk | E
SSL Engine Operation Switch
SSLFIPS on|off | off | s | E
SSL FIPS mode Switch
SSLHonorCipherOrder flag |  | sk | E
Option to prefer the server's cipher preference order
SSLInsecureRenegotiation flag | off | sk | E
Option to enable support for insecure renegotiation
SSLMutex type | none | s | E
Semaphore for internal mutual exclusion of operations
SSLOptions [+|-]option ... |  | skdh | E
Configure various SSL engine run-time options
SSLPassPhraseDialog type | builtin | s | E
Type of pass phrase dialog for encrypted private keys
SSLProtocol [+|-]protocol ... | all | sk | E
Configure usable SSL protocol flavors
SSLProxyCACertificateFile file-path |  | sk | E
File of concatenated PEM-encoded CA Certificates for Remote Server Auth
SSLProxyCACertificatePath directory-path |  | sk | E
Directory of PEM-encoded CA Certificates for Remote Server Auth
SSLProxyCARevocationFile file-path |  | sk | E
File of concatenated PEM-encoded CA CRLs for Remote Server Auth
SSLProxyCARevocationPath directory-path |  | sk | E
Directory of PEM-encoded CA CRLs for Remote Server Auth
SSLProxyCheckPeerCN on|off | off | sk | E
Whether to check the remote server certificates CN field
SSLProxyCheckPeerExpire on|off | off | sk | E
Whether to check if remote server certificate is expired
SSLProxyCipherSuite cipher-spec | ALL:!ADH:RC4+RSA:+H + | skdh | E
Cipher Suite available for negotiation in SSL proxy handshake
SSLProxyEngine on|off | off | sk | E
SSL Proxy Engine Operation Switch
SSLProxyMachineCertificateChainFile filename |  | s | E
File of concatenated PEM-encoded CA certificates to be used by the proxy for choosing a certificate
SSLProxyMachineCertificateFile filename |  | s | E
File of concatenated PEM-encoded client certificates and keys to be used by the proxy
SSLProxyMachineCertificatePath directory |  | s | E
Directory of PEM-encoded client certificates and keys to be used by the proxy
SSLProxyProtocol [+|-]protocol ... | all | sk | E
Configure usable SSL protocol flavors for proxy usage
SSLProxyVerify level | none | sk | E
Type of remote server Certificate verification
SSLProxyVerifyDepth number | 1 | sk | E
Maximum depth of CA Certificates in Remote Server Certificate verification
SSLRandomSeed context source [bytes] |  | s | E
Pseudo Random Number Generator (PRNG) seeding source
SSLRenegBufferSize bytes | 131072 | dh | E
Set the size for the SSL renegotiation buffer
SSLRequire expression |  | dh | E
Allow access only when an arbitrarily complex boolean expression is true
SSLRequireSSL |  | dh | E
Deny access when SSL is not used for the HTTP request
SSLSessionCache type | none | s | E
Type of the global/inter-process SSL Session Cache
SSLSessionCacheTimeout seconds | 300 | sk | E
Number of seconds before an SSL session expires in the Session Cache
SSLStrictSNIVHostCheck on|off | off | sk | E
Whether to allow non SNI clients to access a name based virtual host.
SSLUserName varname |  | sdh | E
Variable name to determine user name
SSLVerifyClient level | none | skdh | E
Type of Client Certificate verification
SSLVerifyDepth number | 1 | skdh | E
Maximum depth of CA Certificates in Client Certificate verification
StartServers sayı |  | s | M
Sunucunun başlatılması sırasında oluşturulan çocuk süreçlerin sayısını belirler.
StartThreads sayı |  | s | M
Sunucunun başlatılması sırasında oluşturulan evrelerin sayısını belirler.
Substitute s/pattern/substitution/[infq] |  | dh | E
Pattern to filter the response content
Suexec On|Off |  | s | Ç
suEXEC özelliğini açar veya kapar
SuexecUserGroup Kullanıcı Grup |  | sk | E
CGI betiklerini çalıştıracak kullanıcı ve grup belirtilir.
ThreadLimit sayı |  | s | M
Çocuk süreç başına ayarlanabilir evre sayısının üst sınırını belirler.
ThreadsPerChild sayı |  | s | M
Her çocuk süreç tarafından oluşturulan evrelerin sayısını belirler.
ThreadStackSize boyut |  | s | M
İstemci bağlantılarını elde eden evreler tarafından kullanılan yığıtın bayt cinsinden uzunluğunu belirler.
TimeOut saniye | 300 | sk | Ç
Bir istek için başarısız olmadan önce belirli olayların gerçekleşmesi için sunucunun geçmesini bekleyeceği süre.
TraceEnable [on|off|extended] | on | sk | Ç
TRACE isteklerinde davranış şeklini belirler
TransferLog dosya|borulu-süreç [takma-ad] |  | sk | T
Bir günlük dosyasının yerini belirtir.
TypesConfig file-path | conf/mime.types | s | T
The location of the mime.types file
UnsetEnv ortam-değişkeni [ortam-değişkeni] ... |  | skdh | T
Ortamdaki değişkenleri tanımsız hale getirir.
UseCanonicalName On|Off|DNS | Off | skd | Ç
Sunucunun kendi adını ve portunu nasıl belirleyeceğini ayarlar
UseCanonicalPhysicalPort On|Off | Off | skd | Ç
Sunucunun kendi adını ve portunu nasıl belirleyeceğini ayarlar
User unix-kullanıcısı | #-1 | s | M
İsteklere yanıt verecek sunucunun ait olacağı kullanıcıyı belirler.
UserDir dizin [dizin] ... |  | sk | T
Kullanıcıya özel dizinlerin yeri
VirtualDocumentRoot hesaplanan-dizin|none | none | sk | E
Bir sanal konağın belge kök dizinini devingen olarak yapılandırır.
VirtualDocumentRootIP hesaplanan-dizin|none | none | sk | E
Bir sanal konağın belge kök dizinini devingen olarak yapılandırır.
<VirtualHost adres[:port] [adres[:port]] ...> ... </VirtualHost> |  | s | Ç
Sadece belli bir konak ismine ve porta uygulanacak yönergeleri barındırır.
VirtualScriptAlias hesaplanan-dizin|none | none | sk | E
Bir sanal konağın CGI dizinini devingen olarak yapılandırır.
VirtualScriptAliasIP hesaplanan-dizin|none | none | sk | E
Bir sanal konağın CGI dizinini devingen olarak yapılandırır.
Win32DisableAcceptEx |  | s | M
Use accept() rather than AcceptEx() to accept network connections
XBitHack on|off|full | off | skdh | T
Parse SSI directives in files with the execute bit set

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


Site Haritası - Apache HTTP Sunucusu Sürüm 2.2

Apache HTTP Sunucusu Sürüm 2.2

Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.2

Site Haritası

Bu sayfada Apache HTTP Sunucusu Sürüm 2.2 Belgelerinin tamamı listelenmiştir.

Sürümlerin Dağıtım Bilgileri

  • 2.2’ye 2.0’dan yükseltme
  • Apache 2.1/2.2’deki yeni özellikler
  • Apache 2.0’daki yeni özellikler
  • Apache Lisansı

Apache HTTP Sunucusunun Kullanımı

  • Derleme ve Kurulum
  • Sunucuyu Başlatma
  • Sunucuyu Durdurma ve Yeniden Başlatma
  • Yapılandırma Dosyaları
  • Directory, Location ve Files Bölümleri Nasıl Çalışır
  • İçerik Bellekleme
  • Sunucu Genelinde Yapılandırma
  • Günlük Dosyaları
  • URL’lerin Dosya Sistemi ile Eşlenmesi
  • Devingen Paylaşımlı Nesne (DSO) Desteği
  • İçerik Dili Yönetimi
  • Özel Hata Yanıtları
  • Sunucunun Kullandığı Adreslerin ve Portların Ayarlanması
  • Çok Süreçlilik Modülleri (MPM’ler)
  • Ortam Değişkenleri
  • Eylemci Kullanımı
  • Süzgeçler
  • CGI için Suexec Desteği
  • DNS ile İlgili Konular ve Apache
  • Sıkça Sorulan Sorular

Apache Sanal Konak (VirtualHost) Belgeleri

  • Genel Bakış
  • İsme göre Sanal Konak Desteği
  • IP Adresine göre Sanal Konak Desteği
  • Sanal Konakların Devingen olarak Yapılandırılması
  • VirtualHost Örnekleri
  • Sanal Konak Eşleştirmesinin Derinliğine İncelenmesi
  • Dosya Tanıtıcı Sınırlamaları

URL’lerin Yeniden Yazılması

  • Genel Bakış
  • mod_rewrite Başvuru Belgesi
  • mod_rewrite ve düzenli ifadelere giriş
  • URL'lerin yeniden eşlenmesi ve yönlendirilmesi içinmod_rewrite kullanımı
  • Erişim denetimi için mod_rewrite kullanımı
  • mod_rewrite ile devingen sanal konaklar
  • mod_rewrite ile devingen vekil kullanımı
  • RewriteMap kullanımı
  • İleri seviye teknikler
  • mod_rewrite ne zaman kullanılMAZ
  • Seçenekler
  • Teknik Ayrıntılar

Apache SSL/TLS Şifrelemesi

  • Genel Bakış
  • SSL/TLS Şifrelemesi: Giriş
  • SSL/TLS Şifrelemesi: Uyumluluk
  • SSL/TLS Şifrelemesi: Nasıl
  • SSL/TLS Şifrelemesi: SSS

Kılavuzlar, Öğreticiler ve Nasıllar

  • Genel Bakış
  • Kimlik Doğrulama ve Yetkilendirme
  • Erişim Denetimi
  • CGI ile Devingen İçerik
  • Sunucu Taraflı İçerik Yerleştirme (SSI)
  • .htaccess Dosyaları
  • Kullanıcı Dizinleri (public_html)

Platformlara Özgü Bilgiler

  • Genel Bakış
  • Microsoft Windows ile Apache Kullanımı
  • Microsoft Windows için Apache Derleme
  • Novell NetWare ile Apache Kullanımı
  • HPUX üzerinde Yüksek Başarımlı HTTP Sunucusu Çalıştırma
  • Apache EBCDIC Portu

Apache HTTP Sunucusu ve Desteklenen Programlar

  • Genel Bakış
  • Kılavuz Sayfası: httpd
  • Kılavuz Sayfası: ab
  • Kılavuz Sayfası: apachectl
  • Kılavuz Sayfası: apxs
  • Kılavuz Sayfası: configure
  • Kılavuz Sayfası: dbmmanage
  • Kılavuz Sayfası: htcacheclean
  • Kılavuz Sayfası: htdbm
  • Kılavuz Sayfası: htdigest
  • Kılavuz Sayfası: htpasswd
  • Kılavuz Sayfası: httxt2dbm
  • Kılavuz Sayfası: logresolve
  • Kılavuz Sayfası: rotatelogs
  • Kılavuz Sayfası: suexec
  • Diğer Programlar

Çeşitli Belgeler

  • Genel Bakış
  • Başarım - Apache'nin Ayarlanması
  • Güvenlik İpuçları
  • İlgili Standartlar
  • Parola Şifreleme Çeşitleri

Apache Modülleri

  • Apache modüllerini tanımlamakta kullanılan terimlerin açıklamaları
  • Apache yönergelerini tanımlamakta kullanılan terimlerin açıklamaları
  • Apache Temel Özellikleri
  • Apache MPM Ortak Yönergeleri
  • Apache MPM beos
  • Apache MPM event
  • Apache MPM netware
  • Apache MPM os2
  • Apache MPM prefork
  • Apache MPM winnt
  • Apache MPM worker
  • Apache Modülü mod_actions
  • Apache Modülü mod_alias
  • Apache Modülü mod_asis
  • Apache Modülü mod_auth_basic
  • Apache Modülü mod_auth_digest
  • Apache Modülü mod_authn_alias
  • Apache Modülü mod_authn_anon
  • Apache Modülü mod_authn_dbd
  • Apache Modülü mod_authn_dbm
  • Apache Modülü mod_authn_default
  • Apache Modülü mod_authn_file
  • Apache Modülü mod_authnz_ldap
  • Apache Modülü mod_authz_dbm
  • Apache Modülü mod_authz_default
  • Apache Modülü mod_authz_groupfile
  • Apache Modülü mod_authz_host
  • Apache Modülü mod_authz_owner
  • Apache Modülü mod_authz_user
  • Apache Modülü mod_autoindex
  • Apache Modülü mod_cache
  • Apache Modülü mod_cern_meta
  • Apache Modülü mod_cgi
  • Apache Modülü mod_cgid
  • Apache Modülü mod_charset_lite
  • Apache Modülü mod_dav
  • Apache Modülü mod_dav_fs
  • Apache Modülü mod_dav_lock
  • Apache Modülü mod_dbd
  • Apache Modülü mod_deflate
  • Apache Modülü mod_dir
  • Apache Modülü mod_disk_cache
  • Apache Modülü mod_dumpio
  • Apache Modülü mod_echo
  • Apache Modülü mod_env
  • Apache Modülü mod_example
  • Apache Modülü mod_expires
  • Apache Modülü mod_ext_filter
  • Apache Modülü mod_file_cache
  • Apache Modülü mod_filter
  • Apache Modülü mod_headers
  • Apache Modülü mod_ident
  • Apache Modülü mod_imagemap
  • Apache Modülü mod_include
  • Apache Modülü mod_info
  • Apache Modülü mod_isapi
  • Apache Modülü mod_ldap
  • Apache Modülü mod_log_config
  • Apache Modülü mod_log_forensic
  • Apache Modülü mod_logio
  • Apache Modülü mod_mem_cache
  • Apache Modülü mod_mime
  • Apache Modülü mod_mime_magic
  • Apache Modülü mod_negotiation
  • Apache Modülü mod_nw_ssl
  • Apache Modülü mod_proxy
  • Apache Modülü mod_proxy_ajp
  • Apache Modülü mod_proxy_balancer
  • Apache Modülü mod_proxy_connect
  • Apache Modülü mod_proxy_ftp
  • Apache Modülü mod_proxy_http
  • Apache Modülü mod_proxy_scgi
  • Apache Modülü mod_reqtimeout
  • Apache Modülü mod_rewrite
  • Apache Modülü mod_setenvif
  • Apache Modülü mod_so
  • Apache Modülü mod_speling
  • Apache Modülü mod_ssl
  • Apache Modülü mod_status
  • Apache Modülü mod_substitute
  • Apache Modülü mod_suexec
  • Apache Modülü mod_unique_id
  • Apache Modülü mod_userdir
  • Apache Modülü mod_usertrack
  • Apache Modülü mod_version
  • Apache Modülü mod_vhost_alias

Geliştirici Belgeleri

  • Genel Bakış
  • Apache API Bilgileri
  • APR’de Bellek Ayırmada Hata Ayıklama
  • Apache 2.0 Belgeleri
  • Apache 2.0 Kullanıcı İşlevleri
  • Modüllerin Apache 1.3’ten Apache 2.0’a Dönüştürülmesi
  • Apache 2.0’da İsteklerin İşlenmesi
  • Apache 2.0’da Süzgeçler Nasıl Çalışır
  • 2.0'da Çok Evrelilik ile İlgili Konular

Terimler ve Dizin

  • Terimler
  • Modül Dizini
  • Yönerge Dizini
  • Hızlı Yönerge Kılavuzu

Copyright 2014 The Apache Software Foundation.
Apache License, Version 2.0 altında lisanslıdır.


URL Rewriting Guide - Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > Miscellaneous Documentation

URL Rewriting Guide

This document is obsolete. It has been replaced with a new Rewrite Guide.