Перезапись URL-адресов IIS и маршрутизация ASP.NET

Руслан Якушев

С выпуском модуля перезаписи URL-адресов для IIS и включением маршрутизации ASP.NET в .NET Framework 4 возникло много вопросов от разработчиков ASP.NET о том, как связаны между собой эти две функции и когда следует использовать одну или другую. В этом документе описываются различия между этими двумя технологиями и приводятся рекомендации для веб-разработчиков о том, когда следует использовать перезапись URL-адресов IIS и когда использовать маршрутизацию ASP.NET.

С точки зрения высокого уровня, кажется, что эти технологии предоставляют очень похожие функциональные возможности, что позволяет веб-приложениям иметь удобные и понятные для поиска URL-адреса. Однако существуют фундаментальные различия между этими двумя технологиями, которые важно понять, чтобы принять правильное решение о том, что следует использовать для веб-приложения. Чтобы помочь вам понять эти различия, мы сначала объясним, как работают перезапись URL-адресов в IIS и маршрутизация в ASP.NET.

Перезапись URL-адресов IIS

Основная идея перезаписи URL-адресов не является новой концепцией. Она появилась на сервере Apache Web около десяти лет назад. С тех пор он оказался очень полезным инструментом для администраторов веб-серверов и веб-разработчиков. Многие популярные приложения, размещенные в Apache, теперь используют перезапись URL-адресов, чтобы включить поддержку "чистых" URL-адресов.

Концепция перезаписи URL-адресов проста. Когда клиент отправляет запрос на веб-сервер для определенного URL-адреса, модуль перезаписи URL-адресов анализирует запрошенный URL-адрес и изменяет его на другой URL-адрес на том же сервере. Модуль перезаписи URL-адресов выполняется рано в конвейере обработки запросов, изменив запрошенный URL-адрес, прежде чем веб-сервер решает, какой обработчик будет использоваться для обработки запроса. Обработчик, выбранный на основе переписанного URL, обрабатывает запрос и создает ответ, отправляемый обратно в веб-браузер. Запрашивающий клиент никогда не видит изменённый URL-адрес; с точки зрения клиента, он получил ответ от исходного URL-адреса.

С точки зрения архитектуры IIS этот процесс представлен на следующей схеме:

Схема процесса перезаписи URL IIS от HTTP-запроса к HTTP-ответу.

Модуль переопределения URL-адресов — это модуль машинного кода, который подключается к конвейеру обработки запросов на этапах предварительного начала запроса или начала запроса, а затем оценивает запрошенный путь URL-адреса с помощью набора правил перезаписи. Каждое правило перезаписи анализирует путь URL-адреса и, если выполнены все условия правила, изменит исходный путь на новый путь. После оценки всех правил модуль перезаписи URL-адресов создает окончательный путь URL-адреса, используемый для запроса через оставшуюся часть обработки конвейера IIS. Это означает, что выбор обработчика в конвейере IIS выполняется на основе перезаписанного URL-адреса, созданного модулем URL Rewrite.

маршрутизация ASP.NET

ASP.NET маршрутизация — это механизм отправки запросов, который позволяет разработчикам связать определенный URL-адрес с обработчиком, который может обрабатывать запросы, сделанные с этим URL-адресом. Эта связь выполняется путем регистрации "маршрутов", определяющих, какой обработчик вызывается для определенного пути URL. Когда запрос выполняется на веб-сервере, ASP.NET маршрутизация ищет запрошенный путь URL-адреса в списке зарегистрированных маршрутов. Если маршрут найден, соответствующий обработчик для этого маршрута вызывается для обработки этого запроса.

С точки зрения архитектуры IIS и ASP.NET этот процесс представлен на следующей схеме:

Схема процесса маршрутизации S P dot NET с помощью обработчиков I T T P от запроса к ответу.

ASP.NET маршрутизация реализована в виде модуля управляемого кода, подключающегося к конвейеру обработки запросов IIS на этапе "Разрешение кэша" (событие PostResolveRequestCache) и на этапе обработчика карт (событие PostMapRequestHandler). ASP.NET маршрутизация настроена для выполнения всех запросов, сделанных в веб-приложении.

Во время события PostResolveRequestCache модуль просматривает таблицу маршрутизации (коллекцию объектов маршрутов) для маршрута, соответствующего запрошенным URL-пути. Если совпадение найдено, модуль получает ссылку на обработчик, соответствующий данному маршруту, и сохраняет ссылку в рамках текущего контекста HTTP. Обработчик может быть любым объектом .NET Framework, реализующим интерфейс System.Web.IHttpHandler. Если маршрут не найден, модуль ничего не делает, и URL-адрес проходит и обрабатывается обычно (обычно путем сопоставления его с файлом на диске).

Во время события PostMapRequestHandler модуль проверяет, содержит ли контекст HTTP любые сведения о обработчике. Если это так, ASP.NET маршрутизация использует сведения для задания свойства Обработчика текущего контекста HTTP. Это гарантирует, что на этапе выполнения обработчика IIS выполнит обработчик, выбранный модулем маршрутизации. Если эта информация не задана, модуль ничего не делает, и URL-адрес передается, а IIS подбирает обработчик.

Различия между перезаписи URL-адресов IIS и маршрутизацией ASP.NET

На основе приведенного выше объяснения существуют следующие основные концептуальные различия между перезаписи URL-адресов IIS и маршрутизацией ASP.NET:

  1. Перезапись URL-адресов используется для управления путями URL-адресов перед обработкой запроса веб-сервером. Модуль перезаписи URL-адресов не знает, какой обработчик в конечном итоге обработает URL-адрес перезаписи. Кроме того, фактический обработчик запросов может не знать, что URL-адрес был перезаписан.
  2. ASP.NET маршрутизация используется для отправки запроса к обработчику на основе запрошенного URL-пути. В отличие от перезаписи URL-адресов, модуль маршрутизации знает об обработчиках и выбирает обработчик, который должен создать ответ для запрошенного URL-адреса. Вы можете рассматривать маршрутизацию ASP.NET как расширенный механизм сопоставления обработчиков.

Помимо этих концептуальных различий, существуют следующие функциональные различия между перезаписи URL-адресов IIS и маршрутизацией ASP.NET:

  1. Модуль перезаписи URL-адресов IIS можно использовать с любым типом веб-приложения, которое включает ASP.NET, PHP, ASP и статические файлы. ASP.NET маршрутизацию можно использовать только с веб-приложениями на основе .NET Framework.
  2. Модуль перезаписи URL-адресов IIS работает так же, независимо от того, используется ли для пула приложений режим встроенного или классического конвейера IIS. Для маршрутизации ASP.NET предпочтительнее использовать интегрированный режим конвейера. ASP.NET маршрутизация может работать в классическом режиме, но в этом случае URL-адреса приложения должны включать расширения имен файлов или приложение должно быть настроено для использования сопоставления обработчика "*" в IIS.
  3. Модуль переопределения URL-адресов IIS может принимать решения по перезаписи на основе доменных имен, заголовков HTTP и переменных сервера. По умолчанию маршрутизация ASP.NET работает только с URL-путями и заголовком HTTP-Method.
  4. Помимо перезаписи модуль перезаписи URL-адресов может выполнять перенаправление HTTP, выдавать пользовательские коды состояния и запросы прерывания. ASP.NET маршрутизация не выполняет эти задачи.
  5. Модуль перезаписи URL-адресов не расширяем в текущей версии. ASP.NET маршрутизация полностью расширяема и настраивается.

Какой вариант следует использовать?

Что означает все эти сведения, если необходимо выбрать технологию для включения чистых URL-адресов для веб-приложений? В этом разделе описано, как сделать этот выбор.

Если ваше веб-приложение построено на чем-либо, кроме ASP.NET, используйте модуль переписывания URL-адресов IIS. В противном случае правила:

  1. Если вы разрабатываете новое веб-приложение ASP.NET, использующее ASP.NET MVC или ASP.NET технологии динамических данных , используйте маршрутизацию ASP.NET. Приложение будет использовать встроенную поддержку чистых URL-адресов, включая создание чистых URL-адресов для ссылок на веб-страницах. Обратите внимание, что маршрутизация ASP.NET пока не поддерживает стандартные приложения веб-форм, хотя в будущем планируется его поддерживать.
  2. Если у вас уже есть устаревшее веб-приложение ASP.NET и не хотите изменять его, используйте модуль перезаписи URL-адресов. Модуль переопределения URL-адресов позволяет переводить URL-адреса, понятные для поисковой системы, в формат, который в настоящее время использует ваше приложение. Кроме того, он позволяет создавать правила перенаправления, которые можно использовать для перенаправления обходчиков поисковых систем для очистки URL-адресов.

На практике, однако, выбор не должен быть либо/или. Технологии можно использовать вместе и дополнять друг друга. В последующих разделах мы рассмотрим некоторые сценарии, где можно использовать маршрутизацию ASP.NET и URL-переписывание в IIS вместе.

Обеспечение соблюдения канонических URL-адресов для вашего приложения.
Следует принудительно использовать http://www.mysite.com/home/about вместо http://mysite.com/Home/About. Когда веб-клиент запрашивает URL-адрес, который не соответствует нужному формату, клиент перенаправляется на канонический URL-адрес. В этом сценарии можно использовать модуль переписывания URL-адресов для применения канонических URL-адресов и выполнения перенаправления, а маршрутизацию ASP.NET — для выбора обработчика, который обработает запрошенный URL-адрес.

В следующем примере показано правило перезаписи URL-адресов, которое можно использовать для этого сценария:

<rewrite>
    <rules>
        <rule name="Enforce canonical hostname" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{HTTP_HOST}" negate="true" pattern="^www\.mysite\.com$" />
            </conditions>
            <action type="Redirect" url="http://www.mysite.com/{R:1}" redirectType="Permanent" />
        </rule>
    </rules>
</rewrite>

Обслуживание статического содержимого с другого сайта или сервера.
Веб-приложение развертывается на нескольких серверах таким образом, чтобы динамическое веб-содержимое находилось на одном сайте или сервере, а все статическое содержимое находится на другом сайте или сервере. Модуль перезаписи URL-адресов можно использовать вместе с модулем маршрутизации запросов приложений IIS для пересылки всех запросов статических файлов на другой сервер, обслуживая все запросы динамических веб-страниц с текущего сервера. Таким образом, ASP.NET маршрутизация используется только для динамического веб-содержимого и не оценивает URL-адреса статического содержимого.

В следующем примере показано правило перезаписи URL-адресов, которое можно использовать для этого сценария:

<rewrite>
    <rules>
        <rule name="Forward to static file server">
            <match url="^.+\.(?:jpg|bmp|gif)$" />
            <action type="Rewrite" url="http://static_file_server/{R:0}" />
        </rule>
    </rules>
</rewrite>

Управление статическим содержимым.
При перемещении статических файлов или папок в новое расположение можно по-прежнему поддерживать старые URL-адреса по соображениям обратной совместимости. На самом деле, вам может не потребоваться, чтобы посетители веб-сайта знали, что файлы или папки были перемещены. В этом случае модуль переопределения URL-адресов можно использовать для перезаписи путей для статических файлов, а все URL-адреса динамических веб-страниц ASP.NET обрабатываются модулем маршрутизации.

В следующем примере показано правило перезаписи URL-адресов, которое можно использовать для этого сценария:

<rewrite>
    <rules>
        <rule name="Rewrite to new folder">
            <match url="^Images/(.+)$" />
            <action type="Rewrite" url="NewImages/{R:1}" />
        </rule>
    </rules>
</rewrite>

Блокировка запроса.
Модуль перезаписи URL-адресов можно использовать для блокировки определенных запросов на основе различных критериев. Например, вы можете запретить некоторым поисковым роботам доступ к определённым URL-путям на вашем веб-сайте. Таким образом, запрещенные запросы даже не смогут добраться до маршрутизатора ASP.NET, что снижает нагрузку на веб-сервер.

В следующем примере показано правило перезаписи URL-адресов, которое можно использовать для блокировки нежелательных обходчиков сайтов. Обратите внимание, что запросы блокируются для определенного URL-пути на основе заголовка HTTP-агента пользователя или на основе IP-адреса клиента:

<rewrite>
    <rules>
        <rule name="Block SomeRobot" stopProcessing="true">
            <match url="^folder1/folder2" />
            <conditions logicalGrouping="MatchAny">
                <add input="{USER_AGENT}" pattern="SomeRobot" />
                <add input="{REMOTE_ADDR}" pattern="201\.45\.33\.[0-5]" />
            </conditions>
            <action type="AbortRequest" />
        </rule>
    </rules>
</rewrite>

Будущие направления

Несмотря на то, что перезапись URL в IIS и маршрутизация ASP.NET имеют некоторое функциональное пересечение, они решают задачи, уникальные для каждой из этих технологий. Из-за этого эти две технологии будут продолжать существовать и развиваться как независимые компоненты в IIS, с потенциалом более жесткой интеграции между ними. Например, ASP.NET маршрутизация может использовать некоторые из расширенных средств, предоставляемых модулем перезаписи URL-адресов. Модуль перезаписи URL-адресов можно лучше интегрировать с ASP.NET с точки зрения расширения для настройки логики перезаписи URL-адресов.

Conclusion

Для реализации сценариев обработки URL-адресов для веб-приложения можно использовать перезапись URL-адресов или ASP.NET маршрутизацию. ASP.NET маршрутизация — это решение, оптимизированное для ASP.NET, поэтому может быть предпочтительнее для веб-разработчиков, которые проектируют свои ASP.NET приложения с нуля и хотят иметь чистую структуру URL-адресов. Перезапись URL-адресов IIS — это универсальный механизм обработки URL-адресов, который охватывает множество сценариев. В частности, он может использоваться веб-разработчиками, а также администраторами веб-сервера или сайта, чтобы включить чистые URL-адреса для существующих веб-приложений без изменения кода приложения.