برگزیده های پرشین تولز

آموزش : چگونه پسوند صفحات وب را مخفی کنیم !!! (url rewriting)

amin_lili

کاربر تازه وارد
تاریخ عضویت
24 آپریل 2007
نوشته‌ها
532
لایک‌ها
2
سن
43
محل سکونت
ای کاش آنجا ...
سلام
چند وقتی بود که دوستان در مورد حذف پسوند صفحات از نوار آدرس سوال داشتند و همچنین خود من نیز در مورد این موضوع اطلاعات اشتباه از یک منبع ( حالا دیگه کاملا نا مطمئن) دریافت کرده بودم که به اشتباه تصور می کردم امکان حذف پسوند فقط توسط هاست سنتر ها انجام میشه . اما چند وقت پیش با اشاره یکی از دوستان به ذهنم رسید در این مورد تحقیق کنم . نتیجه کار این شد که تصمیم گرفتم اونچه رو آموختم در قالب یک مقاله مختصر به شما دوستان عزیزم ارائه بدم .
و اما ...

برای این کار راههای مختلفی در اینترنت وجود داره و که من به یکی از راحت ترین و بهترینشون می پردازم .
ابتدا باید در مورد یکی از متدهای موجود در دات نت که این امکان رو به ما میده صحبت کنم . متد HttpContext.RewritePath() به ما این اجازه رو می ده که به طور داینامیک آدرسی خاص که توسط مرورگر درخواست میشه رو به مسیری جدید redirect کنیم . به عنوان مثال هر گاه آدرس http://www.mysite.com/mypage.html درخواست شد ، به آدرس http://www.mysite.com/mypage.aspx هدایت بشیم .
خب ، با دونستن این مطلب مساله رو به این شکل فرض می کنیم که : ما یک وب سایت داریم به نام www.HideExtensions.com که این سایت حاوی یک دایرکتوری به نام Dir1 می باشد و درون این دایرکتوری دو صفحه موجود است به نام های Page1.aspx و Page2.aspx . در root سایت هم صفحه Default.aspx رو داریم که حاوی دو Button هست که هر یک ما رو هدایت می کنه به یکی از دو صفحه فوق .
حالا می خوایم زمانی که به صفحه Page1.aspx میریم در نوار آدرس این تغییر بوجود بیاد :​

راه حل : به سایتمون فایل global.asax را اضافه می کنیم . ( کلیک راست بر روی وب سایت ، انتخاب گزینه Add New Item… و انتخاب گزینه Global Application Class ) . سپس درون این فایل متد زیر را اضافه می کنیم :​

کد:
[LEFT]
void Application_BeginRequest(object sender, EventArgs e)
    	{

        	string fullOrigionalpath = Request.Url.ToString();

        	if (fullOrigionalpath.Contains("~/Dir1/(.+)/"))
        	{
            	Context.RewritePath("~/Dir1/$1.aspx");
        	}
        
    	}

[/LEFT]

این متد زمانی فراخوانی میشه که یک درخواست برای مشاهده یک آدرس به سرور ارسال میشه . آدرس درخواست شده درون متغیر fullOrigionalpath ذخیره میشه و بررسی می کنیم چنانچه این آدرس متعلق به یکی از صفحات درون دایرکتوری Dir1 باشه و شکل آدرس درخواستی مثلا به شکل ~/Dir1/Page1/ باشه اون رو به آدرس واقعیش هدایت کنه . عبارت (.+) به معنای "هرچیزی" هست ، یعنی هر چیزی بعد از /Dir1/ بیاد به جای عبارت $1 در دستور Context.RewritePath("~/Dir1/$1.aspx"); قرار بگیره . مثلا اگر ما آدرس ~/Dir1/Page1/ رو درخواست کنیم به آدرس ~/Dir1/Page1.aspx میریم .
حالا لازمه مجوزهایی رو درون web.config ایجاد کنیم که به ما اجازه پردازش آدرسهای فوق رو بده . برای این کار یک dll بسیار مفید و کارساز وجود داره که لازمه دانلود کنیم . پس از دانلود این dll که نامش هست Intelligencia.UrlRewriter.dll اون رو به دایرکتوری bin وب سایتمون اضافه می کنیم (add reference) .
حالا به web.config رفته و در زیر تگ <configuration> عبارت زیر رو قرار میدیم.​


کد:
[LEFT]
<configSections>
<section name="rewriter" requirePermission="false" 				 type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
</configSections>

[/LEFT]


و پس از تگ <system.web> ، عبارت زیر را :

کد:
[LEFT]
<httpModules>
<add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>
</httpModules>
[/LEFT]


و بالاخره بعد از تگ بسته </system.web> عبارت زیر را وارد می کنیم :

کد:
[LEFT]
<rewriter>
		<rewrite url="~/Dir1/(.+)/" to="~/Dir1/$1.aspx" />
</rewriter>
[/LEFT]


حالا کافیه در صفحه Default.aspx دو عدد Button بگذارید و در رویداد هر یک کدهای زیر رو وارد کنید :

کد:
[LEFT]
protected void Button1_Click(object sender, EventArgs e)
    	{
        	Response.Redirect("~/Dir1/Page1/");
    	}
protected void Button2_Click(object sender, EventArgs e)
    	{
        	Response.Redirect("~/Dir1/Page2/");
    	}
[/LEFT]

همین!
من سورس مثال بالا را در قالب یک فایل زیپ به همین مطلب پیوست کردم که شامل dll مورد نظر هم هست .
امیدوارم توضیحات کامل باشه . هر جا سوالی بود در خدمتم!​
 

فایل های ضمیمه

  • HideExtensions.zip
    30.1 KB · نمایش ها: 437

mazoolagh

Registered User
تاریخ عضویت
10 آپریل 2004
نوشته‌ها
2,938
لایک‌ها
7
آیا نصب این dll احتیاج به اجازه هاست داره؟
 

Graveworm

Registered User
تاریخ عضویت
23 می 2005
نوشته‌ها
1,071
لایک‌ها
12
محل سکونت
Tehran

balabala

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
22 می 2005
نوشته‌ها
8,362
لایک‌ها
5,745
سن
41
محل سکونت
یه خورده اونورتر
ممنون! من دنبال PHPش هم هستم. راه ساده ای داشتید بگید بی زحمت.
 

alireza sh

مدیر بازنشسته
تاریخ عضویت
2 ژانویه 2006
نوشته‌ها
2,775
لایک‌ها
70
سن
40
محل سکونت
نصف جهان
با تشکر از دوست گرامی ، Amin خان از بابت این تاپیک پربار
 

tabeez

Registered User
تاریخ عضویت
7 دسامبر 2006
نوشته‌ها
260
لایک‌ها
0
مرسی امین جان، لازم بود منم تشکر کنم B-)
 

amin1us

کاربر تازه وارد
تاریخ عضویت
2 ژوئن 2004
نوشته‌ها
199
لایک‌ها
0
مرسی ،حالا سوال اینجا ست که تو ASP هم می شه این کارو کرد؟
آخه من مشکلی دارم اینکه الان 3 سال ASP کار می کنم و برام سخته که از ASP به .NET سویچ کنم.
حالا اگه کسی راه حلی به نظرش می رسه خبرم کنه.
مــــــــــــــــــــرسی
 

H_R

مدیر بازنشسته
تاریخ عضویت
30 مارس 2005
نوشته‌ها
3,298
لایک‌ها
17
سن
42
محل سکونت
North Pole
تا جایی که می میدونم توی asp.net به دلیل اینکه IIS فقط پسوند های ASPX رو به دات نت فریم ورک ارجا میده و برای بقیه پسوند ها به خودش مستقیما عمل میکنه اصولا نمیشه پسوند ASPX حذف کرد ، البته راهی که اسکات میچل توی مقاله طویلش پیشنهاد میکنه اینه که بیای و برای هر پسوندی که میخوای حذف کنی یه دایرکتوری بسازی و توش به فایل default.aspx قرار بدی ( البته محتوی این فایل مهم نیست و میتونه خالی باشه فقط مهم وجود این فایل و دایرکتوری مربوطه هست )
که در اکثر قریب به اتفاق موارد امکانش وجود نداره که شما بیاید و برای هر آدرسی که میخواید rewrite کنید یه فولدر درست کنید !
مثلا من میخوام 2 تا کوری استرین رو ریرایت کنم آدرسم هست

کد:
[URL="http://www.mywebsite.com/Mypage.aspx?qs1=123&qs2=456"]www.mywebsite.com/Mypage.aspx?qs1=123&qs2=456[/URL]

خوب من با امکانات urlrewriting میام و یه همچین آدرسی میسازم :
کد:
[URL="http://www.mywebsite.com/123/456/default.aspx"]www.mywebsite.com/123/456/default.aspx[/URL]

حالا اگر بخام اون default.aspx رو از ته آدرسم بردارم باید یه دایرکتوری بسازم به نام 123 یدونه دیگه توی اون بسازم به نام 456 و توش یه default.aspx قرار بدم حالا شما حساب کنید کوئری استرینگ های من فقط 200 تا اولی و 200 تا دومی باشه ( یه سایت خیلی خیلی جمع و جور ) من باید 40000 دایرتوری بسازم ! حالا حساب کنید من برای یه سایتی مثل movie-friends.com ام باید چند تا فولدر میساختم که از شر default.aspx تهش خلاص بشم ! اصولا دایرکتوری ساختن در دنیای واقعی عملی نیست و نمیشه از شر aspx خلاص شد ! مگر در این موارد :

1- از سرور خود ویژال استدیو استفاده کنیم ( چون این سرور حتی عکس ها رو هم به دات نت فریم ورک ارجا میده )

2- به تنظیمات IIS دسترسی داشته باشیم و اون روی طوری تنظیم کنیم که همه چیز رو به دات نت فریم ورک ارجا بده .

که هیچ یک از موارد بالا در دنیای واقعی ( روی اینترنت ) معمولا قابل اجرا نیست .

خوب حالا این همه حرف حرف زدیم دو کلمه هم راجعبه خود urlrewriting صحبت کنم :

بهترین کامپوننت که اتفاقا رایگان هم هست برای این کار http://www.urlrewriting.net/en/Default.aspx هست که خیلی قوی اه و برای ورژن 2 دات نت طراحی شده اونی که اسکات میچل برای ورژن 1 نوشته گاهی با بعضی از هاست ها مشکل پیدا میکنه ، من چون همیشه از اون اولی استفاده میکردم توی دات نت 2 هم از همون استفاده کردم ( مال اسکات میچل) و بعد دیدم که به روبت های گوگل نمیتونن صفحه رو ببنن و بهشون ارور page not found میده ! وقتی با urlrewriting.net عوضش کردم مشکل حل شد .

چیز جالبی که وجو داره اینه که خود asp.net 2 هم قابلیت urlrewriting رو به ما میده ولی این امکان خیلی ضعیف اه و به صورت داینامک تغییر آدرس ها رو پشتیبانی نمیکنه در صورتی که ما معمولا میخوایم کوئری استرینگ رو توی آدرس بیاریم ! (همونطوری که مثال زدم اول صحبتم )

اینم راهی که اسکات میچل برای asp.net 2 ارائه میده :

http://aspnet.4guysfromrolla.com/articles/011007-1.aspx

در ضمن از دوست خوبمون amin_lili هم ممنونم که نتایج تحقیقاتش رو اینجا با ما به اشتراک گذاشته و امیدوارم که این حرکت ادامه پیدا کنه :happy:.
 

amin_lili

کاربر تازه وارد
تاریخ عضویت
24 آپریل 2007
نوشته‌ها
532
لایک‌ها
2
سن
43
محل سکونت
ای کاش آنجا ...
با تشکر از دوست گرامی ، Amin خان از بابت این تاپیک پربار

مرسی امین جان، لازم بود منم تشکر کنم B-)

جالب بود مرسی

در ضمن از دوست خوبمون amin_lili هم ممنونم که نتایج تحقیقاتش رو اینجا با ما به اشتراک گذاشته و امیدوارم که این حرکت ادامه پیدا کنه :happy:.

سپاسگذارم از توجه دوستان :)
 

amir_3d_mad

Registered User
تاریخ عضویت
4 ژوئن 2007
نوشته‌ها
98
لایک‌ها
0
تا جایی که می میدونم توی asp.net به دلیل اینکه IIS فقط پسوند های ASPX رو به دات نت فریم ورک ارجا میده و برای بقیه پسوند ها به خودش مستقیما عمل میکنه اصولا نمیشه پسوند ASPX حذف کرد ، البته راهی که اسکات میچل توی مقاله طویلش پیشنهاد میکنه اینه که بیای و برای هر پسوندی که میخوای حذف کنی یه دایرکتوری بسازی و توش به فایل default.aspx قرار بدی ( البته محتوی این فایل مهم نیست و میتونه خالی باشه فقط مهم وجود این فایل و دایرکتوری مربوطه هست )
که در اکثر قریب به اتفاق موارد امکانش وجود نداره که شما بیاید و برای هر آدرسی که میخواید rewrite کنید یه فولدر درست کنید !
مثلا من میخوام 2 تا کوری استرین رو ریرایت کنم آدرسم هست

کد:
[URL="http://www.mywebsite.com/Mypage.aspx?qs1=123&qs2=456"]www.mywebsite.com/Mypage.aspx?qs1=123&qs2=456[/URL]

خوب من با امکانات urlrewriting میام و یه همچین آدرسی میسازم :
کد:
[URL="http://www.mywebsite.com/123/456/default.aspx"]www.mywebsite.com/123/456/default.aspx[/URL]

حالا اگر بخام اون default.aspx رو از ته آدرسم بردارم باید یه دایرکتوری بسازم به نام 123 یدونه دیگه توی اون بسازم به نام 456 و توش یه default.aspx قرار بدم حالا شما حساب کنید کوئری استرینگ های من فقط 200 تا اولی و 200 تا دومی باشه ( یه سایت خیلی خیلی جمع و جور ) من باید 40000 دایرتوری بسازم ! حالا حساب کنید من برای یه سایتی مثل movie-friends.com ام باید چند تا فولدر میساختم که از شر default.aspx تهش خلاص بشم ! اصولا دایرکتوری ساختن در دنیای واقعی عملی نیست و نمیشه از شر aspx خلاص شد ! مگر در این موارد :

1- از سرور خود ویژال استدیو استفاده کنیم ( چون این سرور حتی عکس ها رو هم به دات نت فریم ورک ارجا میده )

2- به تنظیمات IIS دسترسی داشته باشیم و اون روی طوری تنظیم کنیم که همه چیز رو به دات نت فریم ورک ارجا بده .

که هیچ یک از موارد بالا در دنیای واقعی ( روی اینترنت ) معمولا قابل اجرا نیست .

خوب حالا این همه حرف حرف زدیم دو کلمه هم راجعبه خود urlrewriting صحبت کنم :

بهترین کامپوننت که اتفاقا رایگان هم هست برای این کار http://www.urlrewriting.net/en/Default.aspx هست که خیلی قوی اه و برای ورژن 2 دات نت طراحی شده اونی که اسکات میچل برای ورژن 1 نوشته گاهی با بعضی از هاست ها مشکل پیدا میکنه ، من چون همیشه از اون اولی استفاده میکردم توی دات نت 2 هم از همون استفاده کردم ( مال اسکات میچل) و بعد دیدم که به روبت های گوگل نمیتونن صفحه رو ببنن و بهشون ارور page not found میده ! وقتی با urlrewriting.net عوضش کردم مشکل حل شد .

چیز جالبی که وجو داره اینه که خود asp.net 2 هم قابلیت urlrewriting رو به ما میده ولی این امکان خیلی ضعیف اه و به صورت داینامک تغییر آدرس ها رو پشتیبانی نمیکنه در صورتی که ما معمولا میخوایم کوئری استرینگ رو توی آدرس بیاریم ! (همونطوری که مثال زدم اول صحبتم )

اینم راهی که اسکات میچل برای asp.net 2 ارائه میده :

http://aspnet.4guysfromrolla.com/articles/011007-1.aspx

در ضمن از دوست خوبمون amin_lili هم ممنونم که نتایج تحقیقاتش رو اینجا با ما به اشتراک گذاشته و امیدوارم که این حرکت ادامه پیدا کنه :happy:.

خب من که از این کد انگلیسی سر در نیاوردم .
خیلی قاطی پاتیه !
در ضمن من یه مقاله واسه این کار پیدا کردم که نیاز به هیچ DLL ای نداره !
ولی نمیدونم اشکال کارم کجاست که نمیتونم اجراش کنم ؟
اینم مقاله : http://pietschsoft.com/blog/post.aspx?postid=762

اگه کسی بتونه کمکم کنه خیلی ممنون میشم .
من خیلی دنبالش گشتم ، اما هیچ کدوم جواب نداد !
در ضمن ما ASP.NET 2 میخوام این کارو انجام بدم !
 

amin_lili

کاربر تازه وارد
تاریخ عضویت
24 آپریل 2007
نوشته‌ها
532
لایک‌ها
2
سن
43
محل سکونت
ای کاش آنجا ...
دوست عزیز شما اگه پست اول تاپیک رو با دقت و حوصله بخونید توضیحات لازم برای سوال شما آورده شده . این روش تست شده و جواب داده . در مورد dll هم هیچ مشکلی ایجاد نمی کنه چون شما این dll رو به همراه سایتتون آپلود می کنید و بدون هیچ اشکالی استفاده می کنید.
 

amir_3d_mad

Registered User
تاریخ عضویت
4 ژوئن 2007
نوشته‌ها
98
لایک‌ها
0
دوست عزیز شما اگه پست اول تاپیک رو با دقت و حوصله بخونید توضیحات لازم برای سوال شما آورده شده . این روش تست شده و جواب داده . در مورد dll هم هیچ مشکلی ایجاد نمی کنه چون شما این dll رو به همراه سایتتون آپلود می کنید و بدون هیچ اشکالی استفاده می کنید.

مرسی آقا من تاپیک اول رو خوندم و جوابمو هم گرفتم .
فقط اگه ما دو تا QueryString داشته باشیم چیکار باید بکنیم ؟
من که هر چی سعی کردم نتونستم کاری بکنم .
 

amir_3d_mad

Registered User
تاریخ عضویت
4 ژوئن 2007
نوشته‌ها
98
لایک‌ها
0
من با این کد مشکل دارم .
تاپیک اول رو خوندم و انجامش دادم .
روی لوکال خود Visual Studio 2005 به خوبی کار میکنه و اجرا میشه .
ولی روی لوکال هاست ویندوز XP و حتی رو هاست خود سایت که ASP.NET 2 هستش اصلا اجرا نمیشه و Error میده !:eek:
میگه نمیتونه صفحه ای با آدرس فوق رو پیدا کنه در حالی در Visual Studio 2005 به خوبی اجرا میشه !
لطفا بگید من چیکار باید بکنم ؟ ؟ ؟
 

amir_3d_mad

Registered User
تاریخ عضویت
4 ژوئن 2007
نوشته‌ها
98
لایک‌ها
0
فک کنم این روش برای IIS 7 کار میکنه .
در حالی که IIS هاست سایت من ورژن 6 هستش !
حالا من چیکار کنم ؟
 

ehsan707

Guest
تاریخ عضویت
30 اکتبر 2007
نوشته‌ها
22
لایک‌ها
0
من از کد زیر که خودم نوشتم استفاده میکنم.
اگر شما subdomin رو ایجاد میکنید کافیه یک صفحه اونجا قرار بدید

کد:
<% 
dim strPath 
dim x 
Dim s
dim z 
strPath = (Server.MapPath("default.asp"))
'response.write (strpath) 
s= split(strpath,"\")
z=ubound(s)-1
response.redirect("http://www.abc.com/Redirect/default.aspx?userName=" & s(z) ) 

%>

این رو به اسم default.asp ذخیره کنید و در دایرکتوری ساب دومین بگذارید. برای هر یک از ساب دومینها یک صفحه لازم است ولی نیاز به تغیر کد نیست
بعد هم یک صفحه در سایت اصلی با شکل Redirect/default.aspx بسازید userName رو بخوانید
حله؟
 

amir_3d_mad

Registered User
تاریخ عضویت
4 ژوئن 2007
نوشته‌ها
98
لایک‌ها
0
ممنون ehsan707 عزیز !
میشه لطفا ساز و کار این کد رو کمی توضیح بدید ؟
یه کم برام مبهمه !
 
بالا