Как правильно сделать подмену урлов для отображения картинок?

Для выполнения подмены URL-адресов для отображения изображений в Yii можно использовать возможности маршрутизации фреймворка. Yii имеет встроенный компонент для обработки URL-адресов под названием UrlManager.

Для начала необходимо настроить UrlManager в файле конфигурации приложения (обычно это файл config/web.php). Добавьте компонент UrlManager в секцию компонентов и определите правила маршрутизации.

Приведу пример конфигурации UrlManager, который позволит вам подменять URL-адреса для отображения изображений:

'components' => [
    'urlManager' => [
        'enablePrettyUrl' => true,
        'showScriptName' => false,
        'rules' => [
            'images/<id:d+>/<filename:[w-]+>' => 'image/display',
            // другие правила маршрутизации
        ],
    ],
    // другие компоненты приложения
]

В этом примере мы создаем правило маршрутизации для отображения изображений. Шаблон URL-адреса 'images/<id:d+>/<filename:[w-]+>' определяет формат URL-адреса для изображения. Он содержит два параметра <id> и <filename>, которые должны быть числовыми и состоять только из букв, цифр, символов дефиса и подчеркивания.

'image/display' указывает на контроллер и действие, которые будут обрабатывать запросы в соответствии с этим правилом. Обычно контроллер ImageController содержит метод actionDisplay(), который будет вызываться при обработке запросов к URL-адресу изображения.

Затем в контроллере ImageController вы можете определить метод actionDisplay(), который будет отображать изображение с использованием подмененного URL-адреса:

public function actionDisplay($id, $filename)
{
    $path = Yii::getAlias("@webroot/images/$id/$filename");
    if (file_exists($path)) {
        Yii::$app->response->sendFile($path);
        return;
    }
    
    throw new NotFoundHttpException('The requested image does not exist.');
}

В этом методе мы проверяем, существует ли файл изображения по указанному пути $path. Если он существует, мы используем Yii::$app->response->sendFile() для отправки файла клиенту. В противном случае мы генерируем исключение NotFoundHttpException, чтобы сообщить, что запрошенное изображение не существует.

Не забудьте создать соответствующую директорию images, в которой будут храниться ваши изображения, и развернуть правильные разрешения доступа к ней.

Теперь, если у вас есть изображение, например, с id = 123 и filename = my_image.jpg, вы можете получить доступ к нему через URL-адрес http://ваш_сайт/images/123/my_image.jpg, который будет маршрутизирован на действие actionDisplay() контроллера ImageController.