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

Apache mod_rewrite Teknik Ayrıntıları

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

Bu belge, mod_rewrite ve URL eşleştirmesinin bazı teknik ayrıntılarını tartışır.

Ayrıca bakınız:

top

API Aşamaları

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.

top

Kural Kümesi İşleme

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

RewriteRule ve RewriteCond eşleştirme akışı
Ş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.

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