Apache HTTP Sunucusu Sürüm 2.5

Bu belge, mod_rewrite
başvuru belgelerini tamamlar.
Devingen olarak yapılandırılmış sanal konaklar oluşturmak için
mod_rewrite modülünü nasıl kullanabileceğinizi
açıklar.
mod_rewrite, sanal konakları
yapılandırmanın genellikle en iyi yolu değildir. mod_rewrite'a
başvurmadan önce alternatifleri
değerlendirmelisiniz. Ayrıca "mod_rewrite
kullanmaktan nasıl kaçınılır" belgesine de bakın.
Keyfi Konak Adları için Sanal Konaklar
mod_rewrite
Kullanılarak Devingen Sanal Konaklar
Ayrı Bir Sanal Konak Yapılandırma Dosyası KullanımıAlan adımızda çözümlenen her konak adı için, yeni VirtualHost bölümleri oluşturmak zorunda kalmadan otomatik olarak bir sanal konak oluşturmak istiyoruz.
Bu tarifle, her kullanıcı için
SITE.example.com konak adını
kullanacağımızı ve içeriklerini
/home/SITE/www dizininden
sunacağımızı varsayıyoruz. Ancak
www.example.com'u bu eşlemeden hariç tutmak
istiyoruz.
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond ${lowercase:%{HTTP_HOST}} ^([^.]+)\.example\.com$
RewriteRule ^(.*) /home/%1/www$1
Kullanılan konak adlarının tümünün küçük harf olmasını sağlamak
için dahili tolower RewriteMap yönergesi kullanılır;
böylece oluşturulması gereken dizin yapısında belirsizlik olmaz.
Bir RewriteCond
içinde kullanılan parantezler %1, %2 vb.
geri başvurulara yakalanırken, RewriteRule içinde kullanılan
parantezler $1, $2 vb. geri başvurulara
yakalanır.
İlk RewriteCond, konak adının www. ile
başlayıp başlamadığını kontrol eder ve başlıyorsa yeniden yazma
atlanır.
Bu belgede tartışılan birçok teknikte olduğu gibi, bu görevi
gerçekleştirmek için mod_rewrite gerçekten en iyi
yol değildir. Bunun yerine, statik dosyaların sunulmasının ötesinde
devingen içerik ve Alias çözümlemesi gibi şeyleri çok daha zarif bir
şekilde ele alacak olan mod_vhost_alias kullanmayı
düşünmelisiniz.
mod_rewrite
Kullanılarak Devingen Sanal Konaklar ¶Bu httpd.conf alıntısı, ilk örnekle aynı şeyi yapar. İlk yarısı
yukarıdaki karşılık gelen bölüme çok benzer; ancak geriye dönük
uyumluluk ve mod_rewrite bölümünün düzgün
çalışması için gereken bazı değişiklikler yapılmıştır; ikinci
yarısı ise mod_rewrite modülünü asıl işi yapacak
şekilde yapılandırır.
mod_rewrite, diğer URI çeviri modüllerinden
(örneğin mod_alias) önce çalıştığından,
mod_rewrite modülüne bu modüller tarafından
işlenecek URL'leri açıkça yok sayması söylenmelidir. Ve bu
kurallar aksi takdirde ScriptAlias yönergelerini
atlayacağından, mod_rewrite modülünün bu
eşlemeleri açıkça uygulaması gerekir.
# Konak adını Host: başlığından al
UseCanonicalName Off
# bölünebilir günlükler
LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon
<Directory "/www/hosts">
# ScriptAlias'ın yaptığı gibi CGI yürütmesini
# zorlayamadığımız için burada ExecCGI gereklidir
Options FollowSymLinks ExecCGI
</Directory>
RewriteEngine On
# bir Host: başlığından türetilen ServerName herhangi bir durumda olabilir
RewriteMap lowercase "int:tolower"
## önce normal belgeleri ele al:
# Alias /icons/ çalışmasına izin ver - diğer takma adlar için tekrarla
RewriteCond "%{REQUEST_URI}" "!^/icons/"
# CGI'lerin çalışmasına izin ver
RewriteCond "%{REQUEST_URI}" "!^/cgi-bin/"
# sihri yap
RewriteRule "^/(.*)$" "/www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1"
## şimdi CGI'lerle ilgilen - bir işleyici zorlamalıyız
RewriteCond "%{REQUEST_URI}" "^/cgi-bin/"
RewriteRule "^/(.*)$" "/www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1" [H=cgi-script]
Bu düzenleme, sanal konaktan belge köküne çeviriyi ayrı bir
yapılandırma dosyasından çözmek için daha gelişmiş
mod_rewrite özelliklerini kullanır. Bu daha fazla
esneklik sağlar ancak daha karmaşık yapılandırma gerektirir.
vhost.map dosyası şöyle görünmelidir:
customer-1.example.com /www/customers/1
customer-2.example.com /www/customers/2
# ...
customer-N.example.com /www/customers/N
httpd.conf dosyası şunları içermelidir:
RewriteEngine on
RewriteMap lowercase "int:tolower"
# eşlem dosyasını tanımla
RewriteMap vhost "txt:/www/conf/vhost.map"
# takma adlarla yukarıdaki gibi ilgilen
RewriteCond "%{REQUEST_URI}" "!^/icons/"
RewriteCond "%{REQUEST_URI}" "!^/cgi-bin/"
RewriteCond "${lowercase:%{SERVER_NAME}}" "^(.+)$"
# dosya tabanlı yeniden eşlemeyi yap
RewriteCond "${vhost:%1}" "^(/.*)$"
RewriteRule "^/(.*)$" "%1/docs/$1"
RewriteCond "%{REQUEST_URI}" "^/cgi-bin/"
RewriteCond "${lowercase:%{SERVER_NAME}}" "^(.+)$"
RewriteCond "${vhost:%1}" "^(/.*)$"
RewriteRule "^/cgi-bin/(.*)$" "%1/cgi-bin/$1" [H=cgi-script]