Eliminar ‘index.php’ de Laravel 4.1 en Apache 2 con mod_rewrite

Una vez que hayamos instalado Laravel, el acceso a los recursos precisa que las URLs queden como http://localhost/index.php/resource/. Sería más bonito poder quitar ese ‘index.php’, ¿verdad? Laravel incluye un archivo .htaccess en el directorio ‘public’ que sirve para reescribir las URLs internamente y que éstas sean como http://localhost/resource/.

Este archivo ‘.htacces’ contiene lo siguiente:

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>

RewriteEngine On

# Redirect Trailing Slashes…
RewriteRule ^(.*)/$ /$1 [L,R=301]

# Handle Front Controller…
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>

Como podemos ver, este archivo habilita el RewriteEngine, pero para ello necesita el módulo mod_rewrite habilitado en Apache. Usaremos el siguiente comando para habilitarlo:

$ sudo a2enmod rewrite
Enabling module rewrite.
To activate the new configuration, you need to run:
service apache2 restart

Es posible que con esto no sea suficiente, ya que la configuración del VirtualHost default contiene una directiva AllowOverride None que impide que .htaccess funcione. Así que tendremos que editar el archivo de configuración del VirtualHost (/etc/apache2/sites-available/default) y cambiar ‘AllowOverride None’ por ‘AllowOverride All’.

Una vez tengamos habilitado el módulo mod_rewrite y configurada la directiva AllowOverride All, reiniciamos Apache:

$ sudo service apache2 restart
* Restarting web server apache2                                                                                                                                                 apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
… waiting apache2: Could not reliably determine the server’s fully qualified domain name, using 127.0.1.1 for ServerName
[ OK ]

Ya podremos navegar por nuestra aplicación web sin tener que usar ‘index.php’.