Personal tools
You are here: Home Miembros enlavin's Home Breve introducción a las reglas de reescritura de Apache
Document Actions

Breve introducción a las reglas de reescritura de Apache

by Lorenzo Gil Sanchez last modified 11-04-2005 07:04 PM

Breve introducción a las reglas de reescritura del módulo mod_rewrite de Apache usadas en la configuración de las asociaciones que cuelgan de http://cicode-gcubo.ugr.es

Nociones básicas

Las reglas de reescritura de Apache sirven para manipular mediante expresines regulares las urls que recibimos en una petición. En nuestro caso concreto se emplean para decidr qué urls sirve directamente Apache y cuáles sirve Zope.

Una regla de reescritura es de la forma:

        RewriteRule patron nueva-url [modificador1, modificador2, ....]

  • RewriteRule es una palabra reservada que define el módulo mod_rewrite de Apache.
  • patron es una expresión regular.
  • nueva-url destino de la regla de reescritura. Se puede hacer referencia a cosas encontradas en la expresión regular anterior. Luego veremos un ejemplo.
  • modificadores. Son opcionales, van entre corchetes y definen el tipo de acción que se va a realizar aparte de modificar la url. Se pueden combinar allí donde tenga sentido. Tenemos:
    • Nada: opción por defecto. El servidor web hace la redirección internamente y sigue procesanto la siguiente regla.
    • L: se procesa la regla actual y el servidor web no sigue evaluando más reglas.
    • R: el servidor hace una redirección a la url de destino generando un código HTTP 302 que recibe el cliente. Es por tanto el cliente el que debe cargar la nueva url. Hay que tener cuidado, porque los POST se convierten en GET y se pierden los parámetros.
    • P: el servidor web hace una subconsulta a la nueva url y devuelve el resultado al cliente, comportándose como un proxy.

Configuración del servidor

Sabemos que la dirección base del host virtual de cicode-gcubo es http://cicode-gcubo.ugr.es y que Zope está instalado en la misma máquina que Apache, pero en puerto 8080.

En el espacio de nombres de Zope, la dirección del portal de la AsociacionX es:

        /sitios/asociacionx/portal

Y la url que queremos que tenga la asociacion al final será:

        http://cicode-gcubo.ugr.es/asociacionx

En el fichero de configuración del host virtual de cicode-gcubo vamos a encontrar las siguientes reglas:

        RewriteEngine On

        # Asociacion X
        RewriteRule ^/asociacionx(.*)$ http://127.0.0.1:8080/VirtualHostBase/http/cicode-gcubo.ugr.es:80/sitios/asociacionx/portal/VirtualHostRoot/_vh_asociacionx$1 [L,P]
        # lo de arriba tantas veces como asociaciones haya

        # Pagina principal
        RewriteRule ^(.*)$ http://127.0.0.1:8080/VirtualHostBase/http/cicode-gcubo.ugr.es:80/sitios/CicodeGcubo/portal/VirtualHostRoot$1 [L,P]

Vamos con el desglose de la regla correspondiente a la asociación.

  • La expresión regular dice que la regla se ejecutará sobre todas las urls que empiecen por /asociacionx . Esto tiene como como inconveniente que si tenemos una asociacionx y otra asociacionxanadu tendríamos que definir primero la que tiene el nombre más largo para que Apache pueda hacer matching correctamente de las 2. Si no la del nombre más corto enmascararía a la otra.
  • La url de destino es un poco chorizo, pero tiene su explicación, que no es por joder ;-) . La primera idea que se nos puede ocurrir es que fuese de la forma :
            RewriteRule ^(.*)$ http://127.0.0.1:8080/sitios/asociacionx/portal$1 [L,P]
    

Esta regla, que aparentemente parece correcta, tiene como principal problema que Zope no conoce el prefijo correcto que tiene que anteponerle a las urls el portal ha de generar. Es decir, ¿cómo sabe ahí el Plone de asociacionx que tiene que generar urls internas de la forma http://cicode-gcubo.ugr.es/asociacionx/loquesea ? Para eso se utiliza un producto de Zope llamado Virtual Host Monster (vhm para abreviar). Hay que pedirle a Zope una url más compleja, pero que ya incluye la información necesaria para generar urls correctas.

Vhm define dos palabras clave en las urls para distinguir qué parte corresponde al host raiz y cuál a la ruta dentro del mismo: VirtualHostBase y VirtualHostRoot. La forma de la url es un liosa, pero voy a intentar aclararla:

  • Dirección de Zope http://127.0.0.1:8080, que es el que va a procesar la url.
  • Prefijo /VirtualHostBase, seguido de la dirección del sitio raiz (el gestionado por Apache). En nuestro caso es /http/cicode-gcubo.ugr.es/80 (nótese que se incluye el puerto).
  • Dirección del objeto Zope sobre el que se va a efectuar el mapeo. Pondremos el objeto portal de cada asociación. Aquí será /sitios/asociacionx/portal.
  • Prefijo /VirtualHostRoot. Si la url final colgase directamente de / ya podríamos parar aquí. Pero como cada asociación cuelga del raiz del sitio hay que añadir /_vh_asociacionx. Todos los componentes de la url que empiecen por _vh_loquesea serán sustituidos en la url final como /loquesea.
  • $1 se refiere a la parte que hace matching en el primer paréntesis de la expresión regular. De esta forma todo lo que iba en la url original se pasa a la url que se le enviará a Zope.

(nota: la explicación ha quedado algo liosa, pero es que el tema tampoco es nada sencillo).

  • Los modificadores L,P hacen que Apache haga de proxy con respecto a Zope y que cada vez que se activa una regla ésta sea la última que se procesa.

La última regla es parecida a las reglas que hay que poner para cada asociación, pero configurada para que haga matching con cualquier url que no haya sido asignada a una asociación. Es decir, toda url que no esté contemplada por una RewriteRule será manejada por el portal de Cicode directamente.

Más información


Powered by Plone CMS, the Open Source Content Management System Powered by GCubo Powered by Cicode

This site conforms to the following standards: