<-
Apache > HTTP Sunucusu > Belgeleme > Sürüm 2.5 > Rewrite

RewriteMap Kullanımı

Mevcut Diller:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

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.

Bu örneklerin birçoğunun sizin sunucu yapılandırmanızda değişiklik yapılmadan çalışmayacağını unutmayın; bu nedenle örnekleri yapılandırmanıza kopyalayıp yapıştırmak yerine anlamanız önemlidir.

Ayrıca bakınız:

top

Giriş

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}"

Dizin başına ve .htaccess bağlamı

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.

top

int: Dahili İşlev

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.

top

txt: Düz Metin Eşlemleri

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:

Ürün-kimlik eşlem dosyası

##
## 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.

Not: .htaccess dosyaları

Verilen örnek sunucu veya sanal konak kapsamında kullanılmak üzere hazırlanmıştır. Bunu bir .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]

Önbelleğe alınmış aramalar

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.

top

rnd: Rastgeleleştirilmiş Düz Metin

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.

Yeniden yazma eşlem dosyası

##
## 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

top

dbm: DBM Adresleme Dosyası

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.

Önbelleğe alınmış aramalar

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.

top

prg: Harici Yeniden Yazma Programı

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)

Dikkat!

  • Yeniden yazma eşlem programınızı olabildiğince basit tutun. Program askıda kalırsa, httpd'nin eşlemden yanıt beklerken süresiz olarak beklemesine neden olur ve bu da httpd'nin isteklere yanıt vermesini durduracaktır.
  • Programınızda arabelleğe almayı kapattığınızdan emin olun. Yukarıdaki Python örneğinde bu, 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.
  • Sunucu başlangıcında başlatılan programın yalnızca bir kopyası olduğunu unutmayın. Tüm isteklerin bu tek darboğazdan geçmesi gerekecektir. Birçok istek bu süreçten geçmek zorundaysa veya betiğin kendisi çok yavaşsa bu önemli yavaşlamalara neden olabilir.
  • Eşleme programı sonlanırsa otomatik olarak yeniden başlatılmaz. Sonraki aramalar, sunucu yeniden başlatılana kadar başarısız olur.
  • Eşleme programı, ilgili yapılandırma yönergelerinin değişip değişmediğine bakılmaksızın herhangi bir sunucu yeniden başlatmasında (zarif veya başka türlü) her zaman sonlandırılır ve yeniden başlatılır. Kapatmada programa SIGTERM gönderilir; 3 saniye içinde çıkmazsa SIGKILL gönderilir.
top

dbd veya fastdbd: SQL Sorgusu

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.

Örnek

RewriteMap myquery "fastdbd:SELECT destination FROM rewrite WHERE source = %s"

Not

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.

top

Özet

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.

Mevcut Diller:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn