Uso de proveedores de reescritura personalizados con el módulo de reescritura de URL
por Ruslan Yakushev
Este tutorial le guiará en el uso de proveedores de reescritura personalizados con URL Rewrite Module 2.0. En el tutorial se utiliza Ejemplos de extensibilidad de URL Rewrite 2.0, que se pueden descargar desde Ejemplos de extensibilidad de URL Rewrite en la Galería de código de MSDN.
Instalación de Ejemplos de extensibilidad de URL Rewrite
Para completar este tutorial, descargue e instale Ejemplos de extensibilidad de URL Rewrite (https://www.microsoft.com/download/details.aspx?id=43353
). El paquete de instalación Ejemplos de extensibilidad incluye ensamblados de .NET y el código fuente con la implementación completa de proveedores de reescritura para los tres casos de uso más comunes:
- Almacenamiento de las asignaciones de reescritura o redireccionamiento en una base de datos SQL;
- Almacenamiento de las asignaciones de reescritura o redireccionamiento en un archivo de texto;
- Almacenamiento de las subcadenas de búsqueda en un archivo de texto.
Durante la instalación, asegúrese de seleccionar la opción "Runtime" en la configuración personalizada. Esto registrará los proveedores de ejemplo en la caché de ensamblados global de .NET para que URL Rewrite Module los utilice.
Registro de los proveedores
Hay 3 proveedores de reescritura incluidos en el paquete de instalación:
- DbProvider: este proveedor se puede usar para recuperar las asignaciones de reescritura de una tabla de base de datos de SQL Server mediante la ejecución de un procedimiento almacenado;
- FileMapProvider: este proveedor se puede usar para recuperar las asignaciones de reescritura almacenadas en un archivo de texto;
- FileContainsProvider: este proveedor se puede usar para comprobar si alguna cadena de un archivo de texto es una subcadena de la cadena de entrada del proveedor.
Para usar los proveedores de ejemplo en las reglas de reescritura, los proveedores deben registrarse en IIS. Para registrar un proveedor, puede usar la interfaz de usuario de Administrador de IIS:
- Abra la característica URL Rewrite en el Administrador de IIS;
- Seleccione la acción "Ver proveedores..." en el panel "Acciones" en el lado derecho;
- Seleccione la acción "Agregar proveedor..." en el panel "Acciones";
- En el cuadro de diálogo "Agregar proveedor", escriba el nombre que desea usar para este proveedor al hacer referencia a él desde una regla de reescritura.
- Después, elija el tipo de .NET correspondiente para el proveedor en la lista desplegable "Tipo administrado". Tenga en cuenta que los tipos de proveedor pueden tardar algún tiempo en aparecer allí.
- Repita los pasos anteriores para registrar los tres proveedores.
Uso de DbProvider
Para usar DbProvider, necesitará acceder a Microsoft SQL Server. El proveedor se conecta a una base de datos de SQL Server y ejecuta un procedimiento almacenado que toma un parámetro de entrada NVARCHAR que contiene la cadena de dirección URL de entrada y devuelve una fila, un conjunto de resultados de columna que contiene la cadena de dirección URL de salida de tipo NVARCHAR.
Creación de una base de datos de ejemplo
Abra una instancia de SQL Server Management Studio, luego una nueva ventana de consulta y ejecute el siguiente 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
El script anterior crea una nueva base de datos denominada RewriteDB, que tiene una tabla RewriteTable y un procedimiento almacenado GetRewrittenURL. También concede permisos a la cuenta APPPOOL\DefaultAppPool de IIS para ejecutar ese procedimiento almacenado. Rellena igualmente la tabla de base de datos con dos asignaciones de direcciones URL.
Configuración de las opciones de DbProvider
Configure la instancia de DbProvider para llamar al procedimiento almacenado:
- En el Administrador de IIS, en la vista de características de URL Rewrite, seleccione "Ver proveedores..." en el panel de acciones.
- Seleccione "Agregar proveedor" y elija DbProvider. Asígnele el nombre DB; será el nombre por el que se referirá al proveedor desde una regla de reescritura.
- Seleccione la instancia de DbProvider denominada DB y haga clic en la acción "Agregar configuración del proveedor...".
- Utilice el cuadro de diálogo "Editar configuración del proveedor" para configurar el proveedor:
Use los valores siguientes para la configuración del proveedor:
- Cadena de conexión de SQL Server: proporcione una cadena de conexión de SQL Server, por ejemplo:
"Data Source=servername\sqlexpress;Initial Catalog=RewriteDB;Integrated Security=True" - Nombre del procedimiento almacenado: GetRewrittenUrl
- Intervalo de minutos de caché: se establece en 0 si los valores de la tabla SQL no cambian o en un entero positivo para que el proveedor actualice periódicamente la caché de reescritura interna del módulo. Si no se especifica, se da por supuesto que el valor es 0.
Llamada a DbProvider desde una regla de reescritura
En el directorio raíz de un sitio web, abra el archivo web.config. Si usa el sitio web predeterminado de IIS, el archivo debe encontrarse en la carpeta C:\inetpub\wwwroot\
.
Pegue la siguiente regla de redireccionamiento en el archivo web.config dentro del 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>
El contenido completo del archivo web.config debe ser similar al siguiente:
<?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 regla realiza el redireccionamiento HTTP a una dirección URL que se obtiene de una base de datos de SQL Server mediante DbProvider. La instancia de DbProvider denominada "DB" se invoca desde la condición de la regla y, si el resultado devuelto por el proveedor no está vacío, se realiza el redireccionamiento HTTP.
Para probar la regla, abra un explorador web y realice una solicitud a http://localhost/old/catalog/product.html
o http://localhost/old/contactus/index.html
. Observe que el explorador se redirige a una nueva dirección URL en función de las asignaciones de redireccionamiento definidas en la tabla de base de datos de RewriteDB. El servidor web devolverá el error HTTP 404 para la dirección URL redirigida porque no hay ningún archivo o directorio de ese tipo en el servidor, pero eso no es pertinente para los fines de este tutorial. Lo importante es que el servidor web emitió una respuesta de redireccionamiento basada en la regla que usó DbProvider.
Uso de FileMapProvider
FileMapProvider lee las asignaciones de direcciones URL de un archivo de texto. Se puede usar en lugar de la funcionalidad de asignaciones de reescritura integrada cuando la cantidad de entradas de asignaciones de reescritura es muy grande y no es práctico mantenerlas en un archivo web.config.
Creación de un archivo de asignaciones de ejemplo
Cree un directorio denominado App_Data en el directorio raíz del sitio web. En ese directorio, cree un archivo de texto denominado redirectmappings.txt. Agregue las líneas siguientes al archivo:
old/catalog/product.html, new/category/product.html
old/contactus/index.html, new/contactus.html
ADVERTENCIA: Asegúrese siempre de que el archivo de texto no sea accesible directamente desde la Web. Use el módulo Filtrado de solicitudes de IIS o coloque el archivo en la carpeta App_Data para evitar que los clientes HTTP accedan directamente al contenido de este archivo.
Configuración de FileMapProvider
Configure FileMapProvider siguiendo los mismos pasos descritos en Configuración de DbProvider. Use estos valores para la configuración del proveedor:
- FilePath: {DOCUMENT_ROOT}\App_Data\redirectmappings.txt (tenga en cuenta el uso de {DOCUMENT_ROOT} en la ruta de acceso del archivo. Esto se reemplaza por la ruta de acceso real durante la inicialización del proveedor. Esto resulta es útil cuando no desea colocar una ruta de acceso de archivo absoluta en el archivo web.config.)
- IgnoreCase: 1
- Separator: "," (si no se especifica, se utilizará el símbolo TAB como separador)
Llamada a FileMapProvider desde una regla de reescritura
En el directorio raíz de un sitio web, abra el archivo web.config. Si usa el sitio web predeterminado de IIS, el archivo debe encontrarse en la carpeta C:\inetpub\wwwroot\
.
Pegue la siguiente regla de redireccionamiento en el archivo web.config dentro del 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>
El contenido completo del archivo web.config debe ser similar al siguiente:
<?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 regla realiza el redireccionamiento HTTP a una dirección URL que se obtiene de un archivo de texto mediante FileMapProvider. La instancia de FileMapProvider denominada "FileMap" se invoca desde la condición de la regla y, si el resultado devuelto por el proveedor no está vacío, se lleva a cabo el redireccionamiento HTTP.
Para probar la regla, abra un explorador web y realice una solicitud a http://localhost/old/catalog/product.html
o http://localhost/old/contactus/index.html
. Observe que el explorador se redirige a una nueva dirección URL en función de las asignaciones de redireccionamiento definidas en el archivo redirectmappings.txt. El servidor web devolverá el error HTTP 404 para la dirección URL redirigida porque no hay ningún archivo o directorio de ese tipo en el servidor, pero eso no es pertinente para los fines de este tutorial. Lo importante es que el servidor web emitió una respuesta de redireccionamiento basada en la regla que usó FileMapProviders.
Uso de FileContainsProvider
FileContainsProvider lee el conjunto de cadenas de un archivo de texto y comprueba luego si la cadena de entrada del proveedor contiene cualquiera de esas cadenas como subcadena. El proveedor se puede utilizar, por ejemplo, con reglas de reescritura que bloquean el acceso en función del encabezado user-agent.
Creación de un archivo de agentes de usuario no autorizados de ejemplo
Cree un directorio denominado App_Data en el directorio raíz del sitio web. En ese directorio, cree un archivo de texto denominado disalloweduseragents.txt. Agregue las líneas siguientes al archivo:
badrobot1
badrobot2
ADVERTENCIA: Asegúrese siempre de que el archivo de texto no sea accesible directamente desde la Web. Use el módulo Filtrado de solicitudes de IIS o coloque el archivo en la carpeta App_Data para evitar que los clientes HTTP accedan directamente al contenido de este archivo.
Configuración de FileContainsProvider
Configure FileMapProvider siguiendo los mismos pasos descritos en Configuración de DbProvider. Use estos valores para la configuración del proveedor:
- FilePath: {DOCUMENT_ROOT}\App_Data\disalloweduseragents.txt (tenga en cuenta el uso de {DOCUMENT_ROOT} en la ruta de acceso del archivo. Esto se reemplaza por la ruta de acceso real durante la inicialización del proveedor. Esto resulta es útil cuando no desea colocar una ruta de acceso de archivo absoluta en el archivo web.config.)
- IgnoreCase: 1
Llamada a FileContainsProvider desde una regla de reescritura
En el directorio raíz de un sitio web, abra el archivo web.config. Si usa el sitio web predeterminado de IIS, el archivo debe encontrarse en la carpeta C:\inetpub\wwwroot\
.
Pegue la siguiente regla de redireccionamiento en el archivo web.config dentro del 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>
El contenido completo del archivo web.config debe ser similar al siguiente:
<?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 regla anula la conexión HTTP si el agente de usuario de la solicitud HTTP coincide con cualquiera de las cadenas enumeradas en el archivo disalloweduseragents.txt. La instancia de FileContainsProvider denominada "FileContains" se invoca desde la condición de la regla y, si el resultado devuelto por el proveedor no está vacío, se anula la conexión HTTP.
Para probar la regla, abra WFetch y agregue un encabezado user-agent a la solicitud como se indica a continuación:
user-agent: badrobot1\r\n
Desde WFetch, realice una solicitud a http://localhost/test/
. Debería ver que la conexión se anula porque la cadena del agente de usuario coincide con una de las cadenas del archivo disalloweduseragents.txt.