Usando provedores de reescrita personalizados com o Módulo de Reescrita de URL
por Ruslan Yakushev
Este passo a passo orientará você sobre como usar provedores de reescrita personalizados com o Módulo de Reescrita de URL 2.0. O passo a passo usa os Exemplos de Extensibilidade de Reescrita de URL 2.0, que podem ser baixados dos Exemplos de Extensibilidade de Reescrita de URL na Galeria de Códigos do MSDN.
Instalar exemplos de extensibilidade de reescrita de URL
Para concluir este passo a passo, baixe e instale os Exemplos de Extensibilidade de Reescrita de URL (https://www.microsoft.com/download/details.aspx?id=43353
). O pacote de instalação de Exemplos de Extensibilidade inclui assemblies .NET e o código-fonte com implementação completa de provedores de reescrita para os três casos de uso mais comuns:
- Armazenamento dos mapeamentos de reescrita ou redirecionamento em um banco de dados SQL;
- Armazenamento dos mapeamentos de reescrita ou redirecionamento em um arquivo de texto;
- Armazenamento das substrings de caracteres de pesquisa em um arquivo de texto.
Durante a instalação, certifique-se de selecionar a opção "Runtime" na configuração personalizada. Isso registrará os provedores de exemplo no Cache de Assembly Global do .NET para que eles possam ser usados pelo Módulo de Regravação de URL.
Registrando os provedores
Há 3 provedores de reescrita incluídos no pacote de instalação:
- DbProvider – esse provedor pode ser usado para recuperar mapeamentos de reescrita de uma tabela de banco de dados do SQL Server executando um procedimento armazenado
- FileMapProvider – esse provedor pode ser usado para recuperar mapeamentos de reescrita armazenados em um arquivo de texto
- FileContainsProvider – esse provedor pode ser usado para verificar se qualquer cadeia de caracteres em um arquivo de texto é uma substring da cadeia de caracteres de entrada do provedor.
Para usar os provedores de exemplo nas regras de reescrita, os provedores precisam estar registrados no IIS. Para registrar um provedor, você pode usar a interface do usuário do Gerenciador do IIS:
- Abra o recurso de Reescrita de URL no Gerenciador do IIS;
- Selecione a ação "Exibir provedores..." no painel "Ações" do lado direito;
- Selecione a ação "Adicionar provedor..." no painel "Ações";
- Na caixa de diálogo "Adicionar provedor", digite o nome que deseja usar para esse provedor ao se referir a ele a partir de uma regra de reescrita.
- Depois disso, escolha o tipo .NET correspondente para o provedor na lista suspensa "Tipo Gerenciado". Observe que pode levar algum tempo para que os tipos de provedor apareçam lá.
- Repita as etapas acima para registrar todos os três provedores.
Usando o DbProvider
Para usar o DbProvider, você precisará acessar o Microsoft SQL Server. O provedor se conecta a um banco de dados do SQL Server e executa um procedimento armazenado que usa um parâmetro de entrada NVARCHAR que contém a cadeia de caracteres de URL de entrada e retorna um conjunto de resultados de uma linha, uma coluna contendo a cadeia de caracteres da URL de saída do tipo NVARCHAR.
Criando um banco de dados de exemplo
Abra um SQL Server Management Studio, abra uma nova janela de consulta e execute o seguinte script 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
O script acima cria um banco de dados chamado RewriteDB, que tem uma tabela RewriteTable e um procedimento armazenado GetRewrittenURL. Ele também concede permissões à conta APPPOOL\DefaultAppPool do IIS para executar esse procedimento armazenado. Além disso, ele preenche a tabela do banco de dados com dois mapeamentos de URL.
Definindo configurações de DbProvider
Configure a instância de DbProvider para chamar o procedimento armazenado:
- No Gerenciador do IIS, na exibição do recurso Reescrita de URL, selecione "Exibir provedores..." no painel de ação.
- Selecione "Adicionar provedor" e escolha DbProvider. Dê a ele o nome DB, que será o nome pelo qual você se referirá ao provedor a partir de uma regra de reescrita
- Selecione a instância de DbProvider chamada DB e clique na ação "Adicionar Configuração de Provedor...".
- Use a caixa de diálogo "Editar Configuração do Provedor" para configurar o provedor:
Use os seguintes valores para as configurações de provedor:
- Cadeia de conexão do SQL Server: forneça uma cadeia de conexão do SQL Server, por exemplo:
"Data Source=servername\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" - Nome do procedimento armazenado: GetRewrittenUrl
- Intervalo de minutos de cache: defina como 0 se os valores na tabela SQL não forem alterados ou defina como um inteiro positivo para que o provedor atualize periodicamente o cache de reescrita interno do módulo. Se não for especificado, o valor de 0 será presumido.
Chamando DbProvider de uma regra de reescrita
No diretório raiz de um site, abra o arquivo web.config. Se você usar o site padrão do IIS, o arquivo deverá estar localizado na pasta C:\inetpub\wwwroot\
.
Cole a seguinte regra de redirecionamento no arquivo web.config dentro do elemento /<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>
O conteúdo completo do arquivo web.config deve ser semelhante ao abaixo:
<?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>
Esta regra executa o redirecionamento HTTP para uma URL obtida de um banco de dados do SQL Server via DbProvider. A instância de DbProvider chamada "DB" é invocada a partir da condição da regra e, se o resultado retornado do provedor não estiver vazio, o redirecionamento HTTP será executado.
Para testar a regra, abra um navegador da Web e faça uma solicitação para http://localhost/old/catalog/product.html
ou http://localhost/old/contactus/index.html
. Observe que o navegador é redirecionado para uma nova URL com base nos mapeamentos de redirecionamento definidos na tabela de banco de dados do RewriteDB. O servidor Web retornará o erro HTTP 404 ao URL redirecionado porque não há nenhum arquivo ou diretório no servidor, mas isso não é relevante para os fins deste passo a passo. A parte importante é que o servidor Web emitiu uma resposta de redirecionamento com base na regra que usou o DbProvider.
Usando FileMapProvider
FileMapProvider lê os mapeamentos de URL de um arquivo de texto. Ele pode ser usado em vez da funcionalidade interna de reescrever mapas quando a quantidade de entradas do mapa de reescrita é muito grande e não é prático mantê-las em um arquivo web.config.
Criando um arquivo de mapeamentos de exemplo
Crie um diretório chamado App_Data no diretório raiz do seu site. Nesse diretório, crie um arquivo de texto chamado redirectmappings.txt. Adicione as seguintes linhas ao arquivo:
old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html
AVISO: Certifique-se sempre de que o arquivo de texto não esteja diretamente acessível a partir da Web. Use o módulo Filtragem de Solicitações do IIS ou coloque o arquivo dentro da pasta App_Data para impedir que os clientes HTTP acessem diretamente o conteúdo desse arquivo.
Configurando FileMapProvider
Configure FileMapProvider seguindo as mesmas etapas descritas em Configurando DbProvider. Use estes valores para as configurações do provedor:
- FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt (observe o uso de {DOCUMENT_ROOT} no caminho do arquivo. Isso é substituído pelo caminho real durante a inicialização do provedor. Isso é útil quando você não deseja colocar um caminho de arquivo absoluto no arquivo web.config)
- IgnoreCase: 1
- Separador: "," (se não for especificado, o símbolo TAB será usado como separador)
Chamando FileMapProvider a partir de uma regra de reescrita
No diretório raiz de um site, abra o arquivo web.config. Se você usar o site padrão do IIS, o arquivo deverá estar localizado na pasta C:\inetpub\wwwroot\
.
Cole a seguinte regra de redirecionamento no arquivo web.config dentro do elemento /<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>
O conteúdo completo do arquivo web.config deve ser semelhante ao abaixo:
<?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>
Esta regra executa o redirecionamento HTTP para uma URL obtida de um arquivo de texto via FileMapProvider. A instância de FileMapProvider chamada "FileMap" é invocada a partir da condição da regra e, se o resultado retornado do provedor não estiver vazio, o redirecionamento HTTP será executado.
Para testar a regra, abra um navegador da Web e faça uma solicitação para http://localhost/old/catalog/product.html
ou http://localhost/old/contactus/index.html
. Observe que o navegador é redirecionado para uma nova URL com base nos mapeamentos de redirecionamento definidos no arquivo redirectmappings.txt. O servidor Web retornará o erro HTTP 404 ao URL redirecionado porque não há nenhum arquivo ou diretório no servidor, mas isso não é relevante para os fins deste passo a passo. A parte importante é que o servidor Web emitiu uma resposta de redirecionamento com base na regra que usou o FileMapProviders.
Usando FileContainsProvider
FileContainsProvider lê o conjunto de cadeias de caracteres de um arquivo de texto e verifica se a cadeia de caracteres de entrada do provedor contém alguma dessas cadeias de caracteres como uma substring. O provedor pode ser usado, por exemplo, com regras de reescrita que bloqueiam o acesso com base no cabeçalho do agente do usuário.
Criando um exemplo de arquivo de agente de usuário não permitido
Crie um diretório chamado App_Data no diretório raiz do seu site. Nesse diretório, crie um arquivo de texto chamado disalloweduseragents.txt. Adicione as seguintes linhas ao arquivo:
badrobot1
badrobot2
AVISO: Certifique-se sempre de que o arquivo de texto não esteja diretamente acessível a partir da Web. Use o módulo Filtragem de Solicitações do IIS ou coloque o arquivo dentro da pasta App_Data para impedir que os clientes HTTP acessem diretamente o conteúdo desse arquivo.
Configurando FileContainsProvider
Configure FileMapProvider seguindo as mesmas etapas descritas em Configurando DbProvider. Use estes valores para as configurações do provedor:
- FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt (observe o uso de {DOCUMENT_ROOT} no caminho do arquivo. Isso é substituído pelo caminho real durante a inicialização do provedor. Isso é útil quando você não deseja colocar um caminho de arquivo absoluto no arquivo web.config)
- IgnoreCase: 1
Chamando FileContainsProvider de uma regra de reescrita
No diretório raiz de um site, abra o arquivo web.config. Se você usar o site padrão do IIS, o arquivo deverá estar localizado na pasta C:\inetpub\wwwroot\
.
Cole a seguinte regra de redirecionamento no arquivo web.config dentro do elemento /<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>
O conteúdo completo do arquivo web.config deve ser semelhante ao abaixo:
<?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>
Esta regra anulará a conexão HTTP se o agente do usuário da solicitação HTTP corresponder a qualquer uma das cadeias de caracteres listadas no arquivo disalloweduseragents.txt. A instância de FileContainsProvider chamada "FileContains" é invocada a partir da condição da regra e, se o resultado retornado do provedor não estiver vazio, a conexão HTTP será anulada.
Para testar a regra, abra o WFetch e adicione um cabeçalho user-agent à solicitação, conforme abaixo:
user-agent: badrobot1\r\n
Do WFetch, faça uma solicitação para http://localhost/test/
. Você deve ver que a conexão é anulada porque a cadeia de caracteres de agente de usuário correspondia a uma das cadeias de caracteres no arquivo disalloweduseragents.txt.