How to Configure a Redirect without a custom Controller

Edit this page

Warning: You are browsing the documentation for Symfony 4.1, which is no longer maintained.

Read the updated version of this page for Symfony 6.1 (the current stable version).

How to Configure a Redirect without a custom Controller

Sometimes, a URL needs to redirect to another URL. You can do that by creating a new controller action whose only task is to redirect, but using the RedirectController of the FrameworkBundle is even easier.

You can redirect to a specific path (e.g. /about) or to a specific route using its name (e.g. homepage).

Redirecting Using a Path

Assume there is no default controller for the / path of your application and you want to redirect these requests to /app. You will need to use the urlRedirectAction() action to redirect to this new url:

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# config/routes.yaml

# load some routes - one should ultimately have the path "/app"
controllers:
    resource: ../src/Controller/
    type:     annotation
    prefix:   /app

# redirecting the homepage
homepage:
    path: /
    controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::urlRedirectAction
    defaults:
        path: /app
        permanent: true

In this example, you configured a route for the / path and let the RedirectController redirect it to /app. The permanent switch tells the action to issue a 301 HTTP status code instead of the default 302 HTTP status code.

Redirecting Using a Route

Assume you are migrating your website from WordPress to Symfony, you want to redirect /wp-admin to the route sonata_admin_dashboard. You don't know the path, only the route name. This can be achieved using the redirectAction() action:

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
# config/routes.yaml

# ...

admin:
    path: /wp-admin
    controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::redirectAction
    defaults:
        route: sonata_admin_dashboard
        # make a permanent redirection...
        permanent: true
        # ...and keep the original query string parameters
        keepQueryParams: true

4.1

The keepQueryParams option was introduced in Symfony 4.1.

Caution

Because you are redirecting to a route instead of a path, the required option is called route in the redirect() action, instead of path in the urlRedirect() action.

Keeping the Request Method when Redirecting

4.1

The feature to keep the request method when redirecting was introduced in Symfony 4.1.

The redirections performed in the previous examples use the 301 and 302 HTTP status codes. For legacy reasons, these HTTP redirections change the method of POST requests to GET (because redirecting a POST request didn't work well in old browsers).

However, in some scenarios it's either expected or required that the redirection request uses the same HTTP method. That's why the HTTP standard defines two additional status codes (307 and 308) to perform temporary/permanent redirects that maintain the original request method.

The urlRedirectAction() and redirectAction() methods accept an additional argument called keepRequestMethod. When it's set to true, temporary redirects use 307 code instead of 302 and permanent redirects use 308 code instead of 301:

  • YAML
  • XML
  • PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# config/routes.yaml

# redirects with the 308 status code
route_foo:
    # ...
    controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::redirectAction
    defaults:
        # ...
        permanent: true
        keepRequestMethod: true

# redirects with the 307 status code
route_bar:
    # ...
    controller: Symfony\Bundle\FrameworkBundle\Controller\RedirectController::redirectAction
    defaults:
        # ...
        permanent: false
        keepRequestMethod: true
This work, including the code samples, is licensed under a Creative Commons BY-SA 3.0 license.