URL Rewriting в ASP.NET


    Бывают случаи, когда Вам необходимо оптимизировать ссылки таким образом, чтобы они лучше индексировались поисковыми системами (в целях SEO и не только). Допустим, когда Вам надо переписать ссылки включающие в себя знаки "?", "&" и "=" в более читабельный вид.

    Например Вы хотите переделать ссылку следующего вида:
    www.domain.com/default.aspx?category=Title&entry=Name

    В такую, более понятную:
    www.domain.com/Title/Name

    Есть несколько способов добиться Url Rewriting в ASP.NET.

    1. Можно воспользоваться тем, что дает Вам стандартрый ASP.NET 2.0, то есть использовать элемент urlMappings. Добавляем следующие строки в файл Web.config:

    <system.web>
     <urlMappings enabled=«true»>
      <add url="~/Home.aspx" mappedUrl="~/Default.aspx?tab=home" />
     </urlMappings>
    </system.web>
    * This source code was highlighted with Source Code Highlighter.

    Данный способ прост и удобен, но тут все ссылки будут "hardcoded". Воспользовавшись этим способом Ваши возможности будут ограничены. Вы не сможете динамически переписать ссылки.


    2. Также существует Open Source модуль под названием UrlRewritingNet.UrlRewrite. UrlRewritingNet это по сути набор DLL файлов. Чтобы работать с ними, Вам необходимо переписать их в директорию /Bin/ вашего проекта.

    Далее, добавляем следующие строки в файл Web.config Вашего проекта:

      <configuration>
       <configSections>
        <section name=«urlrewritingnet» requirePermission=«false» type=«UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter»/>
       </configSections>
      <configuration>

      <system.web>
       <httpModules>
        <add name=«UrlRewriteModule» type=«UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter»/>
       </httpModules>
      </system.web>
    * This source code was highlighted with Source Code Highlighter.

    и наконец сами правила переписывания ссылок:
    <urlrewritingnet rewriteOnlyVirtualUrls=«true» contextItemsPrefix=«QueryString» defaultPage = «default.aspx» xmlnswww.urlrewriting.net/schemas/config/2006/07» >
     <rewrites>
      <add name=«Rule1» virtualUrl="^~/(.*)/Detail(.*)&#60;/strong>.aspx" rewriteUrlParameter=«ExcludeFromClientQueryString» destinationUrl="~/Default.aspx?language=$1&id=$2" ignoreCase=«true» />
      .
      .
      .
     </rewrites>
    </urlrewritingnet>
    * This source code was highlighted with Source Code Highlighter.
    Как видно из примера, UrlRewritingNet позволяет динамически переписать ссылки при помощи регулярных выражений.

    Использовать UrlRewritingNet удобно в случаях, когда у вас нет выделенного хостинга (dedicated hosting), то есть когда у Вас нет возможности переписывать URL на уровне сервера.

    О всех возможностях UrlRewritingNet можно почитать более подробно здесь, а скачать сам модуль можно здесь.

    3. А самым, на мой взгляд, правильным способом переписывать URL будет по средствам ISAPI Rewrite фильтра. Это модуль для IIS, который принимает стандартные правила написанные для Apache .htaccess mod_rewrite. Его надо установить в качестве ISAPI Filter через IIS на самом сайте.

    Пример файла .htaccess для переписывания ссылок:

    RewriteEngine on
    RewriteRule ^/(.*)/(.*)/(.*).aspx /Default.aspx?Title=$1&Description=$2&Topic=$3

    В данном примере мы хотим обращаться к следующей ссылки:
    www.domain.com/Default.aspx?Title=A&Description=B&Topic=C

    Через такую, более читабельную и короткую:
    www.domain.com/A/B/C.aspx

    А вот так, допустим, можно побороть пожирание трафика с вашего сайта, заблокировав отображение картинок с других сайтов, которые находятся физически на Вашем сайте:

    RewriteEngine on
    RewriteCond %{HTTP:Host}#%{HTTP:Referer} ^([^#]+)#(?!http://\1).+
    RewriteRule .*\.(?:gif|jpg|png) /block.gif [NC]

    ISAPI Rewrite переписывает URL на уровне IIS. Здесь Ваши возможности практически неограниченны. Возможности ISAPI Rewrite не ограничиваются только переписыванием ссылок.

    Про ISAPI Rewrite фильтр написано более подробно здесь, а скачать бесплатный модуль можно здесь. Разница между бесплатной и платной версиями в том, что в бесплатной версии все правила сохраняются в одном файле и действительный для всех сайтов под IIS. В платной же версии правила можно писать под конкретные сайты.

    Полезные статьи на эту тему:
    URL Mapping in ASP.NET 2.0
    Tip/Trick: Url Rewriting with ASP.NET
    A Complete URL Rewriting Solution for ASP.NET 2.0
    URL Rewriting in ASP.NET

    P.S.
    Это мой первый более или менее серьезный пост на Хабре, поэтому не судите строго.
    Буду рад всяческим поправкам в русском языке и не только. :)
    Поделиться публикацией

    Комментарии 15

      +1
      Полезная статья. Хочу добавить, что такая возможность есть в asp.net MVC framework.
      Презентация этого дела тут =>
      https://msdb.ru/Downloads/msdn/webcasts/1032372636/MVCFrameworkWebCast.pptx

      обзорная статья тут =>
      http://weblogs.asp.net/scottgu/archive/2007/11/13/asp-net-mvc-framework-part-1.aspx
        0
        Спасибо, посмотрю.
        Я все никак VS 2008 не поставлю..
        +1
        Если не ошибаюсь то UrlRewritingNet не позволяет делать rewrite на директории, а только на файлы.

        Для коллекции ещё один модуль:
        http://www.codeproject.com/KB/aspnet/nUrlRewriter1.aspx

        В MVC это всё конечно-же проще.
          0
          Честно говоря не знаю, с директориями не работал..
          Надо будет посмотреть на этот MVC как-нибудь.
          0
          Пока MS ASP.NET MVC Framework не релиз, они постоянно в нем что-то меняют, но то, что на данный момент представляет собой механизм Routing'а - это что-то с чем-то! Действительно мощная штучка.
            0
            Ну, это я к тому, что стоит ознакомиться :)
            0
            А как же метод "ручками" через HttpModule или 404-страницу? :)
              0
              Это как?
                +1
                Ближе на второй вариант похоже, но собственная реализация. Можно с конфигурацией через web.config, а можно и поместу прописать пару регулярных выражений, если страниц на сервере не так уж много.
                Если через HttpModule, то в HttpApplication.BeginRequest проверяем запрашиваемый урл и при необходимости делаем Server.Transfer на нужную страницу.
                Если делать через 404, то все запросы к файлам которых нет физически на сервере направляются на него. Там разбираем опять же запрашиваемый урл и трансферим куда нужно.

                Параметры при этом передаются либо через HtppContext.Items, либо через Server.Transfer с собственной строкой QueryString, но тогда проблему с постбеком приходится решать через написание собственной Form.

                Как-то страшно выглядит, то что написал. На самом деле не так уж все сложно :)
                  0
                  Да не, написал все нормально, смысл понятен. :)
                  Но, эти решения (2 и 3) все-таки для большого количеств страниц подходят больше.
                  Да и готовые уже решения, самому ничего не надо писать. Правда ты конечно зажат в рамках модуля.
                    0
                    Кстати у нас именно так сейчас и сделано на проектах - второй вариант. Но там оч много проблем с постбэком, и другим. Потихоньку дописываем rewriting первого варианта. Как будет готов, может напишу об этом.
                      0
                      Варианты рассматриваемые мною или автором статьи?
                      Если мною, то они в общем-то практически аналогичны по логике выполнения, только место где они выполняются - разные.
                      В одном из проектов я перешел на Rewriting с помощью 404 для того, чтобы появилась возможность обрабатывать обращения к каталогам, например, /blog/net/
                      При этом в самом IIS нужно настроить свою aspx-страницу для 404, где мы и обработаем этот запрос. С постбеком, насколько я занаю, проблемы будут в обеих случаях, поэтому приходится писать свой контрол Form и там подменять аттрибут Action на тот, что указан в URL, а не исполняемой страницы.
                0
                ISAPI Rewrite очень удобный, но установят его не на всякий хостинг.
                Ещё можно упомянуть про возможности IIS7 - тут даже необходимости в ISAPI Rewritе нет (про этот способ есть у Scott Guthrie).
                  0
                  Это точно.
                  Мы его используем на выделенном хостинге.
                  0
                  Столкнулся с проблемой. UrlRewritingNet не позволяет делать реврайт на директории. Работает только в том случае, если расширение ".aspx". Чтобы работало, надо прописать в настройках IIS, (Home Directory->Configurations->Mappings) Wildcard application maps, вот такой путь «c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll».
                  После такого «лечения», все заработало

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое