Yii2: как сделать 301 редирект на сайте, без .htaccess?

Для того чтобы реализовать 301 редирект на сайте, используя Yii2, без использования файла .htaccess, вам необходимо создать специальный контроллер, который будет обрабатывать запросы и выполнять перенаправление.

1. Создайте новый контроллер, например, RedirectController, в директории controllers вашего приложения:

<?php

namespace appcontrollers;

use Yii;
use yiiwebController;

class RedirectController extends Controller
{
    public function actionRedirect($url)
    {
        // Определяем целевой URL для редиректа
        $targetUrl = $this->resolveTargetUrl($url);

        // Выполняем 301 редирект
        return $this->redirect($targetUrl, 301);
    }

    protected function resolveTargetUrl($url)
    {
        // Здесь вы должны реализовать логику для определения целевого URL на основе исходного URL.
        // Например, можно использовать базу данных или файл конфигурации для хранения соответствий URL.
        // В данном примере будет применено простое соответствие url->target_url.

        $redirectMap = [
            'old-url1' => 'new-url1',
            'old-url2' => 'new-url2',
            // ...
        ];

        return $redirectMap[$url] ?? null;
    }
}

2. Затем выполните настройку маршрутизации в конфигурации приложения (файл config/web.php):

return [
    // ...
    'components' => [
        // ...
    ],
    'controllerMap' => [
        'redirect' => 'appcontrollersRedirectController',
    ],
    'as beforeRequest' => [
        'class' => 'yiifiltersVerbFilter',
        'actions' => [
            'redirect/*' => ['get'],
        ],
    ],
    // ...
];

3. Теперь вы можете выполнить 301 редирект, обратившись к URL "/redirect/old-url1" (где old-url1 - исходный URL, который нужно перенаправить). Например, вместо .htaccess правила:

Redirect 301 /old-url1 /new-url1

вы можете просто использовать URL:

/redirect/old-url1

В результате будет выполнен 301 редирект на URL "/new-url1".

Обратите внимание, что в данном примере используется простое соответствие URL, заданное в коде контроллера. Вы можете адаптировать этот пример для своих нужд, например, используя базу данных или файл конфигурации для хранения соответствий URL.