
А теперь пришло время понять, зачем мы разбирали нелегкий жизненный путь запросов :) Вспомните, кроме всего прочего, мы хотели перенаправлять urls типа
http://news.ru/fooball/. Все ли мы сделали, чтобы работать с такими запросами? Уже догадались, в чем дело? Правильно! Все, о чем мы только что говорили,
реализовано в нашем веб-приложении на ASP.NET. Но для того, чтобы ему выполнить rewriting, он должен как минимум получить управление. По умолчанию IIS
настроен так, чтобы передавать управление ASP.NET при запросах страниц с расширением .aspx (и еще некоторых расширений). Если же он получит запрос без
расширения, то будет думать, что это каталог и попробует определить для этого пути документ по умолчанию - то есть сделает вовсе не то, что нам нужно.
Поэтому, чтобы мы могли обрабатывать такие запросы, нам прийдется немного повозится с настройками. Для IIS 6.0 мы воспользуемся "wildcard application mappings".
Если в диалоге "Application Configuration"
(см.
рис. 3)
мы добавим aspnet_isapi.dll в список приложений, мы будем получать управление при каждом запросе
к IIS, вне зависимости от расширения файла.
Для IIS 7.0 все еще проще. Вам не понадобиться менять его настройки, для этого достаточно изменить конфигурационный файл приложения. IIS 7.0 позволяет
выполнять модули ASP.NET как будто бы это его собственные модули. Измените web.config следующим образом:
<configuration>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<add name="UrlRewriter" type="MyAssembly.UrlRewriterModule" />
<validation validateIntegratedModeConfiguration="false" />
</modules>
</system.webServer>
</configuration>
|
Аттрибут runAllManagedModulesForAllRequests позволяет выполнять наш ASP.NET HttpModule в качестве модуля IIS 7.0.
Вот теперь окончательно все, теперь мы знаем достаточно, чтобы реализовать SEO friendly карту сайта для news.ru.
А вот и время десерта! Понятно, что должны существовать библиотеки, реализующие все то, что мы так долго обсуждали. Причем существуют как полностью
бесплатные решения, так и бесплатные Lite версии решений, которые в полной версии уже стоят денег. Но и Lite версии полностью функциональны и вполне
покроют наши нужды.
Все библиотеки можно разделить на два класса:
- реализованные как ISAPI Filters на unmanaged С++
- реализованные как ASP.NET HttpModules (на любом .NET совместимом языке)
Их достоинства и недостатки:
-
ISAPI Filters выполняются под IIS и не требуют передачи управления ASP.NET (т.е.
мы экономим на случаях, когда обращения идут не к нашим urls, а, например, к скриптам
или изображениям).
-
Для инсталляции ISAPI Filters необходимы права на изменения конфигурации IIS.
Правда, если мы хотим обрабатывать urls без расширений, нам понадобится менять настройки
IIS даже в случае ASP.NET решения.
-
Конфигурационный файл для ISAPI Filters стараются делать совместимым по формату
с mod_Rewrite файлом сервера Apache, т.е. он представляет собой текстовый файл со
строками-инструкциями примерно такого вида:
[ISAPI_Rewrite]
# Single domain name is news.ru
RewriteCond Host: www.news.ru
RewriteRule (.*) http://news.ru$1 [RP,I]
|
Конфигурационные файлы ASP.NET библиотек обычно представляют собой xml файлы примерно такого вида:
<urlrewriter
rewriteOnlyVirtualUrls = "true"
contextItemsPrefix = "QueryString"
defaultPage = "default.aspx"
defaultProvider = "RegEx"
xmlns = "http://www.urlrewriting.net/schemas/config/2006/07">
<rewrites>
<add name = "RewriteOnDomain" virtualUrl="^http\://(.*)/SampleWeb/domain/(.*)/Detail(.*).aspx"
rewriteUrlParameter = "ExcludeFromClientQueryString"
destinationUrl = "~/Default.aspx?language=$3&id=$4;&domain=$1"
rewrite = "Domain"
ignoreCase = "true" />
...
|
С одной стороны у них больше возможностей, с другой, особенно когда правил очень много, понимать и править файлы для IIS намного проще -
они не так перегружены дополнительными тегами и свойствами.
-
ASP.NET модули могут реализовывать какие-нибудь дополнительные возможности и вобще легко взаимодействуют с вашим приложением,
так как собственно и являются его частью. Например, вы можете реализовать свою логику rewriting, основанную не только на правилах
с регулярными выражениями или разработать более функциональную систему логирования.
В своей работе я использовал ISAPI filter "
ISAPI_rewrite" компании Helicon, поэтому
решение нашей задачи я покажу именно на его примере. Но сейчас, мы дойдем до конца (точнее, до начала) нашего списка ссылок, чтобы посмореть,
что мы вообще можем использовать. Итак, четвертая снизу ссылка
UrlRewritingNet.UrlRewrite - это бесплатная библиотека, написанная под ASP.NET 2.0. Она позволяет задавать правила, основанные на
регулярных выражениях и обеспечивает корректную работу страниц при post-back. Судя по описанию, эта библиотека позволяет нормально использовать
другие ASP.NET технологии, с которыми могут возникнуть проблемы (а-ля post-back) при rewriting: темы, master pages, cookieless sessions.
Полезный момент - в этом решении для разбора и выполнения правил используется модель, основанная на провайдерах. В библиотеке реализован
провайдер правил на базе регулярных выражений. Однако, если вам будет мало этой функциональности, вы сможете добавить своего провайдера,
в котором и реализуете всю необходимую вам логику.
Следующая ссылка в нашем списке
Библиотека, очень похожая на предыдущую. Отличается намного более обширным набором правил, команд и операторов, которые вы можете использовать
при определении ваших правил. Так же бесплатная.
Дальше идут ISAPI Filters
Бесплатный ISAPI фильтр, поддерживающий mod_Rewrite-подобный синтаксис конфигурационного файла. По возможностям очень напоминает следующее и последнее
в нашем обзоре решение (ISAPI rewrite). Возможно, эти различия можно бы было найти, серьезно используя оба решения в работе, но я в свое время
выбрал "ISAPI rewrite". Он до сих пор меня вполне устраивает, так что у меня просто нет необходимости тратить время на более серьезный анализ.
И наконец последняя (то есть первая) ссылка нашей выборки
Это - ISAPI Filter фирмы Helicon, разрабатывающей для веб-сайтов и другие продукты, основанные на rewriting (например
"
Hotlink blocker", позволяющий защитить ваш контент (изображения, файлы) от прямых ссылок или
"
Helicon Jet", экономящий трафик и увеличивающий производительность ASP приложений).
В отличие от всех предыдущих вариантов, ISAPI Rewrite платный ($99). Но можно воспользоваться бесплатной Lite версией. Ее возможностей вполне достаточно
для отдельного веб-сайта. По большому счету, от full версии она отличается всего двумя вещами:
-
Full версия поддерживает раздельные настройки для разных сайтов, в Lite версии возможен только один общий конфигурационный файл.
-
Full версия может работать как прокси. Т.е. при обработке запроса она может обратиться к какому-то другому ресурсу, получить от него ответ
и вернуть его в качестве ответа на исходный запрос.
Недавно вышла 3-я версия ISAPI Rewrite.