Apache HTTP Sunucusu Sürüm 2.5

Bu belge, mod_rewrite ve URL eşleştirmesinin bazı
teknik ayrıntılarını tartışır.
Apache HTTP Sunucusu, istekleri birkaç aşamada işler. Bu aşamaların her birinde, istek yaşam döngüsünün o bölümünü işlemek üzere bir veya daha fazla modül çağrılabilir. Aşamalar URL-dosyaadı çevirisi, kimlik doğrulama, yetkilendirme, içerik ve günlükleme gibi şeyleri içerir. (Bu kapsamlı bir liste değildir.)
mod_rewrite, URL'lerin nasıl yeniden
yazılabileceğini etkilemek için bu aşamalardan ikisinde (veya
sıklıkla çağrıldıkları şekliyle "kancalarda") çalışır.
İlk olarak, HTTP isteği okunduktan sonra ancak herhangi bir
yetkilendirme başlamadan önce gerçekleşen URL-dosyaadı çevirisi
kancasını kullanır. İkinci olarak, yetkilendirme aşamalarından
sonra ve dizin başına yapılandırma dosyaları
(.htaccess dosyaları) okunduktan sonra ancak içerik
işleyicisi çağrılmadan önce gerçekleşen Düzeltme (Fixup)
kancasını kullanır.
Bir istek geldikten ve karşılık gelen sunucu veya sanal konak
belirlendikten sonra, yeniden yazma motoru sunucu başına
yapılandırmada görünen mod_rewrite yönergelerini
işlemeye başlar. (Yani ana sunucu yapılandırma dosyası ve
<Virtualhost>
bölümleri.) Bu, URL-dosyaadı aşamasında gerçekleşir.
Birkaç adım sonra, son veri dizinleri bulunduktan sonra dizin
başına yapılandırma yönergeleri (.htaccess dosyaları
ve <Directory>
blokları) uygulanır. Bu, Düzeltme aşamasında gerçekleşir.
Bu durumların her birinde mod_rewrite,
REQUEST_URI'yi ya yeni bir URL'ye ya da bir dosya
adına yeniden yazar.
Dizin başına bağlamda (yani .htaccess dosyaları ve
Directory blokları içinde) bu kurallar, bir URL
zaten bir dosya adına çevrilmiş olduktan sonra uygulanır. Bu
nedenle, mod_rewrite modülünün RewriteRule yönergelerini
başlangıçta karşılaştırdığı URL yolu, çevrilen dosya adının tam
dosya sistemi yolu olup geçerli dizin yolu (sondaki eğik çizgi
dahil) öndeki kısımdan çıkarılmıştır.
Göstermek gerekirse: Kurallar /var/www/foo/.htaccess içindeyse ve /foo/bar/baz isteği işleniyorsa, ^bar/baz$ gibi bir ifade eşleşecektir.
Dizin başına bağlamda bir değiştirme yapılırsa, yeni URL ile
yeni bir dahili alt istek verilir ve bu da istek aşamalarının
işlenmesini yeniden başlatır. Değiştirme göreli bir yolsa,
RewriteBase yönergesi
değiştirmenin önüne eklenen URL yolu önekini belirler. Dizin
başına bağlamda, döngüyü önlemek için sonunda (gelecekteki bir
dizin başına yeniden yazma işleme "turunda") değiştirme yapmayan
kurallar oluşturmaya dikkat edilmelidir. (Bu sorunun daha ayrıntılı
tartışması için RewriteLooping
sayfasına bakın.)
Dizin başına bağlamda URL'nin bu ek işlenmesi nedeniyle, bu bağlamda yeniden yazma kurallarınızı farklı şekilde oluşturmaya dikkat etmeniz gerekecektir. Özellikle, baştaki dizin yolunun yeniden yazma kurallarınızın göreceği URL'den çıkarılacağını unutmayın. Daha fazla açıklama için aşağıdaki örneklere bakın.
| Kuralın konumu | Kural |
|---|---|
| VirtualHost bölümü | RewriteRule "^/images/(.+)\.jpg" "/images/$1.gif" |
| Belge kökündeki .htaccess dosyası | RewriteRule "^images/(.+)\.jpg" "images/$1.gif" |
| images dizinindeki .htaccess dosyası | RewriteRule "^(.+)\.jpg" "$1.gif" |
mod_rewrite modülünün farklı bağlamlarda
URL'leri nasıl değiştirdiği hakkında daha fazla bilgi için,
yeniden yazma sırasında oluşturulan günlük kayıtlarına
başvurmalısınız.
Şimdi mod_rewrite bu iki API aşamasında
tetiklendiğinde, yapılandırılmış kural kümelerini yapılandırma
yapısından okur (bu yapı sunucu başına bağlam için başlangıçta
veya dizin başına bağlam için Apache çekirdeğinin dizin
yürüyüşü sırasında oluşturulmuştur). Ardından URL yeniden
yazma motoru içerilen kural kümesiyle (bir veya daha fazla kural
ve bunların koşulları birlikte) başlatılır. URL yeniden yazma
motorunun çalışması her iki yapılandırma bağlamı için de
tamamen aynıdır. Yalnızca nihai sonuç işleme farklıdır.
Kural kümesindeki kuralların sırası önemlidir; çünkü yeniden
yazma motoru bunları özel (ve çok belirgin olmayan) bir sırada
işler. Kural şudur: Yeniden yazma motoru kural kümesini kural
kural (RewriteRule
yönergeleri) döner ve belirli bir kural eşleştiğinde isteğe
bağlı olarak karşılık gelen koşulları (RewriteCond
yönergeleri) döner. Tarihsel nedenlerle koşullar önce verilir
ve bu nedenle kontrol akışı biraz dolambaçlıdır. Daha fazla
ayrıntı için Şekil 1'e bakın.

Şekil 1:Yeniden yazma kural kümesindeki kontrol akışı
İlk olarak URL, her kuralın Kalıp'ıyla eşleştirilir.
Başarısız olursa mod_rewrite bu kuralı hemen
işlemeyi durdurur ve sonraki kuralla devam eder. Kalıp
eşleşirse mod_rewrite karşılık gelen kural
koşullarını (yapılandırmada RewriteRule'un hemen üstünde görünen
RewriteCond yönergeleri) arar. Hiçbiri yoksa, URL'yi
Değiştirme dizgesinden oluşturulan yeni bir değerle
değiştirir ve kural döngüsüne devam eder. Ancak koşullar
varsa, listelenme sırasına göre bunları işlemek için bir iç
döngü başlatır. Koşullar için mantık farklıdır: geçerli URL'ye
karşı bir kalıp eşleştirmeyiz. Bunun yerine, önce değişkenleri,
geri başvuruları, eşlem aramalarını vb. genişleterek
bir SınamaDizgesi oluştururuz ve ardından
KoşulKalıbı'nı bununla eşleştirmeye çalışırız. Kalıp
eşleşmezse, koşulların tamamı ve karşılık gelen kural başarısız
olur. Kalıp eşleşirse, daha fazla koşul kalmayana kadar bir
sonraki koşul işlenir. Tüm koşullar eşleşirse, URL'nin
Değiştirme ile değiştirilmesiyle işleme devam
eder.