Как создать блок location в nginx, который использует шаблон для обработки возвратов?

Вопрос или проблема

Как создать блок location в nginx, который использует шаблон для обработки возвратов?

У меня есть следующий блок nginx:

location /fonts/ {
    alias /data/fonts/ofm/;
    try_files $uri =404;
}

Я хотел бы изменить его так, чтобы все отсутствующие шрифты обслуживались соответствующими диапазонами символов из Noto Sans.

Например, запрос к

/fonts/MissingFont/256-511.pbf 

должен обслуживать следующий файл:

/fonts/Noto%20Sans%20Regular/256-511.pbf

Сопоставление по той же части /256-511.pbf важно, это указывает диапазоны символов.

Как я могу это сделать? (Я предполагаю, что нужно использовать регулярные выражения и root вместо alias, но пока не вижу деталей. Нужен ли мне один или два блока location? Использую ли я try_files?)

Ответ или решение

Чтобы настроить блок location в Nginx, который будет обрабатывать запросы к шрифтам, и если файл не найден, будет возвращать соответствующий файл шрифта из Noto Sans, можно использовать директиву try_files вместе с регулярными выражениями. В вашем случае, необходимо использовать два блока location: один для обработки запросов к вашим шрифтам, а другой для возврата запасных шрифтов.

Вот пример, который иллюстрирует данное решение:

server {
    listen 80;
    server_name yourdomain.com;

    location /fonts/ {
        alias /data/fonts/ofm/;
        try_files $uri @missing_fonts;
    }

    location @missing_fonts {
        # Извлекаем имя файла, запрашиваемого клиентом
        set $requested_file $uri;

        # Удаляем префикс /fonts/ для получения нужной части
        rewrite ^/fonts/(.*)$ /fonts/Noto%20Sans%20Regular/$1 break;

        # Попробуем найти файл Noto Sans
        try_files $uri =404;
    }
}

Объяснение конфигурации:

  1. Первый блок location /fonts/:

    • Указывает корневую папку для шрифтов через директиву alias.
    • Использует try_files для проверки существования запрашиваемого файла $uri.
    • Если файл не найден, управление передается в блок @missing_fonts.
  2. Второй блок location @missing_fonts:
    • Здесь мы используем переменную $requested_file для хранения запрашиваемого URI.
    • Директива rewrite используется для создания нового пути к шрифту Noto Sans. Она удаляет префикс /fonts/ и добавляет /fonts/Noto%20Sans%20Regular/, что позволяет использовать паттерн из запрашиваемого файла для формирования нового пути.
    • Второй вызов try_files проверяет наличие нового файла. Если он не существует, возвращается ошибка 404.

Эта конфигурация позволяет вашему серверу Nginx автоматически выдавать шрифты из Noto Sans, если оригинальный запрашиваемый файл не был найден. Убедитесь, что пути и имена шрифтов соответствуют вашему фактическому хранилищу шрифтов на сервере.

Оцените материал
Добавить комментарий

Капча загружается...