miércoles, 1 de agosto de 2012

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.

2 comentarios:

  1. muito bom o seu post... como faço para abrir o SILEX agora? preciso criar algum arquivo de inicialização?

    ResponderEliminar
  2. Hola
    he probado con tu .htaccess

    "RewriteCond %{REQUEST_FILENAME} !-d" hace que nada funcione

    No he podido hacerlo funcionar ni con el .htaccess de Silex

    ¿Por que no muestras el resultado final y el archivo original del .htaccess?

    te agradecería mucho, ahhh y la llamada http tambien

    ResponderEliminar