Asp.Net 4.0 ile gelen URL Routing ile SEO uyumlu sayfalar yapma

23 Eylül 2014

Url Routing url’lerimizin nasıl yönlendirileceği ve sonrasında nasıl yorumlandırılacağı işlemini yapmaktadır.

Arama motorları tarafından içeriklerimizin anlaşılır bir yapıda olması ve içeriklerimizin SEO uyumlu hale gelebilmesi için Url Routing’e ihtiyaç duymaktayız.

Örneğin :

www.ufukaytas.com/id=5 Arama motorları için bir anlam ifade etmez.

Bunun yerine ;
www.ufukaytas.com/Makale/Asp.Net-4.0-Url-Routing/5 gibi bir yöntemi kullandığımızda arama motorları sayfamızı daha doğru bir şekilde indexleme işlemi yapar.

Asp.Net 4.0 da bu Url Rewrite işlemini nasıl yaptığımız bir örnekle pekiştirelim…

Öncelikle global.asax dosyamızı açalım ve içine gerekli düzenlemeleri yapalım. Burada gelen requestleri ilgili sayfamıza yönlendirme işlemi yapmaktayız.

void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup
        RegisterRoutes(RouteTable.Routes);
    }

    public void RegisterRoutes(RouteCollection routes)
    {

        // Route tanımlaması yapıyoruz. Yapımız site.com/Makaleler/Makale-Adi/{ID} şeklinde olacak
        // bu şekilde bir url geldiğinde detay.aspx sayfamıza yönlendirme yapıyoruz...
        routes.MapPageRoute("MakaleRoute", "Makaleler/{MakaleAdi}/{MakaleID}", "~/detay.aspx");

    }

Şimdi bu yapıyı kullanabilmek için bir veritabanı oluşturalım ve makaleler adlı bir tablo yaratalım ve içine bir kaç kayıt girelim…


default.aspx sayfamızda datalist kontrolümüzü ekliyoruz ve sqldatasource ile veritabanından makaleleri yüklüyoruz…

<asp:DataList ID="DataList1" runat="server" CellPadding="4" 
        DataKeyField="MakaleID" DataSourceID="SqlDataSource1" ForeColor="#333333" 
        Width="1110px" onitemdatabound="DataList1_ItemDataBound">
        <AlternatingItemStyle BackColor="White" />
        <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
        <ItemStyle BackColor="#EFF3FB" />
        <ItemTemplate>
            MakaleID:
            <asp:Label ID="MakaleIDLabel" runat="server" Text='<%# Eval("MakaleID") %>' />
            <br />
            MakaleAdi:
            <asp:HyperLink ID="hlMakaleAdi" runat="server" Text='<%# Eval("MakaleAdi") %>' />
            <br />
<br />
        </ItemTemplate>
        <SelectedItemStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
    </asp:DataList>
    <form id="form1" runat="server">
    <div>

    </div>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server" 
        ConnectionString="<%$ ConnectionStrings:MakalelerConnectionString %>" 
        SelectCommand="SELECT [MakaleID], [MakaleAdi] FROM [Makaleler]">
    </asp:SqlDataSource>
Şimdi de Datalist’imizin ItemTemplate’indeki Hyperlink kontrolümüze ulaşarak NavigateUrl’yi bizim istediğimiz formatta yazacağız.

 protected void DataList1_ItemDataBound(object sender, DataListItemEventArgs e)
    {

        try
        {
            HyperLink hlMakaleAdi = (HyperLink)e.Item.FindControl("hlMakaleAdi");

            /*  Hyperlink için navagateUrl tanımlarken
             *  global.asax içinde tanımlamış olduğumuz (routes.MapPageRoute("MakaleRoute", "Makaleler/{MakaleAdi}/{MakaleID}", "~/makale_detay.aspx");)
             *  Makaleler/{MakaleAdi}/{MakaleID} yapıyı url'mizde oluşturuyoruz...  */
            hlMakaleAdi.NavigateUrl = "~/Makaleler/" + KodOlustur(DataBinder.Eval(e.Item.DataItem, "MakaleAdi").ToString()) + "/" + DataBinder.Eval(e.Item.DataItem, "MakaleID").ToString();

        }
        catch (Exception ex)
        {
            Response.Write(ex.Message);
        }
    }

Burada Hyperlink de url lerimizi resimdeki gibi  “/Makaleler/ASPNET-40-URL-ROUTING/7″  istediğimiz formatta oluşturduk. Makale Adındaki türkçe karakterleri ve boşlukları temizlemek için KodOlustur adlı Metodumuzu kullanıyoruz…

Kod Oluşturma Methodu
#region "Kod Oluştur"
    /// <summary>
    /// Makale Adı için gelen Başlığımızdaki türkçe karakterleri temizliyoruz ve boşlukları (-) ile değiştiriyoruz.
    /// </summary>
    /// <param name="Text"></param>
    /// <returns></returns>
    public static string KodOlustur(string Text)
    {
        try
        {
            string strReturn = Text.Trim();

            strReturn = strReturn.Replace("ğ", "g");
            strReturn = strReturn.Replace("Ğ", "G");
            strReturn = strReturn.Replace("ü", "u");
            strReturn = strReturn.Replace("Ü", "U");
            strReturn = strReturn.Replace("ş", "s");
            strReturn = strReturn.Replace("Ş", "S");
            strReturn = strReturn.Replace("ı", "i");
            strReturn = strReturn.Replace("İ", "I");
            strReturn = strReturn.Replace("ö", "o");
            strReturn = strReturn.Replace("Ö", "O");
            strReturn = strReturn.Replace("ç", "c");
            strReturn = strReturn.Replace("Ç", "C");
            strReturn = strReturn.Replace("-", "+");
            strReturn = strReturn.Replace(" ", "+");
            strReturn = strReturn.Trim();
            strReturn = new System.Text.RegularExpressions.Regex("[^a-zA-Z0-9+]").Replace(strReturn, "");
            strReturn = strReturn.Trim();
            strReturn = strReturn.Replace("+", "-");
            return strReturn;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

#endregion

Artık Url’lerimiz bizim istediğimiz formatta oluştu ve global.asax daki tanımlamamıza göre detay.aspx sayfasına yönlenmiş oldu.

Şimdi detay sayfasında Route ile gelen parametlerele nasıl ulaştığımıza bakalım…

Öncelikle detay.aspx adlı bir sayfa oluşturalım ve içine alttaki label’ları ekleyelim…

 <h1>Detay Sayfa</h1> 

    <p>Gelen ID : <asp:Label ID="lblMakaleID" runat="server"></asp:Label></p>
    <p>Başlık : <asp:Label ID="lblMakaleBaslik" runat="server"></asp:Label></p>

Daha sonra Page_Load da alttaki kodları ekleyelim…

routes.MapPageRoute da tanımladığımız “MakaleID” ve “MakaleAdi” adlı parametrelere RouteData.Value ile ulaşıyoruz.

Burada içeriğin ilgili ID sine ulaştıktan sonra geriye veritabanındaki tablodan o içeriğin bilgilerini çekmek kalıyor.

 protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            if (RouteData.Values["MakaleID"] != null)
            {
                lblMakaleID.Text = RouteData.Values["MakaleID"].ToString();
                lblMakaleBaslik.Text = RouteData.Values["MakaleAdi"].ToString();
            }

        }
    }


Yönlendirme işlemimizi tamamlamış olduk.

Peki bazı sayfaların kısıtlanmasını istersek ne yapacağız.

Bunun için Ignore metodunu kullanabiliriz. Ignore işlemini Regular Expression yardımıyla yapmaktayız.

Örnek olarak :

// .aspx sayfalarımızı yok sayıyoruz (ignore)  
routes.Ignore("{*allaspx}", new { allaspx = @".*\.aspx(/.*)?" });


Örnek projeyi indirmek için link

Başka bir yazıda görüşmek dileğiyle…

Saygılarımla...
Ufuk Aytaş