exchanging

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

شروع موضوع توسط amin_lili ‏17 جولای 2007 در انجمن asp , ASP.NET

  1. amin_lili

    amin_lili کاربر تازه وارد

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

    برای این کار راههای مختلفی در اینترنت وجود داره و که من به یکی از راحت ترین و بهترینشون می پردازم .
    ابتدا باید در مورد یکی از متدهای موجود در دات نت که این امکان رو به ما میده صحبت کنم . متد 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 مورد نظر هم هست .
    امیدوارم توضیحات کامل باشه . هر جا سوالی بود در خدمتم!​
     

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

  2. tabeez

    tabeez Registered User

    تاریخ عضویت:
    ‏7 دسامبر 2006
    نوشته ها:
    260
    تشکر شده:
    0
    تست میکنم...
    فعلا
     
  3. mazoolagh

    mazoolagh Registered User

    تاریخ عضویت:
    ‏10 آپریل 2004
    نوشته ها:
    2,940
    تشکر شده:
    7
    آیا نصب این dll احتیاج به اجازه هاست داره؟
     
  4. Graveworm

    Graveworm Registered User

    تاریخ عضویت:
    ‏23 می 2005
    نوشته ها:
    1,063
    تشکر شده:
    12
    محل سکونت:
    Tehran
    استفاده ازdll در .net تا زمانی که به فایلهای سیستمی کاری نداشته باشه، مجازه ..
    البته از فار از آی نو :دی
     
  5. balabala

    balabala کاربر قدیمی پرشین تولز

    تاریخ عضویت:
    ‏22 می 2005
    نوشته ها:
    7,351
    تشکر شده:
    1,332
    محل سکونت:
    یه خورده اونورتر
    ممنون! من دنبال PHPش هم هستم. راه ساده ای داشتید بگید بی زحمت.
     
  6. alireza sh

    alireza sh مدیر بازنشسته

    تاریخ عضویت:
    ‏2 ژانویه 2006
    نوشته ها:
    2,668
    تشکر شده:
    66
    محل سکونت:
    نصف جهان
    با تشکر از دوست گرامی ، Amin خان از بابت این تاپیک پربار
     
  7. tabeez

    tabeez Registered User

    تاریخ عضویت:
    ‏7 دسامبر 2006
    نوشته ها:
    260
    تشکر شده:
    0
    مرسی امین جان، لازم بود منم تشکر کنم B-)
     
  8. amin1us

    amin1us کاربر تازه وارد

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

    ma_christian Registered User

    تاریخ عضویت:
    ‏25 ژانویه 2007
    نوشته ها:
    366
    تشکر شده:
    2
    محل سکونت:
    Tehran
    آره اگر ASP هم باشه خیلی خوب میشه.
     
  10. @gh@m@hdi

    @[email protected]@hdi Registered User

    تاریخ عضویت:
    ‏13 مارس 2006
    نوشته ها:
    1,728
    تشکر شده:
    214
    محل سکونت:
    فعلا پشت شیشه مونیتور شما
  11. H_R

    H_R مدیر بازنشسته

    تاریخ عضویت:
    ‏30 مارس 2005
    نوشته ها:
    3,285
    تشکر شده:
    15
    محل سکونت:
    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:.
     
  12. amin_lili

    amin_lili کاربر تازه وارد

    تاریخ عضویت:
    ‏24 آپریل 2007
    نوشته ها:
    528
    تشکر شده:
    2
    محل سکونت:
    ای کاش آنجا ...
    سپاسگذارم از توجه دوستان :)
     
  13. avajang.com .leftavajang.com.right
  14. amir_3d_mad

    amir_3d_mad Registered User

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

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

    amin_lili کاربر تازه وارد

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

    amir_3d_mad Registered User

    تاریخ عضویت:
    ‏4 ژوئن 2007
    نوشته ها:
    98
    تشکر شده:
    0
    مرسی آقا من تاپیک اول رو خوندم و جوابمو هم گرفتم .
    فقط اگه ما دو تا QueryString داشته باشیم چیکار باید بکنیم ؟
    من که هر چی سعی کردم نتونستم کاری بکنم .
     
  17. amir_3d_mad

    amir_3d_mad Registered User

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

    amir_3d_mad Registered User

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

    amir_3d_mad Registered User

    تاریخ عضویت:
    ‏4 ژوئن 2007
    نوشته ها:
    98
    تشکر شده:
    0
    تو رو خدا یکی جواب بده ! ! ! :(
     
  20. ehsan707

    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 رو بخوانید
    حله؟
     
  21. amir_3d_mad

    amir_3d_mad Registered User

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