URL Rewriting en ASP.NET y Windows Azure

Cuando hacemos aplicaciones web es muy común tener alguna redirección de unas páginas a otras dependiendo de las acciones que tomen los usuarios. Con esto no me refiero a cuando hacen clic en un enlace, sino a acciones como por ejemplo hacer login y que si éste se hace correctamente, se redirecciona a su página de usuario o a una pantalla de inicio específica. Esto en ASP.NET lo realizamos con la función ampliamente conocida de “Response.Redirect”, haciendo que el servidor mande una redirección al cliente del usuario. Existen otro tipo de casos en los que el “Response.Redirect” no es nada recomendable, y es cuando queremos modificar la URL que introdujo el usuario.

Dos casos de uso los utilizamos en GPMESS. Uno de ellos es eliminar las “www” de la URL cuando el usuario escribe “http://www.gpmess.com”, y otro es forzar siempre el acceso por HTTPS. Esto se puede hacer con “Response.Redirect”, pero la forma mas eficiente es hacerlo directamente en el IIS, con el módulo de URL Rewrite. Para configurarlo en nuestro WebSite de Windows Azure, debemos añadir la configuración necesaria en nuestro Web.config dentro de la sección ya que no podemos acceder a la configuración del IIS directamente.

<system.webServer>
   <rewrite>
      <rules>
          <rule name="Remove www" stopProcessing="true">
              <match url="(.*)" ignoreCase="true" />
              <conditions logicalGrouping="MatchAll">
                   <add input="{HTTP_HOST}" pattern="^www.(.+)$" />
              </conditions>
              <action type="Redirect" url="https://{C:1}/{R:0}" appendQueryString="true"  				redirectType="Permanent" />
          </rule>
       <rules>
   <rewrite>
<system.webServer>

Con esto estamos indicando que cualquier URL que empiece por “www”, debe ser reescrita sin las “www”.

<system.webServer>
    <rewrite>
         <rules>
	<rule name="HTTP to HTTPS redirect" stopProcessing="true">
               <match url="(.*)" />
               <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                  <add input="{HTTPS}" pattern="off" ignoreCase="true" />
               </conditions>
               <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Permanent" />
            </rule>
       <rules>
   <rewrite>
<system.webServer>

Esta otra regla indica que todo lo que entre por HTTP debe ser reescrito a HTTPS y la combinación de las dos reglas nos resultará en que siempre se acabe reescribiendo la URL a https://gpmess.com.

Vamos a explicar ahora un poco algunos de los parámetros más importantes:

• Match url es una expresión regular que indica a qué URLs se va a realizar la acción indicada.
• Conditions es un parámetro opcional que hace que la acción indicada solo se ejecute si se cumplen condiciones. Se puede poner una expresión regular para comprobar la URL (parámetro pattern) o el tipo de protocolo utilizado (parámetro input). logicalGrouping indica las condiciones que se deben cumplir, que en nuestro caso con “MatchAll” indicamos que se deben de cumplir todas para que se realice la acción indicada.
• redirectType indica el tipo de redirección que se va a realizar. Si lo ponemos en “Permanent” nuestro IIS devuelve el código 301 y en “Temporary” devuelve el código 302.
• action es la acción que vamos a realizar que en nuestro caso es una redirección permanente. Podemos además añadir el código de error que queramos utilizando el parámetro statusCode y statusReason.

Podemos encontrar mucha más información en la propia web de Microsoft sobre el IIS: http://www.iis.net/learn/extensions/url-rewrite-module/creating-rewrite-rules-for-the-url-rewrite-module

Jugando con las expresiones regulares podemos realizar cualquier regla que se os ocurra para realizar cualquier tipo de reescritura de URLs. También se puede utilizar para tener unas URLs SEO Friendly, aunque bajo mi punto de vista realizarlo con la configuración de rutas como comenté en mi anterior post es más cómodo y sencillo. Ya podemos dejar de utilizar tanto “Response.Redirect” en nuestra aplicación Web!