ASP.NET URL rewriting.
Одним из самых разрекламированных и обсуждаемых нововведений в ASP.NET 4.0 является URL маршрутизация в ASP.NET 4. Уж не знаю почему, но мне захотелось не похвалить это самое существенное нововведение ASP.NET 4, а показать на этом примере подлость Билла Гейтса и Микрософта.
До того, как этот функционал был добавлен микрософтом в ASP.NET 4, уже долгие годы существовали десятки OpenSource-реврайтеров для ASP.NET, самыми популярными из которых были следующие:
Это всемирно известные и общепризнанные проекты с развитой документацией и форумом поддержки с тысячами ответов на вопросы ASP.NET-программистов. И вот вдруг этот функционал появился в ASP.NET 4. С крошечной оберткой на 10 строчек в виде класса Route. Хм... И теперь это уже не бесплатно, а в входит в состав платной ASP.NET и уже является собственностью Билла Гейтса.
Вот так технология работы у микрософта! Даже ядро виндузни является просто украденным OpenSource ядром UNIX. Собственно это может увидеть каждый даже взяв файлик BOOT.INI. За столько лет там даже не удосужились убрать стандартные юниксовые имена. Собственно можно даже сгрузить WinObj и увидеть все внутренние имена Windows - которые и поныне остались UNIX-именами. Вот только UNIX абсолютно бесплатна, а Windows-сервер стоит 4 тысячи долларов.
Мдя, вот так технология работы у микрософта! И никто Билла Гейтса и его банду в тюрьму не сажает, а наоборот сажают тех, кто отказывается заплатить Биллу Гейтсу - правозащитные организации, экологические организации, редакции газет и даже просто каких-то наемных работников. Некоторые самые громкие дела - когда собирались посадить какого-то деревенского школьного учителя и вмешивался даже президент, чтобы его не посадили - получали широкую огласку.
Но ведь совершенно очевидно, что посадить-то надо именно Билла Гейтса. Ведь он и его банда ворует OpenSource-код и выдает его за свою собственность! И уже стал самым богатым человеком планеты, занимаясь подобными делишками! И в других странах (которые мы привыкли называть цивилизованными) в отношении банды Билла Гейтса вынесены приговоры - Microsoft оштрафована на 400 млн долларов, Microsoft выплатит штраф в размере 1,1 миллиарда долларов - а у нас эта банда сидит непуганная, а мусора молотят людей (и миллиарды) в интересах "бизнеса" этой банды. И еще как наживаются на этом "бизнесе"! Это вам не чтение паспортишков у брюнетов, выходящих из метро. Они только за прошлый год ограбили бизнесменов под предлогом недоплаты бизнесменами денег Биллу Гейтсу - почти на миллиард рублей! - Осторожно Microsoft.
Итак, посмотрим на возможности этих реврайтеров подробнее.
Микрософтовский реврайтер из MVC (NET 4.0) предствляет собой статический класс RouteTable в котором в простейшем случае лежит правило RouteCollection.MapRoute "{controller}/{action}/{id}" и правило RouteCollection.IgnoreRoute("{resource}.axd/{*pathInfo}"). Эти правила вызывают движок View/Controller и вызывают AXD-модули минуя этот движок. Чтобы добавить к правилам движка MVC правила для работы простых ASPX-страниц и хандлеров - надо добавить еще два правила "{resource}.ashx/{patchinfo}" и "{resource}.aspx/{patchinfo}". Вот таблица реврайтинга с этими четырьмя стандартными правилами. Эти же правила возможно определить не только в коде, но и в Web-конфиге. Подробнее порядок обработки этих правил в IIS6-IIS7 модулем UrlRoutingModule (класс System.Web.Routing.UrlRoutingModule из сборки System.Web.Routing.dll) можно посмотреть здесь.
В практическом плане важно понимать как правильно обратиться к этому реврайтеру из своего MVC-кода с использованием нового синтаксиса "анонимных функций". Если мы в правиле роутинга "{controller}/{action}/{id}" определили третий параметр id, то он всегда будет существовать в обьекте RouteValue, который используется для формирования ссылок. Соответственно, у контроллера всегда будет параметр id. К постоянным параметрам, обрабатываемым реврайтером можно добавить и обычные Querystring параметры:
Подробнее описывать микрософтовский реврайтер (его класс-обертку Route) я смысла не вижу. Микрософтовцы и сами пробьют дырку в мозгу каждому, описывая свое "нововведение". И не только на форумах и блогах - наверняка они выпустят и какой-нибудь трехтомник Экспозито по поводу своего URL-реврайтера.
Я опишу подробнее правый реврайтер (его я знаю лучше других и практически применяю в своих проектах) - его можно применять в любых сайтах, на NET 2.0, например.
Этот реврайтер представляет собой библиотеку UrlRewritingNet.UrlRewriter.dll, которую можно просто положить в BIN и добавить в Web.config описание секции с конфигурацией этого реврайтера:1: <configuration>
2: <configSections>
3: ...
4: <!-- REWRITER -->
5: <section name="urlrewritingnet" restartOnExternalChanges="true" type="UrlRewritingNet.Configuration.UrlRewriteSection, UrlRewritingNet.UrlRewriter"/>
6: <!-- // REWRITER -->
7: </configSections>
8: ...
После этого появляется возможность внести в конфигурацию секцию с параметрами работы реврайтера:
15: <urlrewritingnet configSource="rewrite.config"/>
И собственно необходимо подключить библиотеку реврайтера как ISAPI-модуль к IIS:
150: <httpModules>
151: <add name="UrlRewriteModule" type="UrlRewritingNet.Web.UrlRewriteModule, UrlRewritingNet.UrlRewriter"/>
152: ...
153: </httpModules>
Теперь в файле rewrite.config с конфигурацией реврайтера надо прописать правила по которым будет отображаться в строке браузера URL. Таких правил будет обычно не меньше, чем у вас в проекте страниц. В данном конфиге есть одно-единственное правило - при вызове старнички HotelCommentsAdd.aspx, находящейся в каталоге pages проекта, убирать у нее GET-параметры и из реального вызова странички http://MyDomain/pages/HotelCommentsAdd.aspx?lang=ru&hotel=ABC сформировать в строке браузера следующий URL - http://MyDomain/ru/hotel-comments-add-ABC.aspx
Как вы видите, это применение реврайтера - исключительно полезно для SEO-оптимизации. И пользователю тоже может быть удобно набрать http://igor.vb-net.com чем набрать //www.vb-net.com/user.aspx?user=igor
1: <?xml version="1.0"?>
2: <urlrewritingnet rewriteOnlyVirtualUrls="true"
3: contextItemsPrefix="QueryString"
4: defaultPage = "default.aspx"
5: xmlns="http://www.urlrewriting.net/schemas/config/2006/07" >
6: <rewrites>
7:
8: <add name="HotelCommentsAdd"
9: virtualUrl="^~/([\w]{2})/hotel-comments-add-([\w\d]+).aspx"
10: rewriteUrlParameter="ExcludeFromClientQueryString"
11: destinationUrl="~/pages/HotelCommentsAdd.aspx?lang=$1&hotel=$2"
12: ignoreCase="true" />
13:
14: </rewrites>
15: </urlrewritingnet>
При программровании, вы видите свои собственное (вами же сформированные) GET-параметры - не обращая внимание на то, что показывает реврайтер юзеру в строке браузера. Собственно, этой простотой и прозрачностью и вызвана огромная популярность этого реврайтера.
У этого ревратера есть и более крученые возможности - например по динамической модификации правил роутинга (как раз этот функционал педалируют микрософтоцы в своей проделке). Также возможно создавать собственные реврайтеры, наследусь от базовых классов UrlRewritingNet.UrlRewriter:
Ionics Isapi Rewrite Filter (IIRF.dll) - это тоже один из самых распространенных OpenSource реврайтеров, но предназначен несколько для иных целей. Он загружается непосредственно в IIS как ISAPI-фильтр:
В отличие от предыдущего (программно управляемого из .NET реврайтера) этот реврайтер применяют для достижения совместимости в IIS с ревайтингом модуля mod_rewrite Apache. Можно смело загружать в файл iirf.ini содержимое файла .htaccess - и все редиректы отлично будут выполнены:
И наконец, последнее - что я опишу на этой страничке - как вообще обойтись без этих тяжеловесных приблуд. И сделать любые необходимые реврайтинги собственным кодом в несколько строк.
Вот так выглядит реврайтер на моей сайте http://flyseason.ru/:
1: <%@ Application Language="VB" %>
2:
3: <script runat="server">
4: Protected Sub Application_BeginRequest(ByVal sender As Object, ByVal e As System.EventArgs)
5: Dim URL_Host = Request.Url.Host
6: If URL_Host.ToLower = "www.flyseason.ru" Then
7: Dim NewURL = Request.Url.ToString.Replace("www.", "")
8: Response.StatusCode = 301
9: Response.Status = "301 Moved Permanently"
10: Response.AddHeader("Location", NewURL)
11: Response.End()
12: End If
13: End Sub
14:
15: ...
Надеюсь, то что делают эти три строчки кода в global.asax - понятно без дополнительных пояснений? Разумеется в IIS для узла, обрбатывающего этот сайт прописаны оба хости хеадера - с www и без.
Так же можно поступать и через границы поддоменов (например для социальных сетей) - только в случае реврайтинга через поддомены главный домен надо прописать в DNS не как A, а как CNAME - canonical name.
Удачи!
|