Как обрабатываются запросы к статическим ресурсам и требуется ли для этого обращение к базе данных?

Ответ

Как правило, для обработки запросов к статическим ресурсам (файлам) обращение к базе данных не требуется.

Статические ресурсы — это файлы, содержимое которых не меняется от запроса к запросу. Примеры: style.css, logo.png, bundle.js, about.html.

Процесс их обработки выглядит так:

  1. Веб-сервер (например, Nginx или встроенный в Go) получает запрос на URL, сопоставленный со статическим файлом.
  2. Сервер находит этот файл в файловой системе.
  3. Содержимое файла с соответствующими HTTP-заголовками (например, Content-Type) отправляется клиенту.

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

Примеры реализации в Go:

  1. Отдача одного файла с помощью http.ServeFile:

    http.HandleFunc("/robots.txt", func(w http.ResponseWriter, r *http.Request) {
        // Напрямую отдаём файл из файловой системы
        http.ServeFile(w, r, "./static/robots.txt")
    })
  2. Отдача целой директории с помощью http.FileServer:

    // Создаём обработчик для всех файлов в директории "assets"
    fs := http.FileServer(http.Dir("./assets"))
    
    // Привязываем его к URL-пути /static/
    // http.StripPrefix убирает "/static/" из пути, чтобы FileServer искал файлы в корне ./assets
    http.Handle("/static/", http.StripPrefix("/static/", fs))

Исключения (гибридные случаи):

Иногда обращение к БД всё же может потребоваться, даже если URL выглядит как статический. Например:

  • Проверка прав доступа: Перед отдачей файла (например, GET /downloads/private-report.pdf) приложение должно проверить в базе данных, имеет ли текущий пользователь право на его скачивание.
  • Подсчёт скачиваний: Приложение может логировать каждое скачивание файла в базу данных.

В таких случаях запрос сначала обрабатывается логикой приложения, которая обращается к БД, и только после этого файл отдаётся клиенту.