miércoles, 1 de agosto de 2012

Silex - Comentario sobre la instalación

En mi servidor local no he tenido problemas para ubicar Silex fuera del servidor Web. Me explico: el raíz de mi servidor Web se encuentra en C:\Carpeta1\Carpeta2\WebServer de modo que el fichero index.php es exactamente C:\Carpeta1\Carpeta2\WebServer\index.php

He copiado la carpeta vendor del paquete Silex dentro de Carpeta2 dejando las cosas con la siguiente disposición:

C:\Carpeta1\Carpeta2\vendor
C:\Carpeta1\Carpeta2\WebServer\index.php
C:\Carpeta1\Carpeta2\WebServer\.htaccess

Y el index.php de prueba con el siguiente contenido

<?php
require_once __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->get('/hello', function() {
    return 'Hello!';
});
$app->run();
?>

me ha funciona sin problemas, es decir, http://localhost/hello me devuelve "Hello!".

Cuando el servidor Web es de un tercero nos podemos encontrar con que no se permite crear carpetas "por debajo" del nivel del raíz del servidor, por lo que lo que se puede hacer es copiar la carpeta silex en el raíz y ajustar la ruta del autoload de index.php. Las disposición queda


C:\Carpeta1\Carpeta2\WebServer\silex\vendor
C:\Carpeta1\Carpeta2\WebServer\index.php
C:\Carpeta1\Carpeta2\WebServer\.htaccess

con

require_once __DIR__.'/silex/vendor/autoload.php';

SILEX - Sorry, the page you are looking for could not be found

Nada más empezar a probar Silex nos podemos encontrar con que nos sale todo el rato un mensaje en el navegador como el que se muestra a continuación:


Algo no va bien y al ejecutar ejemplos tan sencillos como este:

<?php
require_once __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->get('/hello', function() {
    return 'Hello!';
});
$app->run();
?>

nos sale el mencionado mensaje. Este ejemplo, extraído de la documentación de Silex, debería hacer que con una simple llamada del tipo localhost/miweb/hello, el navegador mostrara la salida "Hello!".

Para resolver esta situación tenemos que hacer algunas cosas.
  1. Instalar el módulo mod_rewrite en Apache si no lo tuviéramos instalado
    Esto está explicado en esta entrada.
  2. Habilitar el uso de .htaccess en nuestro Apache
    Esto está explicado en esta entrada
  3. Poner en el raíz de nuestra Web un fichero .htaccess con el siguiente contenido:
  RewriteEngine On
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php [QSA,L]

Una pequeña explicación sobre el contenido del .htaccess
Silex nos podría funcionar simplemente con este contenido...

  RewriteEngine On
  RewriteRule ^(.*)$ index.php [QSA,L]

(donde el significado de los FLAGS  QSA y L están muy bien descritos en esta página)

... que lo "mandaría" todo sin excepción a index.php, pero se han añadido dos condiciones de forma que, teniendo en cuenta que , %{REQUEST_FILENAME} es una variable del servidor que contiene la ruta local completa de la petición en el sistema de archivos local, la condición

RewriteCond %{REQUEST_FILENAME} !-f
... hace que si la petición es la de un fichero que existe en el servidor, entonces no se sirve index.php. Es decir, si la petición se corresponde con un fichero real, se sirve éste y no index.php

y la condición

RewriteCond %{REQUEST_FILENAME} !-d
... hace que si la petición es la de un directorio  que existe en el servidor, entonces no se sirve index.php. Es decir, si la petición se corresponde con un directorio real, se sirve el contenido de éste y no index.php.

Nota final:
Por lo que he podido leer en algunos casos es posible que en el .htaccess antes de los RewriteCond sea necesario incluir una línea como la siguiente:

RewriteBase /path/to/app

MUY IMPORTANTE:
Al poco de escribir esta entrada he visto que en esta página se encuentra la documentación oficial de Silex sobre cómo se ha de configurar Apache.

Activar mod_rewrite en Apache

Este es uno de lo módulos más útiles de Apache que nos permiten sacar mucho partido a los .htaccess. Para comprobar si lo tenemos instalado hay que mirar en el apartado "Loaded Modules" de la información que obtenemos mediante la función phpinfo() de php. Si en la lista no aparece mod_rewrite, entonces tendremos que configurar Apache para que lo cargue.

Es muy sencillo, simplemente hay que editar el fichero httpd.conf ubicado en la carpeta "conf" del directorio donde está instalado Apache y habilitar la línea "LoadModule rewrite_module modules/mod_rewrite.so". Luego reiniciamos Apache y con phpinfo() podremos verificar si se ha cargado el módulo.