Url Rewriting

        Sanırım web de dolaşırken siz de çok kez ismini duymuş ya da farklı farklı sitelerde uygulamalarını görmüşsünüzdür. Eğer neden sitenizde urlrewriting olması gerektiğini ve sitenize nasıl uygulayabileceğinizi merak ediyorsanız tam yerine geldiniz.

 

Sağladıkları:

  1. Sitenizin arama motorları tarafından daha detaylı indexlenir
  2. Lamerlerin querystringlerinizle oynayıp bir şeyleri karıştırmasını engeller
  3. Kullanıcıya daha hoş görünen bir adrese sahip olursunuz


       Normalde sitemizde bir makale yayınladığımız zaman adresi:

                 www.recepguzel.com/?articleID=1234 gibi olur.

       Url Rewriting sonrasında ise:

                 www.recepguzel.com/1234/Url-Rewriting-Nedir gibi bir adrese sahip olabiliriz.

        Özelliklerinden kısaca bahsetmeye çalıştıktan sonra şimdi de nasıl yapabileceğimize bakalım.

         Aslında işlem temelde 3 aşamadan oluşuyor:

   1-)IIS tarafındaki değişiklikler(Windows XP Pro için)

        IIS tarafında yapacağımız ufacık bir işlem yeterli olacaktır

  • IIS’i açıyoruz ve url rewriting özelliği eklemek istediğimiz website/vdirectory üzerine sağ tıklayıp properties(özellikler)’e tıklıyoruz
  • Virtual Directory/Web site tabı içerisinde Configuration düğmesine tıklıyoruz
  • Karşımıza aşağıdaki gibi bir ekran gelecek, burada Add butonuna tıklıyoruz
  • Açılan ekrandaki browse butonuna basıp “aspnet_isapi.dll” dosyasını buluyoruz.

    Genellikle bu adreste bulunur: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
  • Extension alanına “.*” yazıyoruz.
  • Limit to alanına “GET,HEAD,POST” yazıyoruz.
  • Son olarak da Check that file exist checkboxunun seçimini kaldırıyoruz.
  • Çıkan diğer ekranlara OK OK diyerek işin iis fazını bitirmiş oluyoruz.

Not: Windows server 2003 üzerinde Virtual Directory üzerinde Configuration üzerine tıkladığımızda farklı bir ekran gelir.

Çıkan ekranda Application extentions yerine Wildcard application maps altındaki insert butonuna tıklamanız gerekmektedir.

Burada yine xp'de olduğu gibi aspnet_isapi.dll'i browse edip, Verify that file exist kutucuğunun checkini kaldırıyoruz ve OK ile işlemi kaydediyoruz.

     2-)Web.config de yapılması gereken değişiklikler :

        Aşağıdaki satırları web.config içersinde gerekli yerlere yapıştırıyoruz

             a.) <configSections> tagları arasına aşağıdaki kodu yapıştıryoruz:

<section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"/> 

             b.) <httpModules>  tagları arasına aşağıdaki kodu yapıştırıyoruz:

<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>

             c.) <system.webServer> tagları arasına aşağıdaki kodu yapıştırıyoruz:

<modules runAllManagedModulesForAllRequests="true">
<
add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" /> </modules>
<!--[if !supportLineBreakNewLine]-->
<!--[endif]-->
             Eğer yoksa Aşağıdaki kodu da aynı blok içine yazıyoruz:          

<!--[if !supportLists]-->
<validation validateIntegratedModeConfiguration="false" />

 

             d.)Son olarak <configuration> tagı içine aşağıdaki kodu yapıştırıyoruz:

<rewriter>
<
rewrite url="/([0-9]{6})(.*)/(.*)-(.*)" to="~/ArticleDetail/default.aspx?aid=$1"/>
</
rewriter>
<!--[if !supportLineBreakNewLine]--><!--[endif]-->

             Not:Burada benim makale gösterdiğim sayfam ArticleDetail klasörü içinde default.aspx olduğu için bu şekilde edit ettim, siz kendi sitenize göre değiştirebilirsiniz). Ayrıca rewriter url içine yazdığım ([0-9]{6}) regex komutunu yalnızca 6 karakterli rakamlarla sınırlamak için kullandım. siz kodunuzda  bu kısmı kaldırabilirsiz. Şu an ki hali "/123456/merhaba-dunya" şeklindeki formata göre yazılmıştır.

  3-) Classımızda yapılacak değişiklikler

             Class da bir değişiklik yapmadan önce referanslarımız arasına “Intelligencia.UrlRewriter.dll” dosyasını eklememiz gerekiyor. Sonra aşağıdaki fonksiyonu makaleye link verdiğimiz yani; makaleleri listelediğimiz sayfanın class ı içine kopyalıyoruz(bunu ayrı bir helper class ına da atabilirsiniz)

C# kodu: 

public static string GenerateURL(object Title, object strId)

        {

            //Article’ın konusu

            string strTitle = Title.ToString();

             #region Generate SEO Friendly URL based on Title

            //boşlukları trimleyelim.

            strTitle = strTitle.Trim();

            strTitle = strTitle.Trim('-');

            strTitle = strTitle.ToLower();

            char[] chars = @"$%#@!*?;:~`+=()[]{}|\'<>,/^&"".".ToCharArray();

            strTitle = strTitle.Replace("c#", "C-Sharp");

            strTitle = strTitle.Replace("vb.net", "VB-Net");

            strTitle = strTitle.Replace("asp.net", "Asp-Net");

             //noktaları da “-“ karakteri ile değiştirelim

            strTitle = strTitle.Replace(".", "-");

             //Lüzumsuz karakterleri de bi güzel çevirelim

            for (int i = 0; i < chars.Length; i++)

            {

                string strChar = chars.GetValue(i).ToString();

                if (strTitle.Contains(strChar))

                {

                    strTitle = strTitle.Replace(strChar, string.Empty);

                }

            }

             //Sıra geldi aradaki boşluklara, onları da “-“ yapalım

            strTitle = strTitle.Replace(" ", "-");

             //Yanyana gelen “-“lerden de kurtuluyoruz

            strTitle = strTitle.Replace("--", "-");

            strTitle = strTitle.Replace("---", "-");

            strTitle = strTitle.Replace("----", "-");

            strTitle = strTitle.Replace("-----", "-");

            strTitle = strTitle.Replace("----", "-");

            strTitle = strTitle.Replace("---", "-");

            strTitle = strTitle.Replace("--", "-");

             strTitle = strTitle.Trim();

             //Halâ “-“ var mı acaba?

            strTitle = strTitle.Trim('-');

            #endregion

             //Şimdi de linki istediğimiz şekle çeviriyoruz

            strTitle = "~/Article/" + strTitle + "-" + strId + ".aspx";

             return strTitle;

}

VB.NET Kodu:

Public Shared Function GenerateURL(ByVal Title As Object, ByVal strId As Object) As String
   
   
    'Article’ın konusu
   
    Dim strTitle As String = Title.ToString()
   
    '#Region "Generate SEO Friendly URL based on Title"
   
    'boşlukları trimleyelim.
   
    strTitle = strTitle.Trim()
   
   
    strTitle = strTitle.Trim("-"c)
   
   
    strTitle = strTitle.ToLower()
   
    Dim chars As Char() = "$%#@!*?;:~`+=()[]{}|\'<>,/^&"".".ToCharArray()
   
    strTitle = strTitle.Replace("c#", "C-Sharp")
   
    strTitle = strTitle.Replace("vb.net", "VB-Net")
   
    strTitle = strTitle.Replace("asp.net", "Asp-Net")
   
    'noktaları da “-“ karakteri ile değiştirelim
   
    strTitle = strTitle.Replace(".", "-")
   
    'Lüzumsuz karakterleri de bi güzel çevirelim
   
    For i As Integer = 0 To chars.Length - 1
       
       
        Dim strChar As String = chars.GetValue(i).ToString()
       
        If strTitle.Contains(strChar) Then
           
           
               
            strTitle = strTitle.Replace(strChar, String.Empty)
           
        End If
    Next
   
    'Sıra geldi aradaki boşluklara, onları da “-“ yapalım
   
    strTitle = strTitle.Replace(" ", "-")
   
    'Yanyana gelen “-“lerden de kurtuluyoruz
   
    strTitle = strTitle.Replace("--", "-")
   
    strTitle = strTitle.Replace("---", "-")
   
    strTitle = strTitle.Replace("----", "-")
   
    strTitle = strTitle.Replace("-----", "-")
   
    strTitle = strTitle.Replace("----", "-")
   
    strTitle = strTitle.Replace("---", "-")
   
    strTitle = strTitle.Replace("--", "-")
   
    strTitle = strTitle.Trim()
   
    'Halâ “-“ var mı acaba?
   
    strTitle = strTitle.Trim("-"c)
   
    '#End Region
   
    'Şimdi de linki istediğimiz şekle çeviriyoruz
   
    strTitle = ("~/Article/" & strTitle & "-") + strId & ".aspx"
   
    Return strTitle
End Function

                Kod bloğumuzu da kopyaladıktan sonra artık link vermeye hazırız.

 

               Normalde bu şekilde vermemiz gereken linki:

            string url =”articledetail.aspx?ArticleId=1234”;

     bu şekilde veriyoruz :

            string url =GenerateURL(Title,ArticleId).ToString());

Not: Orijinal urlrewriter dosyasını kullandığımda aşağıdaki problemi yaşadığım için dll'i googlebot hatasına karşı editledim. isterseniz editlenmiş halini sayfanın sonundaki linkten indirebilirsiniz.

Exception type: HttpException
Exception message: Cannot use a leading .. to exit above the top directory.

  Intelligencia.UrlRewriter.rar (18,15 kb)

Comments (17) -

Latif OZTURK 12/18/2008 4:57:46 PM

Konu guzel anlatilmis.Elinize saglik.
Tesekkuler.

mustafa ekicim 2/12/2009 8:22:48 PM

Extension alanına “.*” yazılamiyor. bir çözümü var mı?


Tesekkuler.

Merhaba Server 2003 üzerinde mi deniyorsunuz?
orada configuration içinde "wildcard application maps" diye bir bölüm olacak. Insert'e tıklayıp aspnet_isapi.dll'i gösteriyorsunuz ve "verify that file exists" checkini kaldırıyorsunuz.

Selamlar,
Aydınlatıcı paylaşımız için teşekkürler.
Asp tabanlı bir sitede (webconfig dosyası uygulaması) bu nasıl uygulanır?
Şimdiden yardımlarınız için teşekkürler

Recep GÜZEL 3/11/2009 10:39:22 AM

Merhaba,
forums.aspfree.com/.../...with-asp-iis-102550.html
adresinde konu detaylı anlatılmış, isterseniz bu makaleyi bir inceleyin

Recep GÜZEL 3/11/2009 10:40:43 AM

aşağıdaki likte de google translate ile TR'ye çevirilmiş hali mevut

translate.google.com/.../url-rewriting-with-asp-iis-102550.html&hl=en&langpair=auto|tr&tbb=1&ie=iso-8859-1

Cumhur Coşkun 4/29/2009 12:05:18 PM

Konuyu çok güzel anlatmışsınız, tebrik ediyorum.

nrdn indiriyoruzzz yaaaaaaaaaaa ben anlamadim

Merhaba,
Yazının en altında download için link olacak, buraya da bir kopyasını yazıyorum.
Kolay gelsin Smile
www.recepguzel.com/file.axd

//Yanyana gelen “-“lerden de kurtuluyoruz

bu kısımda aşağıdaki kod yeterli olacaktır. bence "---" şeklinde replace yapıp kod kalabalığının bir anlamı yok...


strTitle = strTitle.Replace("--", "-");
strTitle = strTitle.Replace("--", "-");

Paylaşım İçin Teşekkürler

bu dll nin googlebotlar tarafından hataya sebep olduğunu nasıl anladınız?

Merhaba,
google webmaster tools taki hata mesajlarini inceledigimde farkina vardim.

Mrblar; Anlatımı uyguladım sorunsuz çalışmakta fakat, aynı linke tekrar tıkladığımda aynı linke tekrar yönleniyor mesela ilk tıklamada ( site.com/borekler/borek.html )
ikinci tıklamada ( site.com/borekler/borekler/borek.html )

yani değişken olarak gelen rewrite değeri adrese ekleniyor..
ben bunu bi kategorilemede kullanıyorum yine ikinci tıklamada, misal "corekler" kategorisinde aldığı hal ise
( site.com/borekler/corekler/corek.html )

tabi bu tıkladıkca kısır döngü ekleyerek gidiyor...

esad cakici 7/23/2010 6:08:54 PM

Merhaba cok guzel bir paylasim yapmisiniz tesekkurler.

Ancak soyle bir problem yasiyorum. URL yi istedigim gibi yazdırıyorum ancak yonledigim sayfayı bulamıyorum artı querystring alamıyorum.

Dediğiniz gibi IIS tarafı da dahil olmak üzere herşeyi yaptım.

Default.aspx sayfamdan butona tıklayınca CheckOut.aspx?soid=1 olarak gitmesi gerekiyor. Bunu ben /CheckOut/1/birseyler olarak gonderiyorum.
webconfig de rewriter su sekilde:
<rewriter>
    <rewrite to="/CheckOut/([0-9]{1})(.*)/(.*)-(.*)" url="~/CheckOut.aspx?soid=$2"/>
  </rewriter>

Mapping i nasıl yapmam gerekiyor acaba ve ben "soid"i diğer sayfada nasıl alacagim.
Yardimci olursanız sevinirim.

sizinle irtibat kurabilmem icin bir mail adresinizi verebilirseniz cok mutlu olurum.

mrb... host firmasına ayarları yaptırmama rağmen 404 e düşüyor sorun ne olabilir

Merhaba,

sorun rewriter a yazdiginiz kuraldan kaynaklaniyor olabilir. Uzun zamandir blog ile ilgilenemdim. Umarim sorunlariniz cozulmustur. Cozulmediyse tekrar gonderirseniz yardimci olabilirim.

Add comment