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.
- Instalar el módulo mod_rewrite en Apache si no lo tuviéramos instalado
Esto está explicado en esta entrada.
- Habilitar el uso de .htaccess en nuestro Apache
Esto está explicado en esta entrada
- 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.