EKİ
4

IIS 7 Url Rewrite Modülü İle URL'lerin Yeniden Yazılması

3 yorum | Kategori: Web Programlama | 04 Ekim 2009 Pazar

Günümüzde, sitelerin en büyük ziyaretçi kaynakları Google, Bing gibi arama motorları. Sitelerin arama motorlarında üst sıralarda gözükebilmleri için yapılabilecek bir çok şey var.  Ancak bunlardan bazıları var ki, artık yapmak bir zorunluluk halini almış durumda. Buna en büyük örnek de Url Rewriting (URL'leri yeinden yazmak). Anlaşılır, kullanıcı dostu URL'ler sadece arama motoru optimizasyonu (SEO) için değil, sitenin navigasyonunun daha anlaşılır hale gelmesini sağladığı için önemli.

URL Rewriting dendiğinde muhtemelen birçok web programcısının aklına ilk gelen şey Apache sunucularda kullanılan mod_rewrite özelliğidir. Ancak bu özellik doğal olarak sadece PHP ile yazılmış olan uygulamalarda kullanılabiliyor. Bu yüzden Windows sunucular üzerinde çalışacak olan ASP.NET ile yazılmış web uygulamalarında URL Rewriting işlemini yapmak yakın bir zamana kadar Apache'deki gibi kolay değildi. Çünkü IIS'in URL Rewriting yapmayı kolaylaştıracak bir özelliği yoktu. Bu da programcıları üçüncü kişiler tarafından yazılmış olan HTTP modülleri kullanmak, gelen request'leri 404 sayfasına düşürüp oradan tekrar yönlendirme yapmak, ya da daha garip teknikler kullanmak zorunda bırakmaktaydı.

Microsoft'un 2008 yılının sonlarına doğru ilk versiyonunu (1.0) çıkarmış olduğu URL Rewrite modülü sayesinde IIS 7 kullanıcıları da artık kolayca URL Rewriting yapma imkanına kavuştu. Bu yazımda Microsoft Url Rewrite modülünün IIS 7 üzerine kurulumunu ve yeniden yazım kurallarının doğrudan web.config içerisinden nasıl tanımlandığını örnekler ile birlikte anlatacağım.

Microsoft Url Rewriter Mödülünün Kurulumu

Burada anlatacaklarım tabi ki modülü tam erişim hakkına sahip olduğunuz bir bilgisayara kurmakla ilgili. Eğer paylaşımlı hosting kullanacaksanız ve bu modül normalde kurulu değilse, hosting firmasından kurmalarını istemeniz gerekecektir. Tabi bu eğer hosting firması sunucularında IIS 7 kullanıyorsa mümkün, çünkü bu modül daha aşağı bir versiyonda çalışmıyor. O yüzden bu modülü kullanmayı planlıyorsanız hosting hizmeti alacağınız yerde kullanılan IIS versiyonuna çok dikkat etmelisiniz.

Şu an itibariyle modülün beta olmayan en son sürümü Nisan 2009'da çıkmış olan 1.1. Yakın bir zamanda 2.0 da çıkacak ancak şu an itibariyle sadece betası mevcut. Kurulum için 2 farklı yol izlemek mümkün. Bunlardan biri Microsoft Platform Installer kullanmak, diğeri ise normal .msi dosyası çekerek kurulum yapmak. Ben ikincisini yapmanızı tavsiye ederim, çünkü ilk yöntem için modülden önce Microsoft Web Platform Installer'ın kendisini kurmanız gerekiyor. Hangi yöntemle kuracak olursanız olun, modülü alacağınız adres burası. Eğer Platform Installer ile kuracaksanız sayfanın sağ üst kısmındaki büyük yeşil tuşa, .msi dosyası çekip normal bi program kuruyormuş gibi kuracaksanız da o tuşun hemen altındaki indirme linklerinden kendi işletim sisteminize uygun olan (x86/x64) kurulum dosyasını çekin. Her iki yöntemde de kurulum yaparken bilmeniz gereken fazladan bir şey yok, sadece kurulum bittikten sonra bilgisayarınızı yeniden başlatmanız gerekiyor o kadar.

Yeniden Yazma/Yönlendirme Kurallarının Yazılması

Kuralları oluşturmak için iki farklı yöntem mevcut. Doğrudan web.config içerisine yazmak ve modülün yanında gelen grafik arayüzü kullanarak oluşturmak. Grafik arayüz ile oluşturduğunuz kurallar da otomatik olarak web.config içerisine yazıldığından, her iki yöntem de aynı kapıya çıkıyor aslında. Ancak özellikle Regex konusunda acemi olanlar yazılan kuralları anında test etme imkanı verdiği için grafik arayüzü kullanmayı tercih edebilirler. Ancak tam erişiminiz olmayan sunucularda kurallarınızı doğrudan web.config'e yazmak zorundasınız. Ben de burada sadece doğrudan web.config içerisinde kural tanımlamaktan bahsedeceğim. Zaten grafik arayüz ile tanımlama yapmak gayet kolay. Tek yapmanız gereken Windows'ta Control Panel/Administrative Tools/ içerisinden IIS Manager'ı açmak ve sol taraftan sitenizi seçtikten sonra sağdaki bölümden URL Rewrite seçeneğinin üzerine çift tıklamak. Açılan ekranda kuralları kolaylıkla girebilirsiniz.

Web.config içerisinde kuralları <configuration> dalının altında bulunan <system.webServer> altına açacağınız <rewrite>...</rewrite> tag'leri arasında tanımlamanız gerekiyor. Aşağıda iki basit kuralın tanımlanışını örnek olarak gösterdim.

<rewrite>
  <rules>  
    
    <rule name="kural1" stopProcessing="true">
      <match url="pattern1" />
      <action type="Rewrite" url="url1" />
    </rule>
    
    <rule name="kural2">
      <match url="pattern2" />
      <action type="Redirect" url="url2" redirectType="permanent" />
    </rule>
    
  </rules>
</rewrite>

Yukarıda göstermiş olduğum kurallardan ilki bir yeniden yazma (rewrite), ikincisi de bir redirection (yeniden yönlendirme) kuralı. Her iki kural da olabilecek en temel özelliklerle tanımlanmış. Normalde daha karmaşık kuralları aşağıdaki formatta yazmanız mümkün.

<rule name="kural_adı" stopProcessing="true">
  <match url="pattern" />
  <conditions logicalGrouping="MatchAll">
    <add input="koşul1" pattern="koşul1_pattern" />
    <add input="koşul2" pattern="koşul2_pattern" />
  </conditions>
  <action type="işlem" url="url" />
</rule>

Şimdi yukarıda görmüş olduğunuz her tag ve alabilecekleri bazı önemli özelliklerden bahsedeyim. Özellikleri okurken mutlaka yukarıdaki taslaktaki yerlerini de öğrenin. Bu taslakta her özelliği kullanmadım ancak hangi özelliğin nerede kullanılabileceğini aşağıda anlatacağım.

<rule>

Yazacağınız her bir kural için ayrı bir <rule> tag'i kullanmanız gerekiyor. Bu tag'ın çok sık kullanacağınız iki özelliği var:

name: Kuralın adı. Her kuralın mutlaka bir adı olması gerekiyor. Birden fazla kural aynı ada sahip olamaz.

patternSyntax: Kural içerisinde yazılacak olan pattern'lerin hangi sentaks ile yazılacağını belirlemek için kullanılır. Varsayılan değeri ECMAScript, yani Perl-Compatible Regex'tir. Alabileceği diğer değer ise IIS 7.0 HTTP redirection module içerisinde kullanılan sentaks olan Wildcard'tır. Ben bu yazı boyunca RegEx kullanacağım.

stopProcessing: Varsayılan değeri false'tır. Eğer true yapılırsa, gelen url'nin bu kuraldan sonra gelen diğer kurallardaki pattern'lere uyup uymadığına bakılmaz ve bu kural sonucunda oluşturulmuş olan yeni url IIS request pipeline'a gönderilir.

<match>

Kuralın uygulanması için gelen URL'nin uyması gereken pattern'i belirler. Pattern, url özelliğine yazılır. Yazılmış olan pattern, ziyaretçinin girmiş olduğu URL'nin tamamıyla değil, host adından sonraki kısmıyla karşılaştırılır. Mesela ziyaretçi http://www.cihantek.com/deneme/anasayfa.aspx?sayfa=4&yil=2009 adresini girmişse, bu pattern deneme/anasayfa.aspx ile karşılaştırılır. Host adından sonra gelen slash'ın da karşılaştırılan kısma dahil edilmediğine dikkat edin. Bu satırdan sonra "URL" yazdığım zaman şimdi bahsetmiş olduğum host adından sonraki, querystring'siz kısmı algılamalısınız.

url: Hangi sentaksı kullandığı rule tag'inde belirtilmiş olan pattern'dir. Eğer gelen url bu pattern'e uyuyorsa, kural işlenmeye devam edilir.

<conditions>

Yazılması opsiyonel olan bir bölümdür. Eğer gelen URL'nin vermiş olduğunuz pattern dışında uyması geren başka kriterler de varsa, o kriterlerden bir çoğunu bu tag içerisine gireceğiniz koşullar ile tanımlayabilirsiniz. logicalGrouping özelliği ile koşulların nasıl değerlendirileceği değiştirilebilir.

logicalGrouping: MatchAll veya MatchAny değerini alabilir. İlkinde kural eğer URL tüm koşullara uygunsa uygulanır. İkincisinde ise koşullardan herhangi birine uygunsa uygulanır. Varsayılan değeri MatchAll'dır.

<add>

Conditions tag'i içerisinde tanımlayacağınız her koşul için kullanmanız gereken tag'dir.

input: Neyin koşula uyup uymadığına bakılacağını gösterir. Burada da bir pattern kullanabileceğiniz gibi, daha sonra bahsedeceğim sunucu değişkenlerini de kullanabilirsiniz. Mesela bu özelliğe {HTTP_HOST} değerini vererek, host adının verdiğiniz koşula uyup uymadığını kontrol edebilirsiniz.

pattern: input özelliğinde verilmiş olan değerin uyması gereken pattern'i belirtir. Bu özellikle birlikte ignoreCase özelliğini de kullanarak karşılaştırma işleminin case-sensitive olup olmadığını belirleyebilirsiniz. Koşullarda pattern özelliğini kullanmak şart değildir. Onun yerine matchType özelliğini kullanarak da kontrol yapabilirsiniz.

matchType: IsFile ve IsDirectory değerlerini alabilir. Herhangi bir pattern girmeden girilmiş olan URL'nin bir dosya veya klasöre denk gelip gelmediğini kontrol etmeye yarar.

negate: Varsayılan değeri false'tır. Eğer true değerini verirseniz, url koşulda vermiş olduğunuz kurala uymazsa koşulun sağlandığını kabul eder.

<action>

Eğer gelen URL, match ve conditions kısımlarında tanımlanmış olan tüm koşulları sağlamışsa yapılacak olan işlemi belirten tag'dir. Özellikleri:

type: Rewrite veya Redirect değerlerini alabilir. Rewrite değerini alması durumunda gelen URL'yi, url özelliğinde verilmiş olan kurala göre yeniden yazar. Redirect değeri verilmişse de yine gelen URL'yi url özelliğinde verilmiş olan kurala göre değiştirir, ancak bu sefer istemciye (ziyaretçinin tarayıcısına) bir cevap göndererek onu bu yeni URL'ye yönlendirir.

url: Yeniden yazma/yönlendirme pattern'i. Burada geri referanslama yöntemiyle ziyaretçiden gelen URL'nin daha önce yazmış olduğunuz pattern'lerin farklı kısımlarına uyan parçalarına ulaşabilirsiniz. Nasıl ulaşacağınızı vereceğim örneklerde göreceksiniz.

redirectType: Yönlendirmenin türünü belirler. Permanent değerini verirseniz kalıcı yönlendirme (301), Temporary değerini verirseniz geçici (307) yönlendirme yapar. Bu özellik de sadece type özelliğinin değerini Redirect olarak vermişseniz bir anlam ifade eder.

appendQueryString: Yeniden yazma/yönlendirme işlemi sırasında querystring'in korunup korunmayacağını belirtir. Varsayılan değeri true'dur. Normalde kullanıcı dostu URL ile dolaşılabilen bir sitede zaten ziyaretçilerin yazdıkları adresler querystring içermezler. Dolayısı ile bu özelliğin değerinin ne olduğu çoğu durumda bir şeyi değiştirmez.

Sunucu Değişkenleri

Sunucu değişkenlerini kullanarak, yeniden yazma/yönlendirme kurallarını yazma işini kolaylaştırabilirsiniz. Bu değişkenleri aşağıdaki yerlerde isimlerini {} arasında yazarak kullanmak mümkün:

  • <add> tag'lerinin input özelliklerinde
  • <action> tag'lerinin url özelliklerinde

Ziyaretçinin tarayıcısına girmiş olduğunu farzettiğim örnek bir adres için bu değişkenlerin hangi değerleri alacaklarını aşağıdaki listede görebilirsiniz.

Adres: http://www.cihantek.com/deneme/anasayfa.aspx?sayfa=4&yil=2009

  • REQUEST_URI değişkeni: /anasayfa.aspx?sayfa=4&yil=2009
  • QUERY_STRING değişkeni: sayfa=4&yil=2009
  • HTTP_HOST değişkeni: www.cihantek.com
  • SERVER_PORT değişkeni: 80
  • SERVER_PORT_SECURE değişkeni: 0

Bu değişkenlere ek olarak, Request'in tüm HTTP header'larına aynı şekilde ulaşabilirsiniz. Bunun için hangi HTTP header'ına ulaşmak istiyorsanız, onun isminin önüne HTTP_ eklemeniz, tüm harfleri büyük yapmanız ve - işaretlerini _ işaretine dönüştürmeniz yeterli. Mesela user-agent header'ının değerini almak için {HTTP_USER_AGENT} yazmanız yeterli.

Geri Referansların Kullanımı

URL'lerin yazmış olduğunuz pattern'lerdeki belli bölümlere (RegEx gruplarına) uyan kısımlarını geri refaranslama yöntemi ile elde edip yeniden yazma işleminde kullanabilirsiniz. Match tag'inde girmiş olduğunuz pattern ile ilgili geri referanslara ulaşmak için {R:N}, koşullarınızda girmiş olduğunuz pattern'ler ile ilgili geri referanslara ulaşmak için de {C:N} sentaksını kullanmanız gerekli. Burada N değeri 0-9 arasında herhangi bir sayı olabilir. Eğer 0 verirseniz pattern'e uymuş olan tüm katarı (string'i), başka bir rakam verirseniz katarın pattern'in o numaralı grubuna uymuş olan parçasını elde edersiniz.

Mesela <match> tag'inde verilmiş olan ^(www\.)(.*)$ gibi bir pattern ile www.cihantek.com katarının karşılaştırılması sonucunda:

{R:0} referansının içeriği www.cihantek.com

{R:1} referansının içeriği www.

{R:2} referansının içeriği de cihantek.com olacaktır.

Katar (String) Fonksiyonları

Yeniden yazma ifadelerini oluştururken ve koşulların girdilerini verirken kullanabileceğiniz 3 adet fonksiyon bulunmakta. Bunlar:

ToLower: Verilen katarı küçük harfli hale dönüştürür.

UrlEncode: Verilen katardaki özel karakterleri kodlayarak, URL olarak güvenle kullanılabilecek hale getirir.

UrlDecode: Encode edilmiş bir katarı eski orjinal haline getirir.

Bu fonsiyonları aşağıda görüldüğü üzere sunucu değişkenleri ve geri referanslar ile birlikte kullanmak da mümküdür.

{ToLower:ANASAYFA.ASPX}
{UrlDecode:{REQUEST_URI}}
{UrlEncode:{R:1}.aspx?p=[t ü r k ç e]}

Örnek Kurallar

Şu ana kadar yazdığım her şey şimdi vereceğim örnekler ile ilgili ayrıntılı açıklama yazmak durumunda kalmamam içindi. Verdiğim örnek kuralların sadece ne yaptıklarını söyleyeceğim. Nasıl yaptıklarını anlamak için yukarıda yazdığım bilgilere bakmanız yeterli olacaktır.

Aşağıdaki kural, http://www.deneme.com/kategoriler/regex/ şeklindeki bir ifadeyi http://www.deneme.com/listele.aspx?k=regex şekline dönüştürür.

<rule name="Kategorileri Listele" stopProcessing="true">
  <match url="^kategoriler/([-\w]+)/$" />
  <action type="Rewrite" url="listele.aspx?k={R:1}" />
</rule>

Aşağıdaki kural,  http://www.deneme.com/arsiv/2009/12/ şeklindeki bir ifadeyi http://www.deneme.com/arsiv.aspx?y=2009&m=12 şekline dönüştürür.

<rule name="Arsive Bak" stopProcessing="true">
  <match url="^arsiv/(\d{4})/(\d{1,2})/$" />
  <action type="Rewrite" url="arsiv.aspx?y={R:1}&amp;m={R:2}" />
</rule>

Aşağıdaki kural, büyük harf içeren bir url giren kullanıcının tarayıcısını, kalıcı olarak aynı adresin küçük harfle yazılmış haline yönlendirir. Örneğin kullanıcı www.CiHaNtek.com yazmışsa, bu kural onu www.cihantek.com adresine yönlendirir.

<rule name="Kucuk Harfe Cevir">
  <match url=".*[A-Z].*" ignoreCase="false" />
  <action type="Redirect" url="{ToLower:{R:0}}" redirectType="Permanent" />
</rule>

Aşağıdaki kural, şu anda gezmekte olduğunuz sitede de kullanılmakta olan bir kuraldır. Yaptığı şey ise aşağıdaki 4 adresi de kalıcı olarak http://www.cihantek.com adresine yönlendirmektir.

http://www.cihantek.com, http://cihantek.com, http://www.cihantek.net, http://cihantek.net
<rule name="Yonlendir">
  <match url=".*" />
  <conditions>
    <add input="{HTTP_HOST}" pattern="^(www)*(cihantek\.com)|(cihantek\.net)$" />
  </conditions>
  <action type="Redirect" url="http://www.cihantek.com/{R:0}" redirectType="Permanent" />
</rule>

Aşağıdaki kural, eğer ziyaretci tarayıcıya adresi sonunda slash olmadan girmişse, onu kalıcı olarak aynı adresin sonuna slash eklenmiş haline yönlendirir. Ancak verilmiş olan koşuldan dolayı, eğer ziyaretçinin girmiş olduğu adres bir dosyaya veya klasöre işaret ediyorsa, adreste hiçbir değişiklik yapmaz.

<rule name="Sona Slash Ekle">
  <match url="^(.*[^/])$" />
  <conditions>
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />  
  </conditions>
  <action type="Redirect" redirectType="Permanent" url="http://{HTTP_HOST}/{R:1}/" />
</rule>

Burada yazdıklarım URL Rewrite modülünün yeteneklerinin sadece küçük bir bölümünü göstermekte. Ancak bu küçük bölüm çoğu projenin ihtiyaçlarını karşılamak için fazlasıyla yeterli. Eğer daha spesifik bir şeyler yapmaya ihtiyacınız varsa ve nasıl yapılacağı hakkında bir fikriniz yoksa, bu adrese gidip daha detaylı bilgi alabilirsiniz.

Etiketler: .NET Framework, ASP.NET, SEO

Yorumlar

Bu yazı hakkında toplam 3 yorum bulunmaktadır. Siz de yorum ekleyebilirsiniz.
Yorum Cihan Tek | 02 Temmuz 2010 Cuma 08:39:30
Sorun yasadiginiz uzantilari yakalayan bir regex yazip ona uyan url'leri degistirmeden gönderen bir kurali listenin en basina koyarak sorunu giderebilirsiniz.
Yorum Hamit Kara | 02 Temmuz 2010 Cuma 03:39:50
Açik anlatim için çok tesekkür ederim.. Ancak CSS, JS, JPG, vs. gibi dosyalarda sorun yasamaktayim. Bunlar için bir çözümünüz var mi?
Yorum Mustafa Yolcu | 04 Kasım 2009 Çarşamba 13:10:56
tebrik ederim, son dönemde türkçe içerigine ihtiyaç duyulan konulardan birini ele almissiniz. bu konuyla ilgili ileri seviye örneklendirmelerde bulunabilirseniz, bu konuda kaynak olursunuz diye düsünüyorum. basarilar.

Yorum Yazın

İsim ve soyadınız : E-Posta adresiniz : Güvenlik kodu : Güvenlik Kodu Yorumunuz : Gönder