Apache HTTP Sunucusu Sürüm 2.5

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.
Giriş
Düzenli İfadeler
RewriteRule Temelleri
Yeniden Yazma Bayrakları
Yeniden Yazma Koşulları
Yeniden yazma eşlemleri
.htaccess dosyaları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.
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 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.
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.

Ş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.
Bir RewriteRule,
boşluklarla ayrılmış üç argümandan oluşur. Argümanlar şunlardır:
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.

Şekil 2: RewriteRule yönergesinin sözdizimi.
Değiştirme kendisi üç şeyden biri olabilir:
RewriteRule "^/games" "/usr/local/games/web/puzzles.html"
Bu, Alias yönergesine
benzer şekilde bir isteği dosya sistemindeki keyfi bir konuma
eşler.
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.
RewriteRule "^/product/view$" "http://site2.example.com/seeproduct.html" [R]
Bu, istemciye belirtilen URL için yeni bir istek yapmasını söyler.
/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.
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.
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.

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