URLs limpias en Drupal con lighttpd

Drupal, el gestor de contenidos que corre adobo.org, tiene la posibilidad de tener URLs "limpias". En lugar de URLs como:

http://ejemplo.org/?q=node/3

Permite ser configurado para usar URLs del tipo:

http://ejemplo.org/node/3

Esto es muy fácil usando el servidor web Apache y el módulo mod_rewrite, ya que Drupal viene por defecto configurado para ello. Pero aquí uso lighttpd [1] y no es tan simple. ¿Cómo conseguir URLs limpias sin tener que usar el módulo ModRewrite de lighttpd ? No es que no quiera usarlo por aversión o algo parecido, es que simplemente es menos potente que su casi homónimo en Apache y hay que ir especificando casos particulares de reescritura.

La solución la encontré en Running Drupal with Clean URL on Nginx or Lighttpd, aunque le he tenido que realizar un par de cambios. Los pasos a seguir son los siguientes:

  1. Editar el fichero lighttpd.conf
  2. Utilizar la opción:
         server.error-handler-404 = "/index.php";
       
  3. Editar el fichero sites/default/settings.php de Drupal, y añadir al final el siguiente bloque de código:
    if (strpos($_SERVER['SERVER_SOFTWARE'], 'lighttpd') !== false) {
        $_lighty_url = $base_url.$_SERVER['REQUEST_URI'];
        $_lighty_url = @parse_url($_lighty_url);

        if ($_lighty_url['path'] != '/index.php' && $_lighty_url['path'] != '/'
                && $_lighty_url['path'] != '/update.php') {
            $_SERVER['QUERY_STRING'] = $_lighty_url['query'];
            parse_str($_lighty_url['query'], $_lighty_query);
            foreach ($_lighty_query as $key => $val)
                $_GET[$key] = $_REQUEST[$key] = urldecode($val);
            $_GET['q'] = $_REQUEST['q'] = urldecode(substr($_lighty_url['path'], 1));
        }      
    }  
      
  4. Reiniciar lighttpd y configurar Apache para usar URLs limpias :)

Se trata de un pequeño hack o chapucilla que reescribe todas las URLs que llegan a lighttpd salvo 3 (index.php, / y update.php), traduciendo la petición a la manera en que Drupal la espera.

He hecho un par de cambios respecto al código original, ambos recogidos ahora en la página anteriormente citada en forma de comentarios (uno de ellos mío). El primero es contemplar el caso especial de update.php, ya que si no nunca podremos actualizar. El segundo lo acabo de aplicar, ha sido el uso de la función urldecode() sin el que, por ejemplo, las etiquetas no se autocompletaban al redactar una entrada. Y ya está, todo funciona igual que en Apache y sin mucha complicación.

Clasificado como

Comentarios

Enviar un comentario nuevo

  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <p>

Más información sobre opciones de formato

CAPTCHA
Esta pregunta sirve para evitar envíos automatizados y SPAM
13 + 0 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.