Redirecciones desde el routing de Symfony

Desde la configuración del routing en formatos YAML, XML o PHP podemos redireccionar a una dirección URL o route específicos

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

Redireccionar a otra URL se puede hacer de diferentes maneras. Desde el routing podemos emplear el RedirectController del FrameworkBundle, utilizando una configuración en formato YAML, XML o PHP.

Podemos redireccionar a una dirección específica (/about) o a una route específica (homepage).

Redireccionar usando una dirección URL

Suponemos que no hay un controller por defecto para el directorio / de la aplicación y queremos redireccionar esos requests a /app. Necesitaremos utilizar la action urlRedirectAction() para redireccionar a esta nueva URL:

# app/config/routing.yml

# Cargamos algunas routes
AppBundle:
    resource: '@AppBundle/Controller/'
    type:     annotation
    prefix:   /app

# Redireccionar el root
root:
    path: /
    defaults:
        _controller: FrameworkBundle:Redirect:urlRedirect
        path: /app
        permanent: true

En este ejemplo se configura la route para la dirección / y dejamos al RedirectController que redireccione a /app. El parámetro permanent le dice a la action que emplee un código de estado HTTP 301 en lugar del código de estado por defecto 302.

Redireccionar usando una Route

Si por ejemplo estamos migrando un sitio web de Wordpress a Symfony, queremos redireccionar la dirección /wp-admin a la route sonata_admin_dashboard. No conocemos la dirección, sólo el nombre de route. Esto se puede hacer con la action redirectAction():

# app/config/routing.yml

# ...

# redirecting the admin home
root:
    path: /wp-admin
    defaults:
        _controller: FrameworkBundle:Redirect:redirect
        route: sonata_admin_dashboard
        permanent: true

Redireccionar una URL con Trailing Slash

Ahora queremos redireccionar una URL con trailing slash (/) a una sin ella, por ejemplo de /en/blog/ a /en/blog.

Podemos hacerlo creando un controller que coincida con cualquier URL que tenga la trailing slash, removerla (manteniendo los parámetros query si hay) y redireccionar a la nueva URL con un código de estado 301:

// src/AppBundle/Controller/RedirectingController.php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class RedirectingController extends Controller
{
    public function removeTrailingSlashAction(Request $request)
    {
        $pathInfo = $request->getPathInfo();
        $requestUri = $request->getRequestUri();

        $url = str_replace($pathInfo, rtrim($pathInfo, ' /'), $requestUri);

        return $this->redirect($url, 301);
    }
}

Después, creamos una route en este controller que coincidirá cuando una URL con una trailing slash sea solicitada. Asegúrate de poner esta route la última en el sistema.

remove_trailing_slash:
    path: /{url}
    defaults: { _controller: AppBundle:Redirecting:removeTrailingSlash }
    requirements:
        url: .*/$
    methods: [GET]

Redireccionar un POST request no funciona bien en navegadores antiguos. Un 302 en un POST request enviaría un GET request después de la redirección. Por esta razón, la route sólo está configurada para GET requests.