Использование пользовательских поставщиков переопределения с модулем переопределения URL-адресов

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

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

Установка примеров расширения URL-адресов

Чтобы завершить это пошаговое руководство, скачайте и установите примеры расширяемости URL-адресов (https://www.microsoft.com/download/details.aspx?id=43353). Пакет установки примеров расширяемости включает сборки .NET и исходный код с полной реализацией поставщиков перезаписи для трех наиболее распространенных вариантов использования:

  • Хранение сопоставлений перезаписи или перенаправления в базе данных SQL;
  • Хранение сопоставлений перезаписи или перенаправления в текстовом файле;
  • Хранение подстроок подстроки в текстовом файле.

Во время установки выберите параметр Runtime в пользовательской установке. Это позволит зарегистрировать примеры поставщиков в глобальном кэше сборок .NET, чтобы их можно было использовать в модуле переопределения URL-адресов.

Снимок экрана: диалоговое окно установки примеров расширяемости для перезаписи I U R L. Выделен значок среды выполнения.

Регистрация поставщиков

В пакет установки включены 3 поставщика перезаписи:

  • DbProvider — этот поставщик может использоваться для получения сопоставлений перезаписи из таблицы базы данных SQL Server путем выполнения хранимой процедуры.
  • FileMapProvider — этот поставщик можно использовать для получения сопоставлений перезаписи, хранящихся в текстовом файле.
  • FileContainsProvider — этот поставщик можно использовать для проверка если любая строка в текстовом файле является подстрокой входной строки поставщика.

Чтобы использовать примеры поставщиков в правилах переопределения, поставщики должны быть зарегистрированы в IIS. Чтобы зарегистрировать поставщика, можно использовать пользовательский интерфейс диспетчера IIS:

  1. Функция перезаписи URL-адресов в диспетчере IIS;
  2. Выберите "Просмотр поставщиков..." действие в области "Действия" в правой части;
    Снимок экрана: домашняя страница перезаписи I Manager U R R L. В области
  3. Выберите "Добавить поставщика..." действие на панели "Действия";
  4. В диалоговом окне "Добавить поставщика" введите имя, которое вы хотите использовать для этого поставщика при обращении к нему из правила перезаписи.
  5. После этого выберите соответствующий тип .NET для поставщика в раскрывающемся списке "Управляемый тип". Обратите внимание, что для отображения типов поставщиков может потребоваться некоторое время.
    Снимок экрана: страница
  6. Повторите описанные выше действия, чтобы зарегистрировать всех трех поставщиков.

Использование DbProvider

Чтобы использовать DbProvider, вам потребуется доступ к Microsoft SQL Server. Поставщик подключается к базе данных SQL Server и выполняет хранимую процедуру, которая принимает входной параметр NVARCHAR, содержащий входную строку URL-адреса и возвращает одну строку, один результирующий набор столбцов, содержащий выходную строку URL-адреса типа NVARCHAR.

Создание образца базы данных

Откройте СРЕДУ SQL Server Management Studio, откройте новое окно запроса и выполните следующий скрипт SQL:

USE [master]

CREATE LOGIN [IIS APPPOOL\DefaultAppPool] FROM WINDOWS WITH DEFAULT_DATABASE=[master]

CREATE DATABASE [RewriteDB]
GO

USE [RewriteDB]
GO

CREATE TABLE [dbo].[RewriteTable](
[OriginalUrl] [nvarchar](256) NOT NULL,
[NewUrl] [nvarchar](256) NOT NULL
) ON [PRIMARY]
GO

CREATE PROCEDURE [dbo].[GetRewrittenUrl] 
@input nvarchar(256)
AS
SELECT rt.NewUrl 
FROM dbo.RewriteTable rt 
WHERE rt.OriginalUrl = @input
GO

CREATE USER [IIS APPPOOL\DefaultAppPool] FOR LOGIN [IIS APPPOOL\DefaultAppPool]

GRANT EXECUTE ON dbo.GetRewrittenUrl TO [IIS APPPOOL\DefaultAppPool];
GO

INSERT INTO dbo.RewriteTable VALUES ('old/catalog/product.html', 'new/category/product.html');
INSERT INTO dbo.RewriteTable VALUES ('old/contactus/index.html', 'new/contactus.html');
GO

Приведенный выше сценарий создает новую базу данных с именем RewriteDB, которая содержит таблицу RewriteTable и хранимую процедуру GetRewrittenURL. Она также предоставляет разрешения учетной записи IIS APPPOOL\DefaultAppPool для выполнения этой хранимой процедуры. Кроме того, он заполняет таблицу базы данных двумя сопоставлениями URL-адресов.

Настройка параметров DbProvider

Настройте экземпляр DbProvider для вызова хранимой процедуры:

  1. В диспетчере IIS в представлении функций переопределения URL-адресов выберите "Просмотр поставщиков..." в области действий.
  2. Выберите "Добавить поставщика" и выберите DbProvider. Присвойте ему имя базы данных. Это будет имя, с помощью которого вы будете ссылаться на поставщика из правила перезаписи
  3. Выберите экземпляр DbProvider с именем DB и нажмите кнопку "Добавить параметр поставщика..." Действий.
  4. Используйте диалоговое окно "Изменить параметр поставщика", чтобы настроить поставщика:
    Снимок экрана: страница

Используйте следующие значения для параметров поставщика:

  • СТРОКА ПОДКЛЮЧЕНИЯ SQL Server: укажите строка подключения SQL Server, например:
    "Data Source=servername\sqlexpress; Initial Catalog=RewriteDB; Встроенная безопасность=True"
  • Имя хранимой процедуры: GetRewrittenUrl
  • Интервал в минутах кэша: установите значение 0, если значения в таблице SQL не изменяются или задаются положительным целым числом, чтобы поставщик периодически обновлял внутренний кэш перезаписи модуля. Если не указано значение 0, предполагается.

Вызов DbProvider из правила переопределения

В корневом каталоге веб-сайта откройте файл web.config . Если используется веб-сайт IIS по умолчанию, файл должен находиться в C:\inetpub\wwwroot\ папке.

Вставьте следующее правило перенаправления в файл web.config внутри /<configuration>/<system.webServer>/<rewrite>/<rules> элемента:

<rule name="DbProviderTest" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{DB:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Redirect" url="{C:1}" />
</rule>

Полное содержимое файла конфигурации web.config должно выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="DB" type="DbProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="ConnectionString" value="Data Source=ruslany-server\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" />
                <add key="StoredProcedure" value="GetRewrittenUrl" />
                <add key="CacheMinutesInterval" value="0" />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="DbProviderTest" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{DB:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
        </rule>
    </rules>
</rewrite>

Это правило выполняет перенаправление HTTP на URL-адрес, полученный из базы данных SQL Server через DbProvider. Экземпляр DbProvider с именем DB вызывается из условия правила, и если результат, возвращенный поставщиком, не пуст, то выполняется перенаправление HTTP.

Чтобы проверить правило, откройте веб-браузер и выполните запрос к http://localhost/old/catalog/product.html ней.http://localhost/old/contactus/index.html Обратите внимание, что браузер перенаправляется на новый URL-адрес на основе сопоставлений перенаправления, определенных в таблице базы данных RewriteDB. Веб-сервер вернет ошибку HTTP 404 для перенаправленного URL-адреса, так как на сервере нет такого файла или каталога, но это не относится для целей этого пошагового руководства. Важной частью является то, что веб-сервер выпустил ответ перенаправления на основе правила, которое использовал DbProvider.

Использование FileMapProvider

FileMapProvider считывает сопоставления URL-адресов из текстового файла. Его можно использовать вместо встроенных функций перезаписи карт, когда объем записей карты перезаписи очень велик, и их нельзя сохранить в файле web.config.

Создание файла сопоставления примеров

Создайте новый каталог с именем App_Data в корневом каталоге веб-сайта. В этом каталоге создайте текстовый файл с именем redirectmappings.txt. Добавьте в файл следующие строки:

old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html

Изображение, показывающее символ предупреждения перед отображением заметки WARNING.ПРЕДУПРЕЖДЕНИЕ. Всегда убедитесь, что текстовый файл недоступен непосредственно из Интернета. Используйте модуль фильтрации запросов IIS или поместите файл в папку App_Data, чтобы предотвратить прямой доступ к содержимому этого файла клиентам HTTP.

Настройка FileMapProvider

Настройте FileMapProvider, выполнив те же действия, что и в разделе Configuring DbProvider. Используйте эти значения для параметров поставщика:

  • FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt (обратите внимание на использование {DOCUMENT_ROOT} в пути к файлу. При инициализации поставщика он заменяется фактическим путем. Это полезно, если вы не хотите размещать абсолютный путь к файлу в файле web.config)
  • IgnoreCase: 1
  • Разделитель: "," (если не указано, символ TAB будет использоваться в качестве разделителя)

Вызов FileMapProvider из правила переопределения

В корневом каталоге веб-сайта откройте файл web.config . Если используется веб-сайт IIS по умолчанию, файл должен находиться в C:\inetpub\wwwroot\ папке.

Вставьте следующее правило перенаправления в файл web.config внутри /<configuration>/<system.webServer>/<rewrite>/<rules> элемента:

<rule name="FileMapProviderTest" stopProcessing="true">
    <match url="(.*)" />
    <conditions>
        <add input="{FileMap:{R:1}}" pattern="(.+)" />
    </conditions>
    <action type="Redirect" url="{C:1}" />
</rule>

Полное содержимое файла конфигурации web.config должно выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="FileMap" type="FileMapProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\redirectmappings.txt" />
                <add key="IgnoreCase" value="1" />
                <add key="Separator" value="," />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="FileMapProviderTest" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{FileMap:{R:1}}" pattern="(.+)" />
            </conditions>
            <action type="Redirect" url="{C:1}" />
        </rule>
    </rules>
</rewrite>

Это правило выполняет перенаправление HTTP на URL-адрес, полученный из текстового файла с помощью FileMapProvider. Экземпляр FileMapProvider с именем FileMap вызывается из условия правила, и если результат, возвращенный поставщиком, не пуст, то выполняется перенаправление HTTP.

Чтобы проверить правило, откройте веб-браузер и выполните запрос к http://localhost/old/catalog/product.html ней.http://localhost/old/contactus/index.html Обратите внимание, что браузер перенаправляется на новый URL-адрес на основе сопоставлений перенаправления, определенных в файле redirectmappings.txt. Веб-сервер вернет ошибку HTTP 404 для перенаправленного URL-адреса, так как на сервере нет такого файла или каталога, но это не относится для целей этого пошагового руководства. Важной частью является то, что веб-сервер выпустил ответ перенаправления на основе правила, которое использовало FileMapProviders.

Использование FileContainsProvider

FileContainsProvider считывает набор строк из текстового файла, а затем проверка, если входная строка поставщика содержит любую из этих строк в качестве подстроки. Поставщик можно использовать, например, с правилами перезаписи, которые блокируют доступ на основе заголовка агента пользователя.

Создание примера файла запрещенных пользовательских агентов

Создайте новый каталог с именем App_Data в корневом каталоге веб-сайта. В этом каталоге создайте текстовый файл с именем disalloweduseragents.txt. Добавьте в файл следующие строки:

badrobot1
badrobot2

Изображение символа предупреждения отображается перед заметкой WARNING. Изображение треугольника с восклицательным знаком в середине.ПРЕДУПРЕЖДЕНИЕ. Всегда убедитесь, что текстовый файл недоступен непосредственно из Интернета. Используйте модуль фильтрации запросов IIS или поместите файл в папку App_Data, чтобы предотвратить прямой доступ к содержимому этого файла клиентам HTTP.

Настройка FileContainsProvider

Настройте FileMapProvider, выполнив те же действия, что и в разделе Configuring DbProvider. Используйте эти значения для параметров поставщика:

  • FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt (обратите внимание на использование {DOCUMENT_ROOT} в пути к файлу. При инициализации поставщика он заменяется фактическим путем. Это полезно, если вы не хотите размещать абсолютный путь к файлу в файле web.config)
  • IgnoreCase: 1

Вызов FileContainsProvider из правила переопределения

В корневом каталоге веб-сайта откройте файл web.config . Если используется веб-сайт IIS по умолчанию, файл должен находиться в C:\inetpub\wwwroot\ папке.

Вставьте следующее правило перенаправления в файл web.config внутри /<configuration>/<system.webServer>/<rewrite>/<rules> элемента:

<rule name="FileContainsProviderTest" stopProcessing="true">
    <match url=".*" />
    <conditions>
        <add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
    </conditions>
    <action type="AbortRequest" />
</rule>

Полное содержимое файла конфигурации web.config должно выглядеть примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
    <providers>
        <provider name="FileContains" type="FileContainsProvider, Microsoft.Web.Iis.Rewrite.Providers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
            <settings>
                <add key="FilePath" value="{DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt" />
                <add key="IgnoreCase" value="1" />
            </settings>
        </provider>
    </providers>
    <rules>
        <rule name="FileContainsProviderTest" stopProcessing="true">
            <match url=".*" />
            <conditions>
                <add input="{FileContains:{HTTP_USER_AGENT}}" pattern=".+" />
            </conditions>
            <action type="AbortRequest" />
        </rule>
    </rules>
</rewrite>

Это правило прерывает HTTP-подключение, если агент пользователя HTTP-запроса соответствует любой из строк, перечисленных в файле disalloweduseragents.txt. Экземпляр FileContainsProvider с именем FileContains вызывается из условия правила, и если результат, возвращенный поставщиком, не пуст, то HTTP-подключение прервано.

Чтобы проверить правило, откройте WFetch и добавьте заголовок пользовательского агента в запрос, как показано ниже:

user-agent: badrobot1\r\n

В WFetch выполните запрос http://localhost/test/. Должно отобразиться, что подключение прерывается, так как строка агента пользователя соответствует одной из строк в файле disalloweduseragents.txt.

Снимок экрана: выборка одной диалоговой страницы. Подключение прервано, так как строка агента пользователя соответствовала одной из строк в запрещенных агентах пользователей dot t x t t.