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

Apache mod_rewrite'a Giriş

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

Bu belge, mod_rewrite başvuru belgelerini tamamlar. mod_rewrite kullanımı için gerekli temel kavramları açıklar. Diğer belgeler daha ayrıntılıdır, ancak bu belge başlangıç yapmak isteyenlere yardımcı olmalıdır.

Ayrıca bakınız:

top

Giriş

Apache modülü mod_rewrite, URL değiştirmeleri yapmanın bir yolunu sunan çok güçlü ve karmaşık bir modüldür. Bununla ihtiyaç duyabileceğiniz neredeyse her türlü URL yeniden yazma işlemini gerçekleştirebilirsiniz. Ancak biraz karmaşıktır ve yeni başlayanlar için korkutucu olabilir. Yeniden yazma kurallarını, gerçekte ne yaptıklarını anlamadan sihirli formüller olarak ele alma eğilimi de vardır.

Bu belge, takip eden içeriğin körü körüne kopyalanmak yerine anlaşılması için yeterli arka plan bilgisi sağlamaya çalışmaktadır.

Birçok yaygın URL değiştirme görevinin mod_rewrite modülünün tüm gücünü ve karmaşıklığını gerektirmediğini unutmayın. Basit görevler için mod_alias modülüne ve URL'lerin dosya sistemine eşlenmesi belgelerine bakın.

Son olarak, devam etmeden önce mod_rewrite modülünün günlük seviyesini LogLevel yönergesini kullanarak izleme seviyelerinden birine yapılandırmayı unutmayın. Bu, bunaltıcı miktarda bilgi sağlasa da, mod_rewrite yapılandırma sorunlarını ayıklamada vazgeçilmezdir; çünkü her kuralın nasıl işlendiğini tam olarak gösterir.

top

Düzenli İfadeler

mod_rewrite, Perl Uyumlu Düzenli İfade sözvarlığını kullanır. Bu belgede, düzenli ifadelere ayrıntılı bir başvuru sağlamaya çalışmıyoruz. Bunun için PCRE kılavuz sayfalarını, Perl düzenli ifade kılavuz sayfasını ve Jeffrey Friedl'ın Mastering Regular Expressions kitabını (üçüncü baskısı 2006'dandır, ancak düzenli ifade sözdizimi temelde değişmemiştir ve bu konu hakkında kesin başvuru kaynağı olmaya devam etmektedir) öneririz.

Bu belgede, bunaltıcı olmadan başlamanıza yetecek kadar düzenli ifade sözvarlığı sağlamaya çalışıyoruz; böylece RewriteRule kuralları sihirli formüller yerine bilimsel formüller olacaktır.

Düzenli ifade sözvarlığı

Düzenli ifadeler ve RewriteRule kuralları yazmak için ihtiyaç duyacağınız asgari yapı taşları aşağıdadır. Bunlar kesinlikle tam bir düzenli ifade sözvarlığını temsil etmez, ancak başlamak ve temel düzenli ifadeleri okumak için iyi bir yerdir.

Karakter Anlam Örnek
. Herhangi bir tek karakterle eşleşir c.t; cat, cot, cut vb. ile eşleşir
+ Önceki eşleşmeyi bir veya daha fazla kez tekrarlar a+; a, aa, aaa vb. ile eşleşir
* Önceki eşleşmeyi sıfır veya daha fazla kez tekrarlar a*; a+ ile aynı şeylerle eşleşir ancak ayrıca boş dizgeyle de eşleşir
? Eşleşmeyi isteğe bağlı yapar colou?r; color ve colour ile eşleşir
\ Sonraki karakteri kodlar \.; yukarıda açıklandığı gibi herhangi bir tek karakter yerine . (nokta) ile eşleşir
^ Çapa olarak adlandırılır, dizgenin başlangıcıyla eşleşir ^a; a ile başlayan bir dizgeyle eşleşir
$ Diğer çapa, dizgenin sonuyla eşleşir a$; a ile biten bir dizgeyle eşleşir
( ) Birkaç karakteri tek bir birime gruplar ve geri başvuruda kullanılmak üzere bir eşleşme yakalar (ab)+; ababab ile eşleşir - yani + gruba uygulanır. Geri başvurular hakkında daha fazla bilgi için aşağıya bakın
[ ] Bir karakter sınıfı - karakterlerden biriyle eşleşir c[uoa]t; cut, cot veya cat ile eşleşir
[^ ] Olumsuz karakter sınıfı - belirtilmeyen herhangi bir karakterle eşleşir c[^/]t; cat veya c=t ile eşleşir ancak c/t ile eşleşmez

mod_rewrite modülünde ! karakteri düzenli ifadeyi olumsuzlamak için kullanılabilir. Yani, bir dizge yalnızca ifadenin geri kalanıyla eşleşmezse eşleşmiş sayılır.

Düzenli İfade Geri Başvuru Kullanılabilirliği

Burada hatırlanması gereken önemli bir şey vardır: Kalıp'ta veya CondPattern'lerden birinde parantez kullandığınızda, $N ve %N dizgeleriyle kullanılabilecek dahili geri başvurular oluşturulur (aşağıya bakın). Bunlar, bir RewriteRule yönergesinin Değiştirme parametresini veya bir RewriteCond yönergesinin SınamaDizgesi parametresini oluşturmak için kullanılabilir.

RewriteRule kalıplarındaki yakalamalar (sezgiye aykırı olarak) kendinden önceki tüm RewriteCond yönergelerinde kullanılabilir; çünkü RewriteRule ifadesi bireysel koşullardan önce değerlendirilir.

Şekil 1, geri başvuruların genişletilmek üzere hangi konumlara aktarıldığını ve RewriteRule, RewriteCond eşleştirme akışını gösterir. Sonraki bölümlerde bu geri başvuruların nasıl kullanılacağını inceleyeceğiz; bu nedenle ilk başta biraz yabancı görünürse endişelenmeyin.

RewriteRule ve RewriteCond eşleştirme akışı
Şekil 1: Bir kural boyunca geri başvuru akışı.
Bu örnekte, /test/1234 için bir istek /admin.foo?page=test&id=1234&host=admin.example.com olarak dönüştürülecektir.

top

RewriteRule Temelleri

Bir RewriteRule, boşluklarla ayrılmış üç argümandan oluşur. Argümanlar şunlardır:

  1. Kalıp: hangi gelen URL'lerin kuraldan etkileneceği;
  2. Değiştirme: eşleşen isteklerin nereye gönderileceği;
  3. [bayraklar]: yeniden yazılmış isteği etkileyen seçenekler.

Kalıp bir düzenli ifadedir. İlk başta (ilk yeniden yazma kuralı için veya bir değiştirme gerçekleşene kadar) gelen isteğin URL yoluyla (konak adından sonra ancak sorgu dizgesinin başlangıcını gösteren soru işaretinden önceki kısım) veya dizin başına bağlamda kuralın tanımlandığı dizine göre isteğin yoluyla eşleştirilir. Bir değiştirme gerçekleştikten sonra izleyen kurallar değiştirilen değerle eşleştirilir.

RewriteRule yönergesinin sözdizimi
Şekil 2: RewriteRule yönergesinin sözdizimi.

Değiştirme kendisi üç şeyden biri olabilir:

1. Bir kaynağa tam dosya sistemi yolu
RewriteRule "^/games" "/usr/local/games/web/puzzles.html"

Bu, Alias yönergesine benzer şekilde bir isteği dosya sistemindeki keyfi bir konuma eşler.

2. Bir kaynağa web yolu
RewriteRule "^/games$" "/puzzles.html"

DocumentRoot /usr/local/apache2/htdocs olarak ayarlanmışsa, bu yönerge http://example.com/games isteklerini /usr/local/apache2/htdocs/puzzles.html yoluna eşler.

3. Mutlak bir URL
RewriteRule "^/product/view$" "http://site2.example.com/seeproduct.html" [R]

Bu, istemciye belirtilen URL için yeni bir istek yapmasını söyler.

1 ve 2'nin sözdiziminin tamamen aynı olduğunu unutmayın. Aralarındaki fark, 1 durumunda hedef yolun en üst düzeyinin (yani /usr/) dosya sisteminde mevcut olması, 2 durumunda ise mevcut olmamasıdır (yani dosya sisteminde kök düzeyinde bir /bar/ dizini yoktur).

Değiştirme, Kalıp tarafından eşleşen gelen URL yolunun bölümlerine geri başvurular da içerebilir. Şunu ele alalım:

RewriteRule "^/product/(.*)/view$" "/var/web/productdb/$1"

$1 değişkeni, Kalıp içindeki parantez içindeki ifadeyle eşleşen metinle değiştirilir. Örneğin, http://example.com/product/r14df/view isteği /var/web/productdb/r14df yoluna eşlenir.

Parantez içinde birden fazla ifade varsa, bunlar sırasıyla $1, $2, $3 ve sonraki değişkenlerde kullanılabilir.

top

Yeniden Yazma Bayrakları

Bir RewriteRule yönergesinin davranışı, kuralın sonuna bir veya daha fazla bayrak uygulanarak değiştirilebilir. Örneğin, bir kuralın eşleştirme davranışı [NC] bayrağı uygulanarak büyük/küçük harf duyarsız yapılabilir:

RewriteRule "^puppy.html" "smalldog.html" [NC]

Kullanılabilir bayraklar, anlamları ve örnekleri hakkında daha fazla ayrıntı için Yeniden Yazma Bayrakları belgesine bakın.

top

Yeniden Yazma Koşulları

Ardından gelen RewriteRule yönergesine tabi olacak istek türlerini kısıtlamak için bir veya daha fazla RewriteCond yönergesi kullanılabilir. İlk argüman isteğin bir özelliğini tanımlayan bir değişken, ikinci argüman değişkenle eşleşmesi gereken bir düzenli ifade ve üçüncü isteğe bağlı argüman eşleşmenin nasıl değerlendirileceğini değiştiren bayrakların bir listesidir.

RewriteCond yönergesinin sözdizimi
Şekil 3: RewriteCond yönergesinin sözdizimi

Örneğin, belirli bir IP aralığından gelen tüm istekleri farklı bir sunucuya göndermek için şunu kullanabilirsiniz:

RewriteCond "%{REMOTE_ADDR}" "^10\.2\."
RewriteRule "(.*)"           "http://intranet.example.com$1"

Birden fazla RewriteCond belirtildiğinde, RewriteRule yönergesinin uygulanması için hepsinin eşleşmesi gerekir. Örneğin, sorgu dizgelerinde "hack" sözcüğünü içeren istekleri reddetmek, ancak "go" sözcüğünü içeren bir çerez taşıyanları hariç tutmak için şunu kullanabilirsiniz:

RewriteCond "%{QUERY_STRING}" "hack"
RewriteCond "%{HTTP_COOKIE}"  !go
RewriteRule "."               "-"   [F]

Ünlem işaretinin olumsuz bir eşleşme belirttiğine dikkat edin; kural yalnızca çerez "go" içermiyorsa uygulanır.

RewriteCond yönergelerindeki düzenli ifadelerdeki eşleşmeler, RewriteRule yönergesindeki Değiştirme'nin bir parçası olarak %1, %2 vb. değişkenler kullanılarak kullanılabilir. Örneğin, şu kural siteye erişmek için kullanılan konak adına bağlı olarak isteği farklı bir dizine yönlendirecektir:

RewriteCond "%{HTTP_HOST}" "(.*)"
RewriteRule "^/(.*)"       "/sites/%1/$1"

İstek http://example.com/foo/bar için ise %1 değeri example.com ve $1 değeri foo/bar olacaktır.

top

Yeniden yazma eşlemleri

RewriteMap yönergesi, tabir yerindeyse yeniden yazma işleminizi yapacak harici bir işlev çağırmanın bir yolunu sunar. Bu, RewriteMap ek belgelerinde daha ayrıntılı olarak tartışılmaktadır.

top

.htaccess dosyaları

Yeniden yazma genellikle ana sunucu yapılandırma ayarında (herhangi bir <Directory> bölümünün dışında) veya <VirtualHost> kapsayıcıları içinde yapılandırılır. Bu, yeniden yazma yapmanın en kolay yoludur ve önerilir. Ancak yeniden yazmayı <Directory> bölümlerinde veya .htaccess dosyalarında bazı ek karmaşıklık pahasına yapmak mümkündür. Bu tekniğe dizin başına yeniden yazma denir.

Sunucu başına yeniden yazmadan temel fark, .htaccess dosyasını içeren dizinin yol önekinin, RewriteRule yönergesinde eşleştirmeden önce çıkarılmasıdır. Ayrıca, isteğin düzgün şekilde eşlenmesini sağlamak için RewriteBase kullanılmalıdır.

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