UrlRewriter توسط Intelligencia.UrlRewriter
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه

Intelligencia.UrlRewriter یک DLL رایگان برای انجام بازنویسی URL‌ها در ASP.Net می‌باشد. به این صورت که بر اساس تنظیماتی که در فایل Web.Config انجام می‌شود، عمل تغییر URL را انجام میدهد و با زبان فارسی نیز سازگار است؛ مثل استفاده از عنوان فارسی در URL برای  SEO بهتر:

برای استفاده، ابتدا DLL مورد نظر را دانلود و به References‌ها اضافه می‌کنیم؛ دانلود فایل   Intelligencia.UrlRewriter.dll 

دانلود آخرین نسخه‌ی فایل از سایت مرجع:  urlrewriter.net

مرحله‌ی بعد تنظیمات Web.Config است که به صورت زیر می‌باشد:

<configuration>
  <configSections>
    <section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
  </configSections>
  <system.web>
    <httpModules>
      <add type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" name="UrlRewriter" />
    </httpModules>
  </system.web>
  <rewriter>
    <rewrite url="^.*-T([0-9]+)/?$*" to="~/ShowTerol.aspx?ID=$1" processing="stop" />
  </rewriter>
</configuration>

مرحله بعد تنظیم این است که کدام لینک‌ها بازنویسی شوند که در کد‌های بالا فقط یک مدل بازنویسی وجود دارد:

<rewrite url="^.*-T([0-9]+)/?$*" to="~/ShowTerol.aspx?ID=$1" processing="stop" />

و می‌گوید تمام لینک‌هایی را که در آخر آنها T- و عدد وجود دارد، به صفحه‌ی ShowTerol.aspx با یک کوئری استرینگ به نام ID که مقدار آن، همان عدد بعد حرف T میباشد بفرست.

یعنی این لینک را  

به این لینک تبدیل میکند                               

ShowTerol.aspx?ID=87
مثال‌های بیشتر
<rewrite url="^.*-p([0-9]+)/?$*" to="~/Products.aspx?p=$1" processing="stop"/>
<rewrite url="^.*-c([0-9]+)pa([0-9]+)/?$*" to="~/Default.aspx?c=$1&amp;pa=$2" processing="stop"/>
<rewrite url="^.*-c([0-9]+)/?$*" to="~/Default.aspx?c=$1" processing="stop"/>

الگوی تبدیلات توسط Regular Expansion

  • #
    ‫۱۱ سال قبل، شنبه ۳۰ شهریور ۱۳۹۲، ساعت ۰۳:۳۷
    سلام , با تشکر از پست خوبتون .
    بعد از اجرا سایت ارور 500 میده چیکار کنم ؟
     هم لوکال و هم روی هاست .
    خطا مربوط به این خط برنامه در Web.Config   است :
    <httpModules>
          <add type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" name="UrlRewriter" />
        </httpModules>

    • #
      ‫۱۱ سال قبل، شنبه ۳۰ شهریور ۱۳۹۲، ساعت ۰۳:۵۵
      خطای 500 یک خطای عمومی هست. اصل خطا چی بوده؟ چه stack trace ایی در صفحه لاگ میشه؟
      • #
        ‫۱۱ سال قبل، شنبه ۳۰ شهریور ۱۳۹۲، ساعت ۰۴:۱۶
        با تشکر از شما،
        مشکل را پیدا کردم. فکر کنم برای IIS‌های از 6 به بالا باید به سبک زیر تنظیم بشه .
          
        <configuration>
        <configSections>
            <section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter" />
          </configSections>
          
         <system.webServer>
            <modules>
              <add type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" name="UrlRewriter" />
            </modules>
          </system.webServer>
        
          <rewriter>
            <rewrite url="^.*-T([0-9]+)/?$*" to="~/ShowTerol.aspx?ID=$1" processing="stop" />
          </rewriter>
        </configuration>


        • #
          ‫۱۱ سال قبل، شنبه ۳۰ شهریور ۱۳۹۲، ساعت ۲۱:۱۱
          خوشحالم مشکلتون رفع شد ولی من بار‌ها استفاده کردم و مشکلی نداشتم
  • #
    ‫۱۰ سال و ۸ ماه قبل، جمعه ۴ بهمن ۱۳۹۲، ساعت ۰۲:۱۱
    سلام
    من این کارهایی که گفتید رو انجام دادم ولی تغییری حاصل نشد. به علاوه چند تا مسیج میده:
    Could not find schema information for the element 'rewrite'
    Could not find schema information for the attribute 'url'
    Could not find schema information for the attribute 'to'
     Could not find schema information for the attribute 'processing'   
    چی کار کنم؟
    • #
      ‫۱۰ سال و ۸ ماه قبل، جمعه ۴ بهمن ۱۳۹۲، ساعت ۱۴:۳۶
      سلام
      برای IIS‌های 6 به بالا همانطور که دوستمون اشاره کرد باید به جای
      <system.web>
          <httpModules>
            <add type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" name="UrlRewriter" />
          </httpModules>
        </system.web>

      از این استفاده کنیم 
       <system.webServer>
          <modules>
            <add type="Intelligencia.UrlRewriter.RewriterHttpModule,Intelligencia.UrlRewriter" name="UrlRewriter" />
          </modules>
        </system.webServer>
      دیگه نباید مشکلی وجود داشته باشه
  • #
    ‫۱۰ سال و ۸ ماه قبل، جمعه ۴ بهمن ۱۳۹۲، ساعت ۰۳:۲۲
    برای تبدیل Details.aspx?code=1 به Details/1 این کد درسته؟
        <rewrite url="~/Details/(.+)" to="~/Details.aspx?code=$1" processing="stop" />
    راستی میشه بپرسم چطور می‌تونم توی آدرس اسم محصولی رو که روش کلیک شده نشون بدم؟ یعنی به جای اون code=1 اسم محصولم رو نشون بده
    • #
      ‫۱۰ سال و ۸ ماه قبل، جمعه ۴ بهمن ۱۳۹۲، ساعت ۱۴:۴۵
      یه نمونه برنامه براتون ضمیمه کردم که همین کاری که گفتیدو انجام دادم

      موفق باشید
      • #
        ‫۱۰ سال و ۸ ماه قبل، شنبه ۵ بهمن ۱۳۹۲، ساعت ۰۰:۰۸
        واقعا ممنونم. من دقیقا دنبال این یه خط می‌گشتم:
        string.Format("Details/{0}-{1}", Eval("Name").ToString().Replace(" ", "-"),Eval("id")
        که البته من اون P رو حذف کردم. اگه بخوام id رو هم نشون نده فقط همون اسم محصول رو نشون بده باید چی کار کنم؟ یا مثلا بخوام فیلدهای دیگه محصول رو هم نشون بده. 
        • #
          ‫۱۰ سال و ۸ ماه قبل، شنبه ۵ بهمن ۱۳۹۲، ساعت ۰۳:۱۴
          خواهش میکنم
           شما باید بر اساس کلید در صفحه‌ی مقصد محصولی که فرستادیدو پیدا کنید منظورم کار این خطه 
          Label1.Text =
                          GetProducts.Get()
                              .Where(x => x.Id == int.Parse(Request.QueryString["PID"].ToString()))
                              .Select(x => x.Name)
                              .FirstOrDefault();
          اگه کد محصولو به صفحه‌ی که میخواهید جزییاتو تو اون نشون بدید نفرستید چجوری میخواید محصول مورد نظر رو شناسایی کنید تا بتونید جزییات اونو نشون بدید ؟
          البته راه‌های دیگه هم هست که مثلا نام محصولتون به عنوان کلید باشه و بر اساس اون محصولو تو صفحه‌ی مقصد شناسایی کنید که به نظر من اصلا کار منطقی نیست.
          یا کد محصولو توسط راه دیگری بجز URL بفرستید مثل session  که غیر منطقی تره .
          در کل میتونید  فقط نام محصولو بفرستید که اینطوری میشه
          <a href='<%# "Details/" + Eval("Name")%>'><%# Eval("Name") %></a>
          ولی چجوری محصولو تو صفحه‌ی مقصد میخواید شناسایی کنید تا جزئیاتشو نشون بدید؟
          بهترین راه اینه که کد محصول هم بفرستید.
          • #
            ‫۱۰ سال و ۸ ماه قبل، شنبه ۵ بهمن ۱۳۹۲، ساعت ۱۵:۴۰
            بله در این که باید کد محصول رو بفرستیم که شکی نیست ولی منظورم این بود راهی نیست که توی آدرس این کد نشون داده نشه؟ در واقع کد توی آدرس اصلی هست اما توی آدرس rewrite شده نشون داده نمیشه. مثلا این  نمونه رو ببینید. یه چیزی مثل این مد نظرم بود که البته زیاد مهم نیست.
            http://www.site.com/Product/DKP-14997/Samsung-Galaxy-S4-I9500-16GB/name
            یه سوال دیگه هم داشتم. اگه بخوام پسوند .aspx رو از آخر آدرس همه صفحات سایت حذف کنم باید چی کار کنم؟ ممنون.
            • #
              ‫۱۰ سال و ۸ ماه قبل، شنبه ۵ بهمن ۱۳۹۲، ساعت ۱۵:۴۸

              - اون DKP-14997 کد محصول است که یا منحصر بفرد تعریف شده یا کلید اصلی.

              - برای حذف از تمام سایت روش friendly urls هم هست علاوه بر روش مطلب جاری.

              • #
                ‫۱۰ سال و ۸ ماه قبل، شنبه ۵ بهمن ۱۳۹۲، ساعت ۱۸:۴۶
                همونطور که دوستمون اشاره کرد DKP-14997 تو سایت دیجی کالا کلید محصولاته.
                روشی که در این مطلب برای انجام  UrlReWrite خوندین به نظرم روش کامل و اصولی برای انجام باز نویسی یو آر ال‌ها نیست . اگه بخواید کاملا بر روی یو آر ال‌های سایت مدیریت داشته باشید باید از امکان مسیر یابی خود ASP.Net استفاده کنید.
                در وب فرم این مقاله کمکتون میکنه. در ام وی سی هم  این مطلب   .
                سایتهایی که اصولی هستند از قابلیت مسیر یابی خود ASP.Net استفاده میکنند. مثل همون دی جی کالا یا سایت جاری.
                • #
                  ‫۱۰ سال و ۸ ماه قبل، دوشنبه ۷ بهمن ۱۳۹۲، ساعت ۱۵:۱۰
                  من می‌خوام علاوه بر اینکه وقتی به یه صفحه جدید میرم آدرس عوض بشه، توی همون صفحه هم با ایجاد تغییراتی آدرس صفحه ام عوض بشه. مثلا وقتی کاربر سرچ می‌کنه صفحه تغییر نمی‌کنه و نتایج سرچ توی همون صفحه نشون داده میشه اما می‌خوام آدرس عوض بشه. به این صورت که عبارت سرچ شده توی آدرس بیاد. یا مثلا وقتی از داخل دراپ دان لیست یک ویژگی خاص محصول انتخاب میشه (که اینم به نوعی سرچ هست) اون ویژگی توی آدرس همون صفحه نشون داده بشه.
                  برای این کار از کدوم روش استفاده کنم بهتر و راحت تره؟ url rewriting, url routing, url friendly ؟
                  اگه یک راهنمایی هم در مورد اینکه چطور باید این کار رو انجام بدم بکنید ممنون میشم. یعنی وقتی صفحه عوض نمیشه من این تغییر رو دقیقا کجا باید اعمال کنم؟
                  • #
                    ‫۱۰ سال و ۸ ماه قبل، دوشنبه ۷ بهمن ۱۳۹۲، ساعت ۱۸:۰۱
                    - اطلاعات ارسالی توسط کاربر فقط زمانی در URL صفحه ظاهر می‌شوند که متد ارسال اطلاعات فرم، بجای Post حالت Get باشد.
                    - یا اینکه در حین Redirect خودتان دستی این کوئری استرینگ را تنظیم کنید.
                    Response.Redirect("tst.aspx?id=" + txtSrch.Text)
                    الان که این کوئری استرینگ رو دارید، مابقی آن مباحثی هست که در این مطلب و پرسش و پاسخ‌های آن مطرح شده.
                    • #
                      ‫۱۰ سال و ۸ ماه قبل، سه‌شنبه ۸ بهمن ۱۳۹۲، ساعت ۲۰:۵۷
                      اگه بخوام آدرسم به این صورت دربیاد tst/Keyword=txtSrch.Text باید به جای عبارت داخل " " چی بنویسم؟ الگوی تبدیلش رو هم میشه بگید؟ این الگوی تبدیل‌ها و نحوه نوشتن آدرس جدید خیلی سخته چطور باید اینا رو فهمید؟
                      • #
                        ‫۱۰ سال و ۸ ماه قبل، سه‌شنبه ۸ بهمن ۱۳۹۲، ساعت ۲۳:۴۶
                        برای ساختن لینکش همونطور کو دوستمون توضیح داد .
                        Response.Redirect("tst/" + txtSrch.Text)

                        برای باز نویسی آدرس اون هم 
                        <rewrite url="~/tst/(.+)" to="~/mypage.aspx?searchtxt=$1" />
                        که در صفحه‌ی مقصد با کوئری استرینگ searchtxt میتونید اطلاعاتو بدست بیارید.
                        همونطور که تو مطلب گفتم الگوی تبدیلات توسط  Regular Expansion  انجام میشه .
                        اینم یه مطلب که کمکتون میکنه.
  • #
    ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۰ بهمن ۱۳۹۲، ساعت ۰۲:۵۶
    اگه وب فرم‌ها توی فولدر جدا باشند، الگوی تبدیل چجوری میشه؟
    اگه اسم فولدر رو قبل از اسم پیج بیاریم صفحه بهم میریزه! اگه نیاریم هم جواب نمیده!
    • #
      ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۰ بهمن ۱۳۹۲، ساعت ۱۴:۰۶
      من از این روش برای تبدیلات ساده و کوچک استفاده کردم ، همونطور که گفتم  این روش به نظرم روش کامل و اصولی برای بازنویسی Url‌ها نیست و روش درستش استفاده از امکان Url Routing خود Asp.Net هستش.
      • #
        ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۰ بهمن ۱۳۹۲، ساعت ۱۴:۳۴
        من دات نت فریم ورکم 3.5 هست برای همین نمی‌تونم از url routing و url friendly استفاده کنم.
        • #
          ‫۱۰ سال و ۸ ماه قبل، پنجشنبه ۱۰ بهمن ۱۳۹۲، ساعت ۱۴:۴۱
          url routing از دات نت 3 و نیم، سرویس پک یک به بعد به صورت توکار و استاندارد، اضافه شده. فقط برای حالت دات نت سه و نیم باید یک سری تنظیمات اضافه‌تر به وب کانفیگ اضافه شوند (تعریف System.Web.Routing.UrlRoutingModule باید در قسمت httpModules ذکر شود).
  • #
    ‫۱۰ سال و ۲ ماه قبل، دوشنبه ۲۰ مرداد ۱۳۹۳، ساعت ۱۴:۳۳
    سلام.من کل مراحل رو انجام دادم ولی یک مشکل دارم که فکر میکنم به عبارت ریگولار رو اشتباه نوشتم.
    میخوام به طور مثال این آدرس:
    www.sample.com/page2/page2.aspx?MID=1251
    به این تبدیل بشه :
    www.sample.com/1251
    سوال دیگه ای که داشتم اینه که آیا توی صفحاتی که میخوام کوری استرینگ رو میخوام بگیرم باید کاری کنم؟
    و اینکه آیا با این روش فایل‌های CSS ,javascript مشکل پیدا نمیکنن؟
    • #
      ‫۱۰ سال و ۲ ماه قبل، دوشنبه ۲۰ مرداد ۱۳۹۳، ساعت ۲۱:۱۳
      سلام . همونطور که گفتم  به نظرم استفاده از امکان مسیر یابی خود دات نت بهترین گزینه است و نمیخواد خودتونو با ریگولار و ... درگیر کنید .
      آموزششو از اینجا میتونید  بخونید. 
      یه نمونه برنامه ساختم و کاری که میخواید رو از روش روتینگ خود دات نت   انجام دادم . یعنی این آدرس رو www.sample.com/1251  به صفحه‌ی News.aspx میفرسته و اونجا میتونید کد 1251 رو بخونید و کارتون را ادامه بدید.  Test-52676fa0948d4909be628f7a6a24bc5d.zip  
      در مورد روش درست لینک کردن فایل‌های جاوا اسکرسپت و css میتونید اینجا  متوجه بشید.
  • #
    ‫۹ سال و ۳ ماه قبل، چهارشنبه ۳ تیر ۱۳۹۴، ساعت ۲۰:۱۶
    سلام
    میشه url‌ها رو به جای قرار دادن در فایل وب کانفیگ از دیتابیس بارگذاری کرد؟