به نقل از aramdreamss در یکی از فرومها :
مشتری من یک وب سایت با تعدادی ساب دامین داشت که مثلا به شکل products.somedomain.com تعریف شده بودند.حالا مشتری می خواست اگر به عنوان مثال کاربر آدرس support.somedomain.com/helpdesk.aspx را درخواست کرد اطلاعات از somedomain.com/support/helpdesk.aspx برای او نمایش داده شود. یعنی کاربر همیشه آدرس
http://support.somedomain.com/helpdesk.aspx را در مرورگر خود ببیند ( در حالی که اطلاعات در پوشه support قرار دارند ) . این روند تغییر آدرس از آن چه که درخواست شده است " بازنویسی آدرس" نام دارد. در این مقاله ما یکی از راه های حل این مشکل را بررسی خواهیم کرد.
چه گزینه هایی برای بازنویسی URL در اختیار داریم؟
- ساده ترین و مناسب ترین راه استفاده از Application_BeginRequest و کلاس HttpContext برای بازنویسی آدرس است.
- استفاده از یک ماژول http در برنامه ASP.NET برای انجام این کار
-استفاده از یک فیلتر ISAPI که درخواست ها را بررسی و عمل بازنویسی را انجام دهد.
در این مقاله ما روش اول را آزمایش خواهیم کرد. علت استفاده از این روش برای انجام کار سادگی و سرعت تعریف آن می باشد. در موارد کلی تر و پیشرفته تر شما ممکن است دو روش دیگر را انتخاب کنید.
رویداد Application_BeginRequest
رویداد Application_BeginRequest اولین رویدادی است که در خط لوله ( Pipeline ) پردازش مربوط به HTTP اجرا می شود. این رویداد بهترین مکان برای قرار دادن کد بازنویسی آدرس است.
کلاس HttpContext
کلاس HttpContext شامل اطلاعات ویژه HTTP در مورد یک درخواست HTTP است.این کلاس همچنین به شما اجازه دسترسی به دیگر اشیا ASP.NET نظیر Request و Response را می دهد. این کلاس یک متد استاتیک به نام Current دارد که مراجع برنامه جاری را نگهداری می کند. متد RewritePath() در این کلاس کلید انجام عمل بازنویسی آدرس است. این متد به دو شکل در دات نت فریم ورک 1.1 تعریف شده است:
کد:
public void RewritePath(string);
public void RewritePath(string, string, string);
نقش اصلی متد RewritePath() به روز کردن مسیر شی Request و نیز مشخصه های Query String برای ماست.به عبارت دیگر استفاده از این متد این امکان را به ما می دهد تا از آدرس هایی استفاده کنیم که با مسیر داحلی صفحه تفاوت دارند.
مثال - گام به گام
- یک پروژه ASP.NET در سی شارپ بسازید.
-فایل web.config را باز کنید و تگ های زیر را به آن بیفزایید:
کد:
<appSettings>
<add key="productsSite" value="products"></add>
<add key="servicesSite" value="services"></add>
<add key="supportSite" value="support"></add>
</appSettings>
ما نام های فیزیکی پوشه هایی که صفحات واقعی در آنها قرار دارند را در بخش appSettings ذخیره می کنیم. ما این اطلاعات را بعدا در کدی که می نویسیم خواهیم خواند.
- سه پوشه جدید در برنامه خود بسازید : Products وServices و Support
-به هر یک از این پوشه ها یک وب فرم به نام MainPage.aspx اضافه کنید.
-فایل Global.asax را باز کنید و هندلر زیر را پیدا کنید:
protected void Application_BeginRequest (Object sender, EventArgs e)
- کد زیر را به Application_BeginRequest اضافه کنید :
کد:
string host,originalurl,newurl;
host=Request.Url.Host;
originalurl=Request.Url.PathAndQuery;
switch(host)
{
case "products.somedomain.com":
newurl="~/" +
ConfigurationSettings.AppSettings["productsSite"]
+ originalurl;
break;
case "services.somedomain.com":
newurl="~/" +
ConfigurationSettings.AppSettings["servicesSite"]
+ originalurl;
break;
case "support.somedomain.com":
newurl="~/" +
ConfigurationSettings.AppSettings["supportSite"]
+ originalurl;
break;
default:
newurl="~/" +
ConfigurationSettings.AppSettings["supportSite"]
+ originalurl;
break;
}
HttpContext.Current.RewritePath(newurl);
حالا بیایید کد را با هم بررسی کنیم:
ما ابتدا ویژگی هوست مربوط به درخواست را به کمک Request.Url.Host دریافت می کنیم. در مورد این مثال ما آن را به صورت چیزی شبیه به support.somedomain.com یا somedomain.com دریافت می کنیم.
ما همچنین مسیر و query string صفحه درخواست شده را به کمک Request.PathAndQuery بدست می آوریم. در سناریو ما این چیزی شبیه به /helpdesk.aspx خواهد بود.
عبارت switch هوست را تست می کند و بر اساس هوست دریافت شده ما اطلاعات مربوط به محل فیزیکی صفحه را از فایل web.config می خوانیم. ما آدرس جدید را از ریشه به این پوشه فیزیکی تغییر می دهیم ( با کاراکتر ~ )
در نهایت متد RewritePath() را از کلاس HttpContext فراخوانی می کنیم و آدرس جدید را به آن پاس می کنیم. در نتیجه زمانی که کاربر آدرسی نظیر support.somedomain.com را درخواست کند ما اطلاعات را از جایی مثل somedomain.com/support folder به کاربر خواهیم داد.
------------------------------------------------------------------------------------------
<system.web>
<urlMappings enabled="true">
<add url="~/Widget.aspx" mappedUrl="~/Products/W/Widgets.aspx"/>
</urlMappings>
</system.web>
من که نتونستم به هدفم برسم . اگه شما تونستی ، ما رو هم بی خبر نذار .