Задача: обрезать/добавить обратный слэш в конце адресной строки. Например, при запросе в адресной строке мы получаем:
/controller (работает, действие по-умолчанию) /controller/index (работает) /controller/index/ (ошибка 404) /controller/ (ошибка 404)
Нам необходимо избавиться от слэша в конце и склеить страницы с помощью 301 редиректа, что бы избавить от 404 ошибки.
Решение:
Для обрезания обратного слэша добавьте в файл конфигурации следующий обработчик события beforeRequest
:
// обрезание обратного слэша в конце адресной строки 'on beforeRequest' => function () { $pathInfo = Yii::$app->request->pathInfo; if (!empty($pathInfo) && substr($pathInfo, -1) === '/') { Yii::$app->response->redirect('/' . substr(rtrim($pathInfo), 0, -1), 301)->send(); } },
Для обратной задачи — добавления обратного слэша в конец, добавьте следующий код:
// добавление обратного слэша в конце адресной строки 'on beforeRequest' => function () { $pathInfo = Yii::$app->request->pathInfo; if (!empty($pathInfo) && substr($pathInfo, -1) !== '/') { Yii::$app->response->redirect('/' . rtrim($pathInfo) . '/', 301)->send(); } },
Способ №2
Добавить в конец rules
компонента urlManager
строку
'<url:.+>/' => 'site/redirect',
и реализовать действие
public function actionRedirect($url = '') { if (substr($url, -1) === '/') { return $this->redirect('/' . substr($url, 0, -1), 301); } else { throw new NotFoundHttpException; } }
Данный способ будет плохо работать если на сайте есть ссылки вида http://domain.com/shop/order?id=6, вызывая ошибку 404
Способ №3
Альтернатива: использовать правила переадресации .htaccess
или nginx
.
Пример правил для .htaccess
RewriteCond %{THE_REQUEST} \s/+(.+?)/+[?\s] RewriteRule /$ /%1 [R,L]