Url rewriting در asp.net (تغییر یا حذف پسوند aspx در آدرس صفحات)
بیایید فرض کنیم که ما در ابتدا یک صفحه به نام "Products.aspx" داریم که نام یک محصول رو به عنوان ورودی querystring می گیره و اطلاعات صفحه رو بر اساس نام محصول یا شناسه فیلتر میکنه. آدرس مربوط به صفحه Products.aspx، مثل اینه :
http://www.store.com/products.aspx?category=books
http://www.store.com/products.aspx?category=DVDs
http://www.store.com/products.aspx?category=CDs
به جای استفاده از یک querystring برای نمایش هر دسته، ما می خواهیم تا تغییری در آدرس ایجاد کنیم طوری که به نظر برسد که هر دسته از محصولات یک آدرس منحصر به فرد دارد و این به موتور جستجو هم بسیار کمک میکند تا محصولات شما را به درستی معرفی کند .در ادامه این پست بیش از 4 روش مختلف را برای چنین تکنیکی بررسی می کنیم .
روش 1 : استفاده از پارامترها Request.PathInfo به جای QueryStrings
در روش اول من قصد دارم برای نشان دادن آدرس ،از روشی برای بازنویس استفاده کنم که یکی از ویژگی های نا شناخته شده در ASP.NET است . ویژگی Request.PathInfo. برای درک بهتر این روش آدرس فروشگاه اینترنتی به شکل زیر را در نظر بگیرید :
http://www.store.com/products.aspx/Books
http://www.store.com/products.aspx/DVDs
http://www.store.com/products.aspx/CDs
آدرسی به این سبک دیگر حالت Querystring ندارد و با قرار دادن کاراکتر / پس از Products.aspx موتور های جستجو آنرا به عنوان سه آدرس متفاوت می شناسند و نه به عنوان یک آدرس اینترنتی با سه مقدار ورودی مختلف .
حالا سوال اینه که چه طور باید این آدرسو تو برنامه تشخیص داد و محتوای مورد نظر بیننده رو بهش نشون داد.
شما به سادگی می توانید به کمک Request.PathInfo پارامترهای بعد از / را از ادامه آدرس بخوانید:
public string GetCategory()
{
if ((Request.PathInfo.Length == 0)) {
return "";
} else {
return Request.PathInfo.Substring(1);
}
}Request.PathInfo Example
http://www.store.com/products/DVDs.aspx
برای این کار می توانیم از رخداد Application_BeginReques در Global.asax استفاده کنیم . مثال :
string fullOrigionalpath = Request.Url.ToString();
if (fullOrigionalpath.Contains("/Products/Books.aspx")) {
Context.RewritePath("/Products.aspx?Category=Books");
}
else if (fullOrigionalpath.Contains("/Products/DVDs.aspx")) {
Context.RewritePath("/Products.aspx?Category=DVDs");
}
}
البته نوشتن کدهایی شبیه به این روش بسیار خسته کننده و مستعد خطا خواهد بود .پس پیشنهاد می کنم تا از روش های دیگه استفاده کنید که بهترین اونها استفاده از ماژول هایی هستند که به صورت رایگان واسه دانلود وجود دارن .
این ماژول ها را در web.config معرفی می کنید و مشخص می کنید که چه الگوی آدرسی را برای تبدیل مد نظر دارید به نمونه کد زیر توجه کنید که از UrlRewriter.net استفاده شده است و در فایل web.config قرار داده شده است. ( نیازی به کد نویسی نیست )
<configuration>
<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
configSections>
<system.web>
<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
httpModules>
system.web>
<rewriter>
<rewrite url="~/products/books.aspx" to="~/products.aspx?category=books" />
<rewrite url="~/products/CDs.aspx" to="~/products.aspx?category=CDs" />
<rewrite url="~/products/DVDs.aspx" to="~/products.aspx?category=DVDs" />
rewriter>
configuration>
اگر بخواهید از روش بالا برای تجزیه آدرسها استفاده کنید برای سایتهای سایز سازمانی بسیار خسته کننده کننده خواهد . نگران نباشید همیشه روشهای راحت تر هم هست .
شما می توانید با استفاده از قابلیت regular expression یک قاعده کلی برای پویش آدرسها بنویسید . به کد زیر توجه کنید . نمونه ای از regular expression است برای تجزیه پارامترهای ورودی به این صفحه :
<rewrite url="~/products/(.+).aspx" to="~/products.aspx?category=$1" /ِ> ِ<ِ/ِrewriter>
با استفاده از این روش شما خیلی ساده تر و فوق العاده وب سایت خود را توسعه می دهید .
یک برنامه نمونه با استفاده از این تکنیک توسط اسکات گاتری طراحی شده که می تونه کمک خیلی خوبی برای درک بهتر این روش باشه .
باید متذکر شوم که در این روش نیازی به هیچگونه تغییری در تنظیمات سرور نیست . حال به شیوه بعدی می پردازیم .
روش 3 : استفاده از HttpModule برای انجام بازنویسی آدرس در IIS7
روش هایی که تا کنون گفته شد برای آدرسهایی مناسب است که پسوند aspx. در آدرس وجود دارد اما برای اینکه آدرس هایی ساده تر و خلوت تر از آنچه تا کنون گفته شد داشته باشیم باید کمی بیشتر تلاش کنیم .
در این روش می خواهیم آدرسی به شکل زیر را برای صفحه های وب داشته باشیم .
http://www.store.com/products/DVDs
http://www.store.com/products/CDs
این بهترین شکل آدرس برای یک محصول است به چند دلیل :
1- آسان به خاطر می ماند
2- موتور جستجو به آسانی دسته بندیش میکند
3- امنیت وب سایت را بالا می برد
پردازش آدرسهای فوق با استفاده از IIS5 و IIS6 آسان نیست و برای پردازش این شکل از آدرس ها باید ISAPI Extensions را در دات نت بازسازی کنید که این روش در بخش 4 تشریح خواهد شد. اما در IIS 7 مشکلی برای اینکار وجود ندارد و بدون هیچ تغییری در تنظیمات سرور می توانید وب سایت خود را با این روش آدرس دهی اجرا کنید .
به کد های زیر توجه کنید که تنظیمات مربوط به این شکل آدرس دهی را در web.config با استفاده از URLRewriter نمایش می دهد .
<configuration>
<configSections>
<section name="rewriter"
requirePermission="false"
type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
configSections>
<system.web>
<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter" />
httpModules>
system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" />
modules>
<validation validateIntegratedModeConfiguration="false" />
system.webServer>
<rewriter>
<rewrite url="~/products/(.+)" to="~/products.aspx?category=$1" />
rewriter>
configuration>
1) آن بر روی هر IIS 7.0 ماشین کار می کنند. شما یک مدیر لازم نیست که فعال کردن هر چه بر روی میزبان از راه دور. علاوه بر این در اعتماد متوسط حالات میزبانی مشترک کار می کنند.
2) از آنجا که من پیکربندی UrlRewriter در هر دو حالت
یک برنامه نمونه نیز برای این روش ارائه شده است که می توانید از اینجا دانلود کنید .
روش 4 : ISAPIRewrite به فعال کردن فرمت آدرس بدون پسوند برای IIS5 و IIS6
اگر نمی خواهید برنامه خود را روی سرور با IIS 7.0 اجرا کنید برای پیاده سازی این روش در IIS5 و IIS6 باید از فیلتر ISAPI برای بازنویسی آدرس ها استفاده شود .
برای استفاده از این روش بهترین ابزار موجود که رایگان هم هست Ionic's ISAPI Rewrite است .
برای بازنویسی آدرسها این ابزار یک ابزار تایید شده توسط بسیاری از شخصیت های برتر مایکروسافت است .
می توانید از وبلاگ اسکات هنسلمن هم تشریحی از این روش ببینید .
a day without learning is a lost day