URL Rewriting ( Url Mapping )   (Hit : 286)


Adres çubuğunda görülen adresleri biçimlendirmek için biraz araştırma yaptım ve bu konuyu merak edenler için sanırım bu yazı faydalı olacaktır.


Web sitesi içinde, sayfalar arasında gezinti yapılırken sorgular için parametreler yollamamız gerekir. Bu parametreleri URL lere ekleyerek sayfalar arasında haberleşmeyi sağlarız. Fakat bu parametreler yada adres içindeki farklı karakterler (örneğin KONU.aspx?xid=5 burada ? veya tid) kulacı gözüyle bakıldığında anlamsız ve hoş olmayan bir görünüm olarak algılanabilir. Hele kullandığınız parametre Guid ise adres, tabiri caizse çorba olur :) Yada burada kullanılan değişken isimleri yada değerler kötü niyetli kişilere bir fikir verebilir. Tüm bunlar dikkate alındığında ben son kullanıcı için göze estetik görünen ve programımdaki kod satırları hakkında kullanıcıya fikir vermeyen url ler kullanmayı tercih ederim. Uzatmadan küçük bir örnek ile bu çevrim işini nasıl halledeceğimizi göstermeye çalışacağım.


ASP.NET 2.0 dan beri olan Url Rewriting özelliği ile Url Maping diye tabir edilen adres eşleştirmesi yöntemi benim işimi gördü o yüzden bundan bahsetmeye çalışacağım. (Başka yöntemlerde var.)


İlk başta akla gelen konu, link olarak verdiğimiz adresin adres çubuğunda  farklı bir şekilde görülmesini nasıl sağlayabiliriz ?

 

  <system.web>

   <urlMappings enabled="true">

       <add url="~/HAKKIMDA_GENEL_BILGI" mappedUrl="frmHAKKIMDA.aspx" />

   </urlMappings>

  </system.web>

 

Ayarlarımızın tutulduğu web.config sayfasında urlMapping özelliğini true yaptığımız takdirde, web sayfasında, çağrılan linklerin web.config de bir karşılığı olup olmadığına bakılacaktır. Yani şunu demek istiyorum yukarıdaki örnekte görüldüğü gibi ben projede herhangi bir sayfada "~/HAKKIMDA_GENEL_BILGI" adresini çağırırsam ki böyle bir adres yok, web.config sayfasında karşılığı olan "frmHAKKIMDA.aspx" sayfası açılacaktır. Ama adres çubuğunda www.abc.com\HAKKIMDA_GENEL_BILGI gibi bir yazı görülecektir.


Bir tag bulutu içindeki bütün linkler için web.config sayfasına tek tek adres karşılıklarını girmek zor olacaktır.Yada tag bulutuna yeni bir kayıt eklendiğinde bunu web config dosyasına da eklemeniz gerektiği gerçeği sıkıntı vericidir. Bütün linkleri yönetim panelimizden bir butona basarak yenileyebilmemiz beklenen bir şey. Bunu yapabilmemiz için Configuration tipi kullanılıyor. Configuration tipi çalışma zamanında web.config sayfasına bir şeyler eklemek, silmek yada güncellemek imkanı sunar.

 

       Configuration cfg = ConfigurationManager.OpenExeConfiguration("");

       UrlMappingsSection urlMapSct = (UrlMappingsSection)cfg.GetSection("system.web/urlMappings");

      string url = "", mappedUrl = "";

        foreach (DataRow row in dsTaglar.Select())

        {

                url = "~/Taglar_" + STR_REPLACE(row["ADI"].ToString());

                mappedUrl = "frmTaglar.aspx?tid=" + row["ID"].ToString();

                UrlMapping map = new UrlMapping(url, mappedUrl);

                urlMapSct.UrlMappings.Add(map);

        }

cfg.Save();

 

 

Burada ki configuration nesnesi ve küçük foreach düngümüz sayesinde bütün taglar için bir çırpıda bütün linklerin eşitlemesi yapılmış ve web config sayfasına kaydedilmiştir. Site içinde gezinirken örneğin “Dephi” isimli tag  a tıkladığınızda adres çubuğunda www.abc.com\Taglar_Delphi gibi bir yazı görülecektir fakat aslında gittiğimiz sayfanın tam adresi www.abc.com\frmTaglar.aspx?tid="146d2495-0720-4ff3-b175-265e61568be1"  gibi bir adres olacaktır. Tabi ben burada Tag ismini unique olarak düşündüm. Aynı tag isminde iki kayıt varsa parametre yollamak zorunlu olacaktır. Adres çubuğunda kullanılan bazı karakterler görsel açıdan hoş görünmeyen şekillere bürünebiliyor :) Bunların dönüşümü için aşağıdaki fonksiyondan yararlandım.

 

 

 

    public static string STR_REPLACE(string x)

    {

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

 

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

        {

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

            if (x.Contains(strChar))

            {

                x = x.Replace(strChar, "_");

            }

        }

 

        x = x.Contains('Ç'.ToString()) ? x.Replace('Ç', 'C') : x;

        x = x.Contains('Ğ'.ToString()) ? x.Replace('Ğ', 'G') : x;

        x = x.Contains('Ş'.ToString()) ? x.Replace('Ş', 'S') : x;

        x = x.Contains('İ'.ToString()) ? x.Replace('İ', 'I') : x;

        x = x.Contains('Ü'.ToString()) ? x.Replace('Ü', 'U') : x;

        x = x.Contains('ş'.ToString()) ? x.Replace('ş', 's') : x;

        x = x.Contains('ç'.ToString()) ? x.Replace('ç', 'c') : x;

        x = x.Contains('ğ'.ToString()) ? x.Replace('ğ', 'g') : x;

        x = x.Contains('ı'.ToString()) ? x.Replace('ı', 'i') : x;

        x = x.Contains('ü'.ToString()) ? x.Replace('ü', 'u') : x;

       

        return x.Trim();

    }

 

X parametresi içinde c dizisine ait bir karakter varsa, bunları ‘_’ ye dönüştürüp ve Türkçe karakterleri de yukarıdaki gibi dönüştürdükten sonra parametremiz adres çubuğunda sergilenmeye hazır demektir. Amacımız adres çubuğundaki yazıların anlamlı olmasını sağlamak olduğuna göre böyle bir dönüşüm yerinde olacaktır.


Buraya kadar anlatılanları projenize uyguladıktan sonra kendi localhost unuzda sorunsuzca  çalıştığını görünce sevinebilirsiniz. Ama durun hemen sevinmeyin :) Ben de sevinmiştim ama ne yazıkki host sağlayıcı firmalar URL REWRITING özelliğini desteklemiyor. Projenizi hosta yükledikten sonra web config sayfanızda urlmap linkleri doğru bir şeklide yüklendiğini görseniz bile linkler çalışmayacaktır. Sayfa bulunamadı mesajı alırsınız. Bu durumda host sağlayıcı firmayı arayarak durumu anlatmalısınız. URL MAP için IIS de gerekli ayarlamaları yapıyorlar. Sonra linklerin çalıştığını görüyorsunuz. Yani boşuna kendinizde hata aramayın saatlerce :) (Benim bayağı zamanımı aldı da)


Bu ayarıda yaptıktan sonra URL MAPPING özelliğinizin sorunsuz çalıştığını göreceksiniz. Ama bittimi derseniz bitmedi :) Benim için özel bir durum oluştu onuda paylaşmak isterim. Belki sizlerinde başına gelebilir belkide gelmez.


Host firmayla görüşüp IIS ayarını yaptıktan sonra fck editör sorun çıkarabiliyor. Tabi eğer fck editör kullanıyorsanız:) Bu durumda sorunu düzeltmeye çalışmak yerine size tavsiyem CKEDITOR kullanmanız olacaktır. CKEDITOR,  FCKEDITOR ün yeni sürümü, tasarımı daha şık ve kullanışlı görünüyor.


 

Kaynaklar : http://www.buraksenyurt.com/post/AspNet-20-URL-Rewriting-Hakkc4b1nda-Gercekler.aspx



.Net Kod Parçaları Visual Basic .Net

Adı 
Yorum
Copyright © 2009 Gürcan ASLAN. Tüm hakları saklıdır.