Перенаправлення URL із замикаючим слешем

Дата оновлення перекладу 2023-05-30

Перенаправлення URL із замикаючим слешем

Метою цієї статті є демонстрація того, як перенаправити URL із замикаючим слешем на той самий URL але без замикаючого слеша (наприклад, /en/blog/ на /en/blog).

Створіть контролер, який відповідатиме будь-якому URL із замикаючим слешем, видаліть замикаючий слеш (зберігаючи параметри запиту, якщо вони є) і перенаправте на новий URL із відповіддю статус-коду 308 (Постійне перенаправлення HTTP):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// src/Controller/RedirectingController.php
namespace App\Controller;

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

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

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

        // 308 (Постійне перенаправлення) схоже на 301 (Перманентно переміщено), тільки
        // воно не дозволяє зміни методу запиту (наприклад, з POST на GET)
        return $this->redirect($url, 308);
    }
}

Після цього створіть маршрут до цього контролера, який співпадає щоразу, коли запитується URL із замикаючим слешем. Переконайтеся, що цей маршрут буде визначено у вашій системі останнім, як пояснюється нижче:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// src/Controller/RedirectingController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;

class RedirectingController extends Controller
{
    /**
     * @Route("/{url}", name="remove_trailing_slash",
     *     requirements={"url" = ".*\/$"})
     */
    public function removeTrailingSlash(Request $request)
    {
        // ...
    }
}

Caution

Переконайтеся в тому, що ви додасте цей маршрут у вашу конфігурацію маршрутизації у самому кінці вашого списку маршрутів. Інакше ви ризикуєте перенаправити справжні маршрути (включно з базовими маршрутами Symfony), які дійсно мають замикаючий слеш у своєму шляху.