IIS Rewrite Modül Kullanımı 1113511135 okunma
Günümüzde IIS sunucuları için rewrite modülü benzersiz bir önem taşıyor. Çünkü IIS için rewrite modülü şu iki eylemi yürütmek için kullanılır:
Rewrite: URL aynı kalır ancak içerik başka bir yerden yüklenir
Redirect: Kullanıcıyı yeni bir URL'ye yönlendirir.
Her ikisi de eylemin tetiklenip tetiklenmeyeceğini belirlemek için aynı kural ve koşulları kullanır ve sizlere bunlardan biraz bahsedeceğim.
< rule name="Redirect to blog" >
< match url="programlama$" / >
< action type="Redirect" url="http://www.bilisimlife.net" / >
< /rule >
Bu kural, istenen yolun "tam olarak" programlama olup olmadığını kontrol eder (bilisimlife.net/programlama adresinde olduğu gibi) ve eğer durum böyle ise, kullanıcıyı anasayfa adresine yönlendirir.
Şimdi IIS sunucusunun faydalarına gelelim. Bu kuralı biraz değiştirelim.
< rule name="Redirect to main page" >
< match url="(.*)$" / >
< action type="Redirect" url="https://{R:1}.com" / >
< / rule >
Bütün olay "match url" bölümünde bitiyor aslında.
Bu kısmı detaylarıyla açıklayayım.
Kullanılan pattern: (.*)$
Ilk karakter olan , testin URL yolunun başında başlayacağı anlamına gelir. Yanındaki sıra (. *) ise herhangi bir karakteri yakalayacaktır. Özel bir ifade belirtmemize gerek yok. Son karakter $, testin URL yolunun sonunda durduğu anlamına gelir.
Bununla ilgili kısa bir özet geçeceğim.
Not: Kural yalnızca URL yoluna uygulanır
Şimdi, yönlendirme için yaptığımız testte yakalanan değeri kullanmak istiyoruz. Burada yardımımıza { R:1 } geliyor. { R:1 }, test sırasında (.*) dizisinde yakalanan her şeyi içerecektir. Tüm giriş dizesini içerdiğinden, { R:0 } 'ı da kullanabiliriz.
Örneği netleştirelim. Bu kurala ilişkin adresimiz bilisimlife.net/programlama olsun. {R:1} buradaki bilisimlife adresini içerecektir.
Bu, eylemle birleştirildiğinde, http://bilisimlife.net/programlama adresine ulaşan bir kullanıcının nihayetinde https://bilisimlife.net adresine yönlendirileceği anlamına gelir.
{ R:0 } - www.bilisimlife.net
{ R:1 } - www.
{ R:2 } - bilisimlife.net
SEO ile ilgii bir ilgisi var mı?
Elbette var. Bunu yapmak isteyeceğiniz bazı yaygın senaryolar illa ki oluyor. Bir web sitesi taşıma işlemi çok iyi bir örnektir. Herhangi bir iyi SEO şirketi, web sitenizi ve URL yapınızı değiştirdiğinizde değerli arama motoru sıralamanızı kaybetmek istemediğinizi, eski URL yapısından yeni URL yapısına bir 301 yönlendirmesi oluşturmanızı isteyecektir. Öte yandan sitenin https olarak açılmasını isteye de bilirler. Bunun için IIS http girişi algılayıp https tarafına yönlendirebilir. Buna bağlı olarak tüm URL adreslerinin WWW ile kullanması gerekli diye de bir istek olabilir. Bu durumlarda, ortak bir rewrite kuralı aşağıdaki gibi olur:
< rule name="rserit forward" stopProcessing="true" >
< match url="recep-serit(.*)" / >
< action type="Redirect" url="https:///www.about.me/rserit" appendQueryString="true" / >
< / rule >
Açıktır ki sitenize olan isteklerinizde "recep-serit" ile ilgili bir isteği farklı bir adrese yönlendiriyoruz.
Yönlendirmelerin karmaşık kısmı genellikle
/recepserit/?$ = http://www.bilisimlife.net/recepserit/
/recepserit/.* = http://www.bilisimlife.net/recepserit/*
/.*recepserit = http://www.bilisimlife.net/*recepserit*
/recepserit\.jpg = http://www.bilisimlife.net/recepserit.png
Bütün karakterlerin neye benzediğini merak ediyor olabilirsiniz, şöyle özet geçelim:
- Alan adınız eşleştikten sonra URL adresinin ilk sayfası olduğundaki eşleşme.
$ - Eşleşme sadece kural sonunda ise
? - Bu bir "OR" anlamına gelen karakter. Bir kural dahilinde isteğe bağlı parçalar oluşturmak için kullanılır
. - Tek bir karaktere dayalı eşleşme
* - Sıfır veya daha fazla kez eşleşir
+ - Bir veya daha fazla kez eleşme
(. *) - Herhangi bir karakterle eşleşme
\. - Içindeki bir harfle her şeyi eşleştirin. Literal nokta, a-z vb. için değiştirilebilir.
([.] *) - Kelimeli bir nokta dışındaki herhangi bir şeyi eşleştir
Rule Conditions da neyin nesi?
Yeni bir kural tanımlayalım.
< match url="(.*)$" / >
< conditions >
< add input="{HTTP_HOST}" pattern=".+$" / >
< /conditions >
< action type="Redirect" url="https://{R:1}.net?load={C:0}" / >
< / rule >
Bu kural bir öncekiyle aynı, ancak orijinal istenen alan adını, querystring içindeki bir ref değişkenine etkiler. Alan adını .+$ (bir veya daha fazla karakter) şeklinde oluşturduğumuz pattern {HTTP_HOST} girişine karşı kullanarak elde ederiz. Bu durumda {C: 0} kullanıyoruz. C burada koşulları belirtir (kural için R karşı) ve 0 sadece tüm giriş değerini ifade eder.
Sunucu değişkenlerinin listesini ve belgelerini buradan bulabilirsiniz (IIS 6 ve üzeri sürümlerde kullanılabilir).
Yeniden not: Kuraldaki yakalanan değeri (örneğin, {R: 1}) conditions içinde kullanabilirsiniz. Birden fazla koşulunuz varsa, eylemde kullanılan referans sadece son eşleşen olanı ifade eder. Bununla birlikte, bir önceki koşuldan bir referans kullanabilirsiniz.
Bu durumda, eylemde kullanılan bildirim {C: 0}, en son eşleşen koşulu içerir (
Eyleminizde yeniden kullanmak için birden fazla koşul yakalayabilmek istiyorsanız
Daha fazla bilgiyi burada (ben Stackoverflow üzerinde buluyorum ama siz yine de Microsoft şeysinden faydalanın) bulubilirsiniz.
Nasıl test yapacağım diye mi soruyorsunuz?
Rewrite kurallarının hatalarını ayıklamak zor olabilir ancak IIS üzerinde Failed Request Tracing tool var. Debug işlemlerini bu tool ile yapmanız daha sağlıklıdır çünkü tarayıcıların ön belleği problem doğurabilir.
Referanslar: Stackoverflow
Faydalı olması dileğiyle.
Recep ŞERIT
BİR YORUM YAZIN