Apache HTTP Sunucusu Sürüm 2.5

Bu belge, mod_rewrite
başvuru belgelerini tamamlar.
RewriteMap yönergesinin
kullanımını açıklar ve çeşitli RewriteMap türlerinin her birine örnekler sunar.
Giriş
int: Dahili İşlev
txt: Düz Metin Eşlemleri
rnd: Rastgeleleştirilmiş Düz Metin
dbm: DBM Adresleme Dosyası
prg: Harici Yeniden Yazma Programı
dbd veya fastdbd: SQL Sorgusu
Özet
RewriteMap yönergesi,
düzenli ifadelerle gerçekleştirilmesi çok karmaşık veya çok özel
olan yeniden yazma işlemlerini yapmak üzere
RewriteRule veya
RewriteCond yönergeleri
bağlamında çağrılabilecek harici bir işlev tanımlar. Bu aramanın
kaynağı, aşağıdaki bölümlerde listelenen türlerden herhangi biri
olabilir ve RewriteMap
başvuru belgelerinde numaralandırılmıştır.
RewriteMap
yönergesinin sözdizimi şöyledir:
RewriteMap EşlemAdı EşlemTürü:EşlemKaynağı
EşlemAdı, eşleme için atadığınız keyfi bir addır ve daha sonra yönergelerde kullanacaksınız. Argümanlar eşlemeye aşağıdaki sözdizimi ile iletilir:
${ EşlemAdı : AramaAnahtarı
}
${ EşlemAdı :
AramaAnahtarı | ÖntanımlıDeğer }
Böyle bir yapı oluştuğunda, EşlemAdı eşlemine başvurulur ve AramaAnahtarı aranır. Anahtar bulunursa eşlem-işlev yapısı DeğiştirmeDeğeri ile değiştirilir. Anahtar bulunamazsa ÖntanımlıDeğer ile veya hiçbir ÖntanımlıDeğer belirtilmemişse boş dizgeyle değiştirilir.
Örneğin, bir
RewriteMap şöyle
tanımlayabilirsiniz:
RewriteMap examplemap "txt:/path/to/file/map.txt"
Daha sonra bu eşlemi bir
RewriteRule
içinde şöyle kullanabilirsiniz:
RewriteRule "^/ex/(.*)" "${examplemap:$1}"
Eşlemde hiçbir şey bulunamazsa öntanımlı bir değer belirtilebilir:
RewriteRule "^/ex/(.*)" "${examplemap:$1|/not_found.html}"
RewriteMap yönergesi
<Directory>
bölümlerinde veya .htaccess dosyalarında kullanılamaz.
Eşlemi sunucu veya sanal konak bağlamında bildirmelisiniz. Eşlemi
oluşturduktan sonra, RewriteRule ve RewriteCond yönergelerinizde bu
kapsamlarda kullanabilirsiniz. Ancak bu kapsamlarda
bildirme yapamazsınız.
Aşağıdaki bölümler kullanılabilecek çeşitli EşlemTürü değerlerini açıklar ve her birine örnekler verir.
int EşlemTürü kullanıldığında, EşlemKaynağı
kullanılabilir dahili RewriteMap işlevlerinden biridir.
Modül yazarları, ap_register_rewrite_mapfunc API'sini
kullanarak ek dahili işlevler sağlayabilir. Öntanımlı olarak
sağlanan işlevler şunlardır:
Bu işlevlerden birini kullanmak için, int işlevine başvuran bir
RewriteMap oluşturun
ve ardından bunu RewriteRule yönergenizde
kullanın:
Bir URI'yi tamamen küçük harfli sürümüne yönlendir
RewriteMap lc int:tolower
RewriteRule "(.*)" "${lc:$1}" [R]
Burada sunulan örneğin yalnızca açıklama amaçlı olduğunu ve
bir öneri olmadığını lütfen unutmayın. URL'leri büyük/küçük harf
duyarsız yapmak istiyorsanız, bunun yerine
mod_speling kullanmayı düşünün.
txt EşlemTürü kullanıldığında, EşlemKaynağı satır
başına bir boşlukla ayrılmış anahtar/değer çifti içeren düz metin
eşlem dosyasının bir dosya sistemi yoludur. İsteğe bağlı olarak,
bir satır '#' karakteriyle başlayan bir açıklama içerebilir.
Geçerli bir metin yeniden yazma eşlem dosyası aşağıdaki sözdizimine sahip olacaktır:
# Açıklama satırı
EşleşenAnahtar DeğiştirmeDeğeri
EşleşenAnahtar DeğiştirmeDeğeri # açıklama
RewriteMap
çağrıldığında, argüman bir satırın ilk argümanında aranır ve
bulunursa değiştirme değeri döndürülür.
Örneğin, daha kolay hatırlanan URL'ler için ürün adlarını ürün kimliklerine çevirmek üzere aşağıdaki tarifi kullanarak bir eşlem dosyası kullanabiliriz:
Ürün-kimlik yapılandırması
RewriteMap product2id "txt:/etc/apache2/productmap.txt"
RewriteRule "^/product/(.*)" "/prods.php?id=${product2id:$1|NOTFOUND}" [PT]
Burada prods.php betiğinin, bir ürün arama
eşleminde bulunmadığında id=NOTFOUND argümanını
aldığında ne yapacağını bildiğini varsayıyoruz.
/etc/apache2/productmap.txt dosyası daha sonra
şunları içerir:
##
## productmap.txt - Ürün-Kimlik eşlem dosyası
##
television 993
stereo 198
fishingrod 043
basketball 418
telephone 328
Böylece, http://example.com/product/television
istendiğinde, RewriteRule
uygulanır ve istek dahili olarak
/prods.php?id=993 ile eşlenir.
.htaccess dosyasında
kullanmayı planlıyorsanız, herhangi bir şeyle eşleşebilmesi için
yeniden yazma kalıbından baştaki eğik çizgiyi kaldırmanız
gerekecektir:
RewriteRule "^product/(.*)" "/prods.php?id=${product2id:$1|NOTFOUND}" [PT]
Aranan anahtarlar, eşlem dosyasının mtime
(değiştirme zamanı) değişene veya httpd sunucusu yeniden
başlatılana kadar httpd tarafından önbelleğe alınır. Bu, birçok
istek tarafından çağrılan eşlemler için daha iyi performans
sağlar.
rnd EşlemTürü kullanıldığında, EşlemKaynağı her
satırı bir anahtar ve | ile ayrılmış bir veya daha
fazla değer içeren düz metin eşlem dosyasının bir dosya sistemi
yoludur. Anahtar eşleşirse bu değerlerden biri rastgele
seçilir.
Örneğin, ters vekil aracılığıyla birkaç arka uç sunucu arasında rastgele yük dengeleme sağlamak için aşağıdaki eşlem dosyasını ve yönergeleri kullanabilirsiniz. Resimler 'static' havuzundaki sunuculardan birine gönderilirken, diğer her şey 'dynamic' havuzuna gönderilir.
##
## map.txt -- yeniden yazma eşlem dosyası
##
static www1|www2|www3|www4
dynamic www5|www6
Yapılandırma yönergeleri
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]
Böylece, bir resim istendiğinde ve bu kurallardan ilki
eşleştiğinde, RewriteMap
eşlem dosyasında static dizgesini arar ve belirtilen
konak adlarından birini rastgele döndürür; bu daha sonra
RewriteRule hedefinde
kullanılır.
Sunuculardan birinin daha sık seçilmesini istiyorsanız (örneğin, sunuculardan birinin daha fazla belleği varsa ve daha fazla isteği işleyebiliyorsa), onu eşlem dosyasında daha fazla kez listeleyin.
static www1|www1|www2|www3|www4
dbm EşlemTürü kullanıldığında, EşlemKaynağı
eşlemede kullanılacak anahtar/değer çiftleri içeren bir DBM
veritabanı dosyasının dosya sistemi yoludur. Bu, txt
eşlemiyle tamamen aynı şekilde çalışır, ancak DBM dizinlendiğinden
ve metin dosyası dizinlenmediğinden çok daha hızlıdır. Bu, istenen
anahtara daha hızlı erişim sağlar.
İsteğe bağlı olarak belirli bir dbm türü belirtebilirsiniz:
RewriteMap examplemap "dbm=sdbm:/etc/apache/mapfile.dbm"
Tür sdbm, gdbm, ndbm
veya db olabilir. Ancak, Apache HTTP Sunucusu ile
sağlanan httxt2dbm
aracını kullanmanız önerilir; çünkü httpd'nin kendisi
oluşturulurken kullanılan doğru DBM kitaplığını kullanacaktır.
Bir dbm dosyası oluşturmak için önce txt
bölümünde açıklandığı gibi bir metin eşlem dosyası oluşturun.
Ardından httxt2dbm'yi çalıştırın:
$ httxt2dbm -i mapfile.txt -o mapfile.map
Daha sonra ortaya çıkan dosyaya RewriteMap yönergenizde
başvurabilirsiniz:
RewriteMap mapname "dbm:/etc/apache/mapfile.map"
Bazı dbm türleriyle, ortak bir temel adla birden fazla dosya
oluşturulduğunu unutmayın. Örneğin, mapfile.map.dir
ve mapfile.map.pag adlı iki dosyanız olabilir. Bu
normaldir ve RewriteMap
yönergenizde yalnızca mapfile.map temel adını
kullanmanız yeterlidir.
Aranan anahtarlar, eşlem dosyasının mtime
(değiştirme zamanı) değişene veya httpd sunucusu yeniden
başlatılana kadar httpd tarafından önbelleğe alınır. Bu, birçok
istek tarafından çağrılan eşlemler için daha iyi performans
sağlar.
prg EşlemTürü kullanıldığında, EşlemKaynağı
eşleme davranışını sağlayacak çalıştırılabilir bir programın
dosya sistemi yoludur. Bu, derlenmiş bir ikili dosya veya Python
ya da Perl gibi yorumlanan bir dilde yazılmış bir program
olabilir.
Bu program, Apache HTTP Sunucusu başlatıldığında bir kez
başlatılır ve ardından yeniden yazma motoruyla
STDIN ve STDOUT aracılığıyla
iletişim kurar. Her eşlem işlevi aramasında, anahtar programın
STDIN'ine yazılır ve ardından bir satırsonu karakteri
gelir. Program, STDIN'den bir satır okumalı (satırsonu
dahil) ve yanıtını STDOUT'a tek bir satırsonu ile
sonlandırılmış satır olarak yazmalıdır. Anahtarlar hiçbir zaman
satırsonu karakteri içermez; satırsonu içeren bir anahtarla
karşılaşılırsa arama başarısız olur.
Karşılık gelen bir arama değeri yoksa, eşlem programı bunu
belirtmek için dört karakterlik "NULL" dizgesini
döndürmelidir. Bu karşılaştırmanın büyük/küçük harf duyarsız
olduğunu unutmayın; "null", "Null" vb. de başarısız arama olarak
değerlendirilir. Sonuç olarak, bir eşleme programının eşlenen
değer olarak "NULL" birebir dizgesini döndürmesi mümkün
değildir.
Programın STDERR'si httpd üst sürecinden
miras alınır; bu nedenle programın STDERR'ye
yazdığı her şey httpd'nin kendi hata çıktısıyla (genellikle
ErrorLog) aynı yere
gider.
Harici yeniden yazma programları, RewriteEngine on
olarak ayarlanmamış bir bağlamda tanımlanmışlarsa
başlatılmaz.
Öntanımlı olarak, harici yeniden yazma programları httpd'yi
başlatan kullanıcı:grup olarak çalıştırılır. Bu, UNIX
sistemlerinde RewriteMap
yönergesine üçüncü argüman olarak
kullanıcıadı:grupadı biçiminde kullanıcı adı ve
grup adı geçirilerek değiştirilebilir.
Bu özellik, programla güvenilir iletişim için gerekli olan
rewrite-map mutex'ini kullanır. Mutex mekanizması
ve kilit dosyası Mutex
yönergesiyle yapılandırılabilir.
Burada, bir istek URI'sindeki tüm tireleri alt çizgilerle değiştirecek basit bir örnek gösterilmektedir.
Yeniden yazma yapılandırması
RewriteMap d2u "prg:/www/bin/dash2under.py" apache:apache
RewriteRule "-" "${d2u:%{REQUEST_URI}}"
dash2under.py
#!/usr/bin/env python3
import sys
for line in sys.stdin:
print(line.strip().replace('-', '_'), flush=True)
print() işlevine
flush=True geçirilerek yapılır. Arabelleğe alınmış G/Ç,
httpd'nin çıktıyı beklemesine neden olur ve askıda kalmasına
yol açar.SIGTERM
gönderilir; 3 saniye içinde çıkmazsa SIGKILL
gönderilir.dbd veya fastdbd EşlemTürü
kullanıldığında, EşlemKaynağı tek bir argüman alan ve tek bir
değer döndüren bir SQL SELECT deyimidir.
Bu deyimin yürütülmesi için mod_dbd modülünün
doğru veritabanına işaret edecek şekilde yapılandırılması
gerekir.
Bu EşlemTürünün iki biçimi vardır. dbd EşlemTürü
kullanmak, sorgunun her eşlem isteğinde yürütülmesine neden
olurken, fastdbd kullanmak veritabanı aramalarını
dahili olarak önbelleğe alır. Böylece fastdbd daha
verimli ve dolayısıyla daha hızlı olsa da, sunucu yeniden
başlatılana kadar veritabanındaki değişiklikleri almaz.
Bir sorgu birden fazla satır döndürürse, sonuç kümesinden rastgele bir satır kullanılır.
RewriteMap myquery "fastdbd:SELECT destination FROM rewrite WHERE source = %s"
Sorgu adı veritabanı sürücüsüne bir SQL hazır deyimi için etiket olarak iletilir ve bu nedenle veritabanınız için gereken tüm kuralları (büyük/küçük harf duyarlılığı gibi) izlemelidir.
RewriteMap yönergesi
birden fazla kez kullanılabilir. Her eşleme-işlevi için yeniden
yazma eşlem dosyasını bildirmek üzere bir
RewriteMap yönergesi
kullanın.
Dizin başına bağlamda (.htaccess dosyaları veya
<Directory>
blokları) bir eşlem bildirmeniz mümkün olmasa da,
bu eşlemi dizin başına bağlamda kullanmanız
mümkündür.