Как правильно настроить сложные перенаправления в NGINX?

Условия: 

Необходимо настроить редиректы для всех файлов в каталоге <code>/var/www/html/domain.com/file/f/</code> и для всех изображений с каталогов <code>/var/www/html/domain.com/img/i/</code> и <code>/var/www/html/domain.com/img/i/fd/</code>, чтобы они перенаправлялись в корень домена. В указанных каталогах содержатся только изображения, которые также должны быть доступны по прямым ссылкам от корня домена. Например, изображение по адресу <code>https://domain.com/Diya.png</code>, которое расположено в <code>/var/www/html/domain.com/img/i/fd/</code>.

Дополнительно, в каталоге <code>/var/www/html/domain.com/img/i/</code> находятся файлы миниатюр, имена которых всегда начинаются с "thumb_" и состоят из 16 случайных символов, за которыми следует расширение файла. На эти миниатюры настроены редиректы для заглушек в случае, если файлы отсутствуют.

В настоящее время правильных редиректов требуют файлы из <code>/var/www/html/domain.com/file/f/</code> и миниатюры из <code>/var/www/html/domain.com/img/i/</code>, но при обращении к изображениям из каталога <code>/var/www/html/domain.com/img/i/fd/</code>, например, по адресу <code>https://domain.com/img/i/fd/Gemini.png</code>, возникает ошибка 404. А при запросе <code>https://domain.com/Gemini.png</code> отображается заглушка 404 (404_fallback.png).
  • 25 февраля 2025 г. 16:14
Ответы на вопрос 2
Для настройки редиректов в NGINX, чтобы удовлетворять вашим требованиям, вам нужно прописать несколько правил в конфигурационном файле вашего сайта (например, в файле `default.conf` или аналогичном в директории `/etc/nginx/sites-available/`). 

Ниже приведен пример конфигурации, который реализует описанные вами условия:

```nginx
server {
    listen 80;
    server_name domain.com;

    root /var/www/html/domain.com;

    location /file/f/ {
        # Перенаправляем все запросы к этому каталогу в корень
        return 301 /;
    }

    location /img/i/ {
        # Проверка на наличие миниатюр и перенаправление на заглушку, если файла нет
        try_files $uri $uri/ /404_fallback.png;

        # Перенаправление миниатюр (начинающихся с 'thumb_') на заглушку
        if ($request_uri ~* ^/img/i/thumb_[a-zA-Z0-9]{16}\.(jpg|jpeg|png|gif)$) {
            return 404 /404_fallback.png;
        }
    }

    location /img/i/fd/ {
        # Перенаправляем все запросы к этому каталогу в корень
        return 301 /;
    }

    # Эта директива поможет обработать остальные запросы к корню для изображений
    location / {
        try_files $uri $uri/ =404; # если путь пустого или неправильный, то статус 404
    }

    # Дополнительно, не забудьте определить логи для отладки
    error_log  /var/log/nginx/domain.com.error.log;
    access_log /var/log/nginx/domain.com.access.log;
}
```

### Объяснение конфигурации:
1. **Перенаправление всех запросов к `/file/f/` в корень**: используем `return 301 /;`, чтобы отправить все запросы из этого каталога на корень сайта.

2. **Обработка изображений в `/img/i/`**:
   - Мы используем `try_files` для поиска необходимого файла. Если файл не найден, сервер вернет заглушку 404.
   - Мы добавляем условие для миниатюр (файлы, имена которых начинаются с `thumb_`). Если файл с таким именем не существует, он перенаправляется на заглушку.

3. **Перенаправление всех запросов к `/img/i/fd/` в корень**: так же, как и в первом пункте, используется `return 301 /;`.

4. **Обработка остальных запросов**: используется `try_files`, чтобы корректно обрабатывать запросы к файлам и директориям на корне сайта.

### Запуск NGINX
После внесения изменений в конфигурацию, не забудьте проверить конфигурацию NGINX на наличие ошибок и перезапустить сервер:

```bash
sudo nginx -t  # Проверить конфигурацию на ошибки
sudo systemctl restart nginx  # Перезапустить NGINX
```

Эта настройка должна соответствовать описанным вами требованиям. Не забудьте адаптировать пути и имена файлов под свои нужды.
Тот факт, что Фриланс закрыли - не повод вываливать задания сюда. Курим документацию, методом тыка постепенно осваиваем.
Похожие вопросы