ASP.NET

آدرسهای تر و تمیز یا من چگونه با جستجوگرها دوست شدم؟

Clean URL و Friendly URL و Search Engine Friendly URL همگی نامهای گوناگونی است که برای یک چیز گذاشته‏اند. فرض کنید که شما به عنوان برنامه‏نویس در بخش مدیریت به مدیر سایت اجازه داده‏اید تا صفحات مورد نظر خود را ایجاد کند. شما این صفحات را در بانک اطلاعاتی می‏نویسید. حالا کاربر با زدن نشانی زیر می‏تواند، محتوای این صفحه را ببیند:

جستجوگرها چندان این نشانی را نمی‏پسندند و اگر شما چنین سایتی را تولید کنید چندان بنای دوستی با شما را نمی‏گذارند. ولی اگر بتوانید کاری کنید که آدرس شما چیزی شبیه به این شود، داستان کمی فرق خواهد کرد:

البته روشن است که در سایت شما واقعا فایلی به اسم page-47.aspx وجود ندارد و این تنها یک آدرس مجازی یا یک Alias به آدرس واقعی است.

انجام این کار در Apache و PHP به سادگی آب خوردن است. کافی است افزونه Mod_Rewrite را در Apache فعال کنید (این افزونه در بیشتر میزبانهای امروزی فعال است) و در شاخه اصلی سایتتان فایلی به نام .htaccess درست کنید و در آن یک Rule یا قانون Rewrite بنویسید. چیزی شیبه به این کار را راه می‏اندازد:


RewriteEngine On
RewriteBase /
RewriteCond % !-f
RewriteCond % !-d
RewriteRule . /index.php [L]

در این Rule هر درخواستی که به این سایت انجام شد به فایل index.php فرستاده می‏شود. حالا در فایل index.php خیلی ساده می‏شود با $_SERVER["REQUEST_URI"] نشانی مجازی که کاربر وارد کرده است را پیدا کرد و محتوای مناسب با آن را به کاربر نشان داد. بر این اساس اگر کاربر نشانی site.com/products/1 را وارد کنید شما در فایل index.php می‏توانید نشانی products/1 را پیدا کنید، و صفح محصول اول را به او نشان دهید. در حالی که واقعا هیچ شاخه‏ای به اسم products و 1 وجود ندارد.

انجام این کار هیچ وقت در IIS و ASP به راحتی Apache نبوه است. برای این کار لازم است تا در فایل Global.asax خودتان یک رویداد BeginRequest بنویسید. این رویداد در آغاز رسیدن Request به Web Server فراخوانی می‏شود. حالا در این رویداد می‏توانید با کمک HttpContext مسیر فعلی یا (incoming) را پیدا کرده و بر اساس نیاز خودتان با کمک متند RewritePath مسیر مجازی را به مسیر واقعی تبدیل کنید.

یک نمونه خیلی ساده این کار:

protected void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext incoming = HttpContext.Current;
string oldpath = incoming.Request.Path.ToLower();
string pageid; // page id requested

// Regular expressions to grab the page id from the pageX.aspx
Regex regex = new Regex(@"page(\d+).aspx",  RegexOptions.IgnoreCase |
RegexOptions.IgnorePatternWhitespace);
MatchCollection matches = regex.Matches(oldpath);

if(matches.Count > 0)
{
// Extract the page id and send it to Process.aspx
pageid = matches[0].Groups[1].ToString();
incoming.RewritePath("Process.aspx?pageid=" + pageid);
}
else
// Display path if it doesn’t containt pageX.aspx
incoming.RewritePath(oldpath)
}
}

ما در اینجا همه مسیرها را به فایل Process.aspx فرستاده‏ایم. حالا باید چنین فایلی را درست کنید و در آن به سادگی با کمک Request.QueryString["pageid"] می‏توانید شماره صفحه مورد نظر کاربر را پیدا کنید.

کلیدواژه: URL Rewriting

Syndicate content