Использование пользовательских поставщиков переопределения с модулем переопределения 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-адресов.
Регистрация поставщиков
В пакет установки включены 3 поставщика перезаписи:
- DbProvider — этот поставщик может использоваться для получения сопоставлений перезаписи из таблицы базы данных SQL Server путем выполнения хранимой процедуры.
- FileMapProvider — этот поставщик можно использовать для получения сопоставлений перезаписи, хранящихся в текстовом файле.
- FileContainsProvider — этот поставщик может использоваться для проверки того, является ли любая строка в текстовом файле подстрокой входной строки поставщика.
Чтобы использовать примеры поставщиков в правилах переопределения, поставщики должны быть зарегистрированы в IIS. Чтобы зарегистрировать поставщика, можно использовать пользовательский интерфейс диспетчера IIS:
- Функция перезаписи URL-адресов в диспетчере IIS;
- Выберите "Просмотр поставщиков..." действие в области "Действия" в правой части;
- Выберите "Добавить поставщика..." действие на панели "Действия";
- В диалоговом окне "Добавить поставщика" введите имя, которое вы хотите использовать для этого поставщика при обращении к нему из правила перезаписи.
- После этого выберите соответствующий тип .NET для поставщика в раскрывающемся списке "Управляемый тип". Обратите внимание, что для отображения типов поставщиков может потребоваться некоторое время.
- Повторите описанные выше действия, чтобы зарегистрировать всех трех поставщиков.
Использование 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 для вызова хранимой процедуры:
- В диспетчере IIS в представлении функций переопределения URL-адресов выберите "Просмотр поставщиков..." в области действий.
- Выберите "Добавить поставщика" и выберите DbProvider. Присвойте ему имя базы данных. Это будет имя, с помощью которого вы будете ссылаться на поставщика из правила перезаписи
- Выберите экземпляр DbProvider с именем DB и нажмите кнопку "Добавить параметр поставщика..." действие.
- Используйте диалоговое окно "Изменить параметр поставщика", чтобы настроить поставщика:
Используйте следующие значения для параметров поставщика:
- СТРОКА ПОДКЛЮЧЕНИЯ 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
ПРЕДУПРЕЖДЕНИЕ: Всегда убедитесь, что текстовый файл недоступен непосредственно из Интернета. Используйте модуль фильтрации запросов 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
ПРЕДУПРЕЖДЕНИЕ: Всегда убедитесь, что текстовый файл недоступен непосредственно из Интернета. Используйте модуль фильтрации запросов 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.