Spiga

Redirección 301 en Symfony: filtros vs htaccess

January 27, 08 by Pedro Hernández

Este tema salio de una urgencia que tubo mi buen amigo Joan y como ya antes en la lista de symfony en español se había preguntado, salio la idea de resolverlo a modo de competencia. Por mi parte como Filtro de Symfony y por la parte de Joan con htaccess.

¿Para que sirven estas soluciones?
Pues bien en Symfony por defecto las URI no terminan en slash (por temas SEO), es decir si terminan en algo así: www.site.com/moudulo/, esto te retornará un 404. Para evitar este problema y hacer una redirección 301 de www.site.com/moudulo/ a www.site.com/moudulo aquí las soluciones:

Con un filtro en symfony:
Solo colócalo en la carpeta lib de tu aplicación

<?php
class redirect301Filter extends sfFilter
{
  public function execute($filterChain)
  {
    if ($this->isFirstCall())
    {
      $uri = $this->getContext()->getRequest()->getUri();

      if (preg_match('#/$#', $uri))
      {
        $uri = preg_replace('#/$#', '', $uri);
        $this->getContext()->getController()->redirect($uri, 301);
      }
    }

    // Ejecutar el proximo filtro
    $filterChain->execute();
  }
}

Y activas el filtro así:

sshot-2008-01-27-02-11-27.png

Ahora la versión de Joan con htaccess:

Options +FollowSymLinks +ExecCGI

<IfModule mod_rewrite.c>
  RewriteEngine On

  # uncomment the following line, if you are having trouble
  # getting no_script_name to work
  RewriteBase /

  # we skip all files with .something
  RewriteCond %{REQUEST_URI} \..+$
  RewriteCond %{REQUEST_URI} !\.html$
  RewriteRule .* - [L]

  # remove trailing slash
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_URI} ^(.*)/$
  RewriteRule ^(.*)/$ $1 [R=302,L]

  # we check if the .html version is here (caching)
  RewriteRule ^$ index.html [QSA]
  RewriteRule ^([^.]+)$ $1.html [QSA]
  RewriteCond %{REQUEST_FILENAME} !-f

  # no, so we redirect to our front web controller
  RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>

# big crash from our front web controller
ErrorDocument 500 "<h2>Application error</h2>symfony application failed to start properly"

Para este caso (y como lo comenta Joan) el RewriteBase / es obligatorio si te quieres evitar problemas.

En las pruebas de rendimiento obviamente htaccess sale ganando, pero queda de tu parte elegir cual usar :) .

Si no es del todo legible el código colocado mas arriba (comienzo a odiar al iG:Syntax Hiliter) puedes descargarlo de aquí filtro_vs_htaccess.zip.