Заглавные символы в URL. Как исправить?
Столкнулся с задачей: "пофиксить заглавные символы в URL". Сейчас на сайте вполне возможно указать URL в котором будут присутствовать заглавные буквы:
site.com/blog-ARTICLE-1
Из-за этого могут получиться дубли страниц, поэтому нужно исправить проблему. Посмотрел, что поэтому поводу говорит гугл - все сводиться корректировки .htaccess (или настройки виртуального хоста + .htaccess).
Сводиться к тому, что если указана(-ы) заглавные буквы - происходит редирект на главную. Но у меня стойкое чувство - что это не то, что надо :)
Покопавшись заметил, что указать произвольный регистр можно только у slug. Он находиться в БД и у данного поля выставлен collation: "utf8mb4_ci", т.е. регистро-независимый и именно поэтому, можно спокойно обратиться по двум урл:
- site.com/blog-ARTICLE-1
- site.com/blog-article-1
Работаю с Symfony(версия 4.3.11) не так давно, поэтому сходу не могу нагуглить. Есть ли возможность в Doctrine указать collate регистро-зависимый? Что бы по первому адресу появлялась 404? Через аннотацию или любым другим способом.
Ответы (1 шт):
Можно пойти несколькими путями:
- смена collate в файле
config/packages/doctrine.yaml - установка
beberlei/doctrineextensionsи последующее использование функции в самих запросах репозитория - можно пойти другим путём, создать листенер, который будет приводить url в нижний регистр и делать 301й редирект, таким образом, поисковики больше не будут индексировать страницы с урлом верхнего регистра
ну и примерный код листенера
<?php
declare(strict_types = 1);
namespace App\Listener;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use function preg_match;
use function strtolower;
class JsonHttpListener implements EventSubscriberInterface
{
public static function getSubscribedEvents(): array
{
return [
KernelEvents::REQUEST => ['onKernelRequest'],
];
}
public function onKernelRequest(RequestEvent $event): void
{
$pathInfo = $event->getRequest()->getPathInfo();
if (empty($pathInfo)) {
return;
}
if (0 < preg_match('/[A-Z]+/', $pathInfo)) {
$event->setResponse(new RedirectResponse(strtolower($pathInfo), Response::HTTP_MOVED_PERMANENTLY));
}
}
}