Перенаправлення 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), які дійсно мають замикаючий слеш у своєму шляху.