Programación

Url's amigables en IIS

Las urls amigables están a la orden del día en cualquier web. Ya hemos hablado en otros artículos, de que son las urls amigables, y como poder usarlas en asp.net. Pero quizás, no podamos usar este último método, ya que estamos usando un framework anterior al 3.5 o quizas no queramos modificar la programación del web-site. En este artículo vamos a ver como poder crear rutas amigables directamente a través del propio IIS.

Para poder crear urls amigables con el IIS, primero hay que comprobar que esté activado el módulo de rewrites del IIS. Una vez activado, configuramos todo el enrutado a través del web.config. Para ello, vamos a crear una serie de reglas, ayudándonos con expresiones regulares, para redigir y estructurar todas las urls que necesitemos. Vamos a usar dos tipos:

  • Rewrites => Con ellas, vamos a definir unas normas para que el servidor "entienda" que las nuevas urls equivalen a las viejas rutas.
  • Redirects => Vamos a definir unas redirecciones, que manden al usuario desde las antiguas rutas a las nuevas amigables. Las redirecciones deben ser permanentes de cara a google, para que coja estas últimas como las definitivas, por tanto serán redirecciones 301.

¿Como creamos las reglas en el web.config?

Ya sabemos que tenemos que hacer con las rewrites y las redirects, ¿cómo las usamos?. Primero debemos definir que estamos en el modulo rewrite(1) y que vamos a crear unas reglas (2). Luego definimos la regla, la marcamos con un nombre, (importante que este nombre no se repita ya que sino nos dara un error 500). Con un ejemplo lo vemos mejor:

<rewrite>  (1)
<rules>    (2)
    <rule name="Rewrite paginado articulos">
      <match url="^articulos/([0-9]+)/" />
      <action type="Rewrite" url="articulo.aspx?pag={R:1}" />
    </rule>
</rules>
</rewrite>

Como vemos, dentro de la regla, definimos un "match", que es la ruta amigable creada, en ella tenemos un primer nivel con artículos, y un segundo con el paginado. Al ser un paginado numérico, añadimos una expresión regular que sólo admita números. Después está marcada la acción a realizar, en este caso, un rewrite. Con él marcamos que la url equivalente que se reescribe, es la antigua de /articulo.aspx/pag=3.

Ahora que hemos conseguido que el IIS entienda las nuevas urls, vamos a redirigir las antiguas a las nuevas amigables. Para ello creamos una nueva regla, en este caso sera un redirect, que redirigirá la antigua url a la nueva. Incluimos esta nueva regla dentro de la estructura anterior de rules.


<rule name="Redireccion paginado articulos">
    <match url="^articulos$" />
    <conditions>
          <add input="{QUERY_STRING}" pattern="pag=(\d+)" />
    </conditions>
    <action type="Redirect" url="/articulos/{R:1}/" redirectType="Permanent" />
</rule>

En este caso, añadimos un nuevo elemento, las condiciones. Éstas nos permitirán filtrar cierto tipo de eventos. En este caso, al ser un querystring, añadimos como dato de entrada la página, y luego marcamos en la redirección como queremos mostrarla con {R:1}

Con este sencillo ejemplo, hemos redireccionado un paginado que antes estaba con query-strings, a una ruta amigable bien formada. Ésto podemos aplicarlo a cualquier tipo de rutas, añadiendo todos los niveles que queramos.

Ahora vamos a ver otro ejemplo ahora con varios parámetros y condiciones:

<rule name="Redireccion de articulo con categoria">
    <match url="^articulos.aspx$" />
    <conditions>
        <add input="{QUERY_STRING}" pattern="cat=(\d+)" />
        <add input="##{R:1}##_{QUERY_STRING}" pattern="##([^#]+)##_.*art=(\d+)" />
    </conditions>

    <action type="Redirect" url="/articulos/{R:1}/{R:2}" redirectType="Permanent" appendQueryString="false" />
</rule>

En el ejemplo vemos dos variables por query strings, que se redirigen a una ruta perfectamente formada con dos niveles amigables.

Para acabar os dejo una redirección muy común en toda web, la que añade siempre por defecto las www al inicio de la ruta:

<rule name="without-www-to-with-www">
    <match url="^(.*)$" />

    <conditions logicalGrouping="MatchAll">
	</add input="{HTTP_HOST}" pattern="^dominio.com" />
    </conditions>

    <action type="Redirect" url="http://www.dominio.com/{R:1}" />
</rule>
Si quieres leer más articulos como este, sigueme => @ander_gs
Compartir en: