Compartir a través de


Reescritura de URL para IIS y enrutamiento de ASP.NET

por Ruslan Yakushev

Con el lanzamiento del módulo URL Rewrite para IIS y la inclusión del enrutamiento de ASP.NET en .NET Framework 4, ha habido muchas preguntas de desarrolladores de ASP.NET sobre cómo se relacionan estas dos características entre sí y cuándo debe usar la una o la otra. En este documento se describen las diferencias entre estas dos tecnologías y se proporcionan instrucciones para los desarrolladores web sobre cuándo usar la reescritura de URL para IIS y cuándo el enrutamiento de ASP.NET.

Desde una perspectiva general, parece que estas tecnologías proporcionan una funcionalidad muy similar. Ambas permiten que las aplicaciones web tengan direcciones URL fáciles de usar y fáciles de buscar. Sin embargo, hay diferencias fundamentales entre estas dos tecnologías que es importante conocer para tomar la decisión correcta sobre cuál usar para la aplicación web. Para ayudarle a conocer esas diferencias, primero explicaremos cómo funciona la reescritura de URL para IIS y el enrutamiento de ASP.NET.

Reescritura de URL para IIS

La idea básica de la reescritura de URL no es un concepto nuevo. Se introdujo en el servidor web Apache hace aproximadamente una década. Desde entonces ha demostrado ser una herramienta muy útil para administradores de servidores web y desarrolladores web. Muchas aplicaciones populares que se hospedan en Apache ahora dependen de la reescritura de URL para habilitar la compatibilidad con direcciones URL "limpias".

El concepto de reescritura de URL es sencillo. Cuando un cliente envía una solicitud al servidor web de una dirección URL determinada, el módulo de reescritura de URL analiza la dirección URL solicitada y la cambia por otra URL en el mismo servidor. El módulo de reescritura de URL se ejecuta al principio de la canalización de procesamiento de solicitudes, modificando la URL solicitada antes de que el servidor web decida qué controlador usar para procesar la solicitud. El controlador, que se elige en función de la dirección URL reescrita, procesa la solicitud y genera una respuesta que se devuelve al explorador web. El cliente solicitante nunca ve la dirección URL reescrita; en lo que respecta al cliente, ha recibido una respuesta desde la dirección URL original.

En términos de la arquitectura de IIS, este proceso se representa mediante el diagrama siguiente:

Diagram of the I I S U R L Rewriting process from the H T T P Request to the H T T P Response.

El módulo URL Rewrite es un módulo de código nativo que se conecta a la canalización de procesamiento de solicitudes en las fases de solicitud previa al comienzo o solicitud de comienzo y, a continuación, evalúa la ruta de acceso de la dirección URL solicitada mediante un conjunto de reglas de reescritura. Cada regla de reescritura analiza la ruta de acceso URL y, si se cumplen todas las condiciones de la regla, cambia la ruta de acceso original a una nueva. Una vez evaluadas todas las reglas, el módulo URL Rewrite genera una ruta de acceso URL final que se usa para la solicitud durante el resto del procesamiento de la canalización de IIS. Esto significa que la selección del controlador en la canalización de IIS se realiza en función de la dirección URL reescrita generada por el módulo URL Rewrite.

Enrutamiento de ASP.NET

El enrutamiento de ASP.NET es un mecanismo de envío de solicitudes que permite a los desarrolladores asociar una dirección URL determinada a un controlador que pueda procesar las solicitudes realizadas a esa URL. Esta asociación se realiza mediante el registro de las "rutas" que definen qué controlador se va a invocar para una ruta de acceso URL determinada. Cuando se realiza una solicitud a un servidor web, el enrutamiento de ASP.NET busca la ruta de acceso URL solicitada en la lista de rutas registradas. Si se encuentra la ruta, se invoca al controlador correspondiente de esa ruta para que procese esa solicitud.

En términos de la arquitectura de IIS y ASP.NET, este proceso se representa mediante el diagrama siguiente:

Diagram of the A S P dot NET routing process using I H T T P Handlers from Request to Response.

El enrutamiento de ASP.NET se implementa como un módulo de código administrado que se conecta a la canalización de procesamiento de solicitudes de IIS en la fase de resolución de caché (evento PostResolveRequestCache) y en la fase de asignación de controlador (evento PostMapRequestHandler). El enrutamiento de ASP.NET está configurado para ejecutarse en todas las solicitudes realizadas a la aplicación web.

Durante el evento PostResolveRequestCache, el módulo busca una tabla de enrutamiento (una colección de objetos de ruta) para una ruta que coincida con la ruta de acceso URL solicitada. Si se encuentra una coincidencia, el módulo obtiene una referencia al controlador que corresponde a esa ruta y guarda la referencia como parte del contexto HTTP actual. Un controlador puede ser cualquier objeto de .NET Framework que implemente la interfaz System.Web.IHttpHandler. Si no se encuentra ninguna ruta, el módulo no hace nada y la dirección URL pasa y se procesa normalmente (habitualmente, coincidiendo con un archivo en el disco).

Durante el evento PostMapRequestHandler, el módulo comprueba si el contexto HTTP contiene información sobre un controlador. Si es así, el enrutamiento de ASP.NET usa la información para establecer la propiedad Handler del contexto HTTP actual. Esto garantiza que, durante la fase Ejecutar controlador, IIS ejecutará el controlador seleccionado por el módulo de enrutamiento. Si no se establece esa información, el módulo no hace nada y la dirección URL pasa para permitir que IIS realice una selección del controlador.

Diferencias entre la reescritura de URL para IIS y el enrutamiento de ASP.NET

En función de la explicación anterior, hay las siguientes diferencias conceptuales principales entre la reescritura de URL para IIS y el enrutamiento de ASP.NET:

  1. La reescritura de URL se usa para manipular las rutas de acceso URL antes de que el servidor web controle la solicitud. El módulo de reescritura de URL no sabe qué controlador procesará finalmente la dirección URL reescrita. Además, es posible que el controlador de solicitudes real no sepa que se ha reescrito la dirección URL.
  2. El enrutamiento de ASP.NET se usa para enviar una solicitud a un controlador en función de la ruta de acceso URL solicitada. A diferencia de la reescritura de URL, el módulo de enrutamiento conoce los controladores y selecciona el controlador que debe generar una respuesta para la dirección URL solicitada. Puede considerar el enrutamiento de ASP.NET como un mecanismo avanzado de asignación de controladores.

Además de estas diferencias conceptuales, existen las siguientes diferencias funcionales entre la reescritura de URL para IIS y el enrutamiento de ASP.NET:

  1. El módulo URL Rewrite para IIS se puede usar con cualquier tipo de aplicación web, por ejemplo, ASP.NET, PHP o ASP, y con archivos estáticos. El enrutamiento de ASP.NET solo se puede usar con aplicaciones web basadas en .NET Framework.
  2. El funcionamiento del módulo URL Rewrite para IIS no depende de si se usa el modo de canalización de IIS integrado o el clásico para el grupo de aplicaciones. En el caso del enrutamiento de ASP.NET, es preferible usar el modo de canalización integrado. El enrutamiento de ASP.NET puede funcionar en modo clásico, pero en ese caso las direcciones URL de la aplicación deben incluir extensiones de nombre de archivo o debe configurarse la aplicación para que use la asignación de controladores "*" en IIS.
  3. El módulo URL Rewrite para IIS puede tomar decisiones de reescritura basadas en nombres de dominio, encabezados HTTP y variables de servidor. De forma predeterminada, el enrutamiento de ASP.NET solo funciona con rutas de acceso URL y con el encabezado HTTP-Method.
  4. Además de reescribir, el módulo URL Rewrite puede realizar un redireccionamiento HTTP, emitir códigos de estado personalizados y anular solicitudes. El enrutamiento de ASP.NET no realiza estas tareas.
  5. El módulo URL Rewrite no es extensible en su versión actual. El enrutamiento de ASP.NET es totalmente extensible y personalizable.

¿Qué opción debería usar?

¿Qué significa toda esta información si tiene que elegir una tecnología para habilitar direcciones URL limpias para las aplicaciones web? En esta sección, se explica cómo realizar esta elección.

Si la aplicación web se crea mediante cualquier cosa excepto ASP.NET, use el módulo URL Rewrite para IIS. De lo contrario, las reglas son:

  1. Si va a desarrollar una nueva aplicación web de ASP.NET que usa ASP.NET MVC o tecnologías de datos dinámicos de ASP.NET, use el enrutamiento de ASP.NET. La aplicación se beneficiará de la compatibilidad nativa con direcciones URL limpias, incluida la generación de estas para los vínculos de las páginas web. Tenga en cuenta que el enrutamiento de ASP.NET aún no admite aplicaciones estándar de Web Forms, aunque hay planes para admitirlas en el futuro.
  2. Si ya tiene una aplicación web ASP.NET heredada y no desea cambiarla, use el módulo URL Rewrite. El módulo URL Rewrite le permite traducir direcciones URL fáciles de buscar en un formato que la aplicación usa actualmente. Además, permite crear reglas de redireccionamiento que se pueden usar para redirigir los rastreadores del motor de búsqueda a las direcciones URL limpias.

En la práctica, sin embargo, la elección no tiene por qué ser una u otra. Ambas tecnologías se pueden usar juntas y pueden complementarse entre sí. En las secciones siguientes, se describen algunos escenarios en los que puede usar el enrutamiento de ASP.NET y la reescritura de URL para IIS de forma conjunta.

Exigir direcciones URL canónicas para la aplicación.
Debe forzar el uso de http://www.mysite.com/home/about en lugar de http://mysite.com/Home/About. Cuando un cliente web solicita una dirección URL que no se ajusta al formato que desea, el cliente se redirige a una dirección URL canónica. En este escenario, puede usar el módulo URL Rewrite para aplicar direcciones URL canónicas y realizar el redireccionamiento, y el enrutamiento de ASP.NET para seleccionar un controlador que procese la ruta de acceso URL solicitada.

En el ejemplo siguiente se muestra una regla de reescritura de URL que puede usar para este escenario:

<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>

Servicio de contenido estático desde otro sitio o servidor.
La aplicación web se implementa en varios servidores de tal manera que el contenido web dinámico se encuentra en un sitio o servidor y todo el contenido estático está en un sitio o servidor diferente. Puede usar el módulo URL Rewrite junto con el módulo de enrutamiento de solicitud de aplicaciones de IIS para reenviar todas las solicitudes de archivos estáticos a un servidor diferente, a la vez que atiende todas las solicitudes de páginas web dinámicas del servidor actual. De este modo, el enrutamiento de ASP.NET solo se usa para el contenido web dinámico y no evalúa ninguna dirección URL para el contenido estático.

En el ejemplo siguiente se muestra una regla de reescritura de URL que puede usar para este escenario:

<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>

Administración de contenido estático.
Incluso si los archivos o carpetas estáticos se mueven a una nueva ubicación, puede admitir direcciones URL antiguas por motivos de compatibilidad con versiones anteriores. De hecho, es posible que no desee que los visitantes del sitio web sepan que los archivos o carpetas se han movido. En ese caso, puede usar el módulo URL Rewrite para reescribir rutas de acceso para los archivos estáticos, mientras que todas las direcciones URL de las páginas web de ASP.NET dinámicas se controlan mediante el módulo de enrutamiento.

En el ejemplo siguiente se muestra una regla de reescritura de URL que puede usar para este escenario:

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

Bloqueo de solicitudes.
El módulo URL Rewrite se puede usar para bloquear determinadas solicitudes en función de varios criterios. Por ejemplo, puede impedir que determinados rastreadores de sitios accedan a rutas de acceso URL específicas de su sitio web. De este modo, las solicitudes prohibidas ni siquiera llegarán al enrutador de ASP.NET, lo que reducirá la carga en el servidor web.

En el ejemplo siguiente se muestra una regla de reescritura de direcciones URL que puede usar para bloquear rastreadores de sitios no deseados. Tenga en cuenta que las solicitudes se bloquean para una ruta de acceso URL determinada basada en el encabezado HTTP usuario-agente o en la dirección IP del cliente:

<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>

Indicaciones futuras

Aunque la reescritura de URL para IIS y el enrutamiento de ASP.NET se superponen en ocasiones desde el punto de vista funcional, afrontan escenarios que son exclusivos de cada tecnología. Por eso, estas dos tecnologías seguirán existiendo y evolucionarán como componentes independientes en IIS, con la posibilidad de una integración más estrecha entre ellas. Por ejemplo, el enrutamiento de ASP.NET puede usar algunas de las herramientas enriquecidas que se proporcionan con el módulo URL Rewrite. El módulo URL Rewrite se puede integrar mejor con ASP.NET en lo que respecta a proporcionar extensibilidad para personalizar la lógica de reescritura de direcciones URL.

Conclusión

La reescritura de direcciones URL para IIS o el enrutamiento de ASP.NET se puede usar para implementar escenarios de manipulación de direcciones URL para la aplicación web. El enrutamiento de ASP.NET es una solución optimizada para ASP.NET, por lo que puede ser preferible para los desarrolladores web que diseñan sus aplicaciones ASP.NET desde cero y quieren tener una estructura de URL limpia. La reescritura de direcciones URL para IIS es un mecanismo genérico de manipulación de direcciones URL que da respuesta a una gran cantidad de escenarios. En concreto, la pueden usar los desarrolladores web o los administradores de servidores o sitios web para habilitar URL limpias para aplicaciones web existentes sin modificar el código de la aplicación.