Назад | Перейти на главную страницу

Как запретить lighttpd кэшировать статические файлы, даже если они были изменены на диске?

Я использую lighttpd для обслуживания статических файлов. У меня есть куча изображений в каталоге, которые я регулярно обновляю. Это изменит содержимое файла (и размер файла), а также дату модификации, но не имя файла.

Когда я получаю доступ к файлам через http, обновления не принимаются во внимание, и lighty обслуживает старый файл. Я могу вручную переименовать файл во что-то другое, тогда lighttpd вернет ошибку 404, и если я переименую свой файл обратно, я получу правильную обновленную версию. Похоже, что lightty использует какой-то собственный механизм кеширования (что нормально) для возврата статических файлов. К сожалению, похоже, что этот механизм не обновляется при изменении файлов.

Я проверил через Wireshark, и мой браузер действительно делает запрос к файлу, это не проблема кеширования браузера. Он возвращает 200 OK при запросе его из пустого кеша и 304 Not Modified в противном случае, как и ожидалось. Но файл возвращается с неправильным заголовком Last-Modified, который не отражает действительную дату последнего изменения.

Может быть, есть какая-то конфигурационная директива, о которой я не знаю?

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

Обновление для всех, кто следит за этим вопросом: я нашел виновника. Если я обновляю статический файл, Lighty не возвращает новый контент, но возвращает новую Content-Length в своих заголовках, что приводит к отображению мусора. Если я сжимаю файл с помощью mod_compress, проблема исчезает, поскольку mod_compress использует свою собственную систему кеширования. К сожалению, я не могу сжать все файлы (например, файлы изображений). Так что это только частичное исправление, но я вернусь к нему позже и, надеюсь, найду решение.

Я наконец нашел проблему. И это происходит от VirtualBox.

При редактировании файла на хосте (Win) lighttpd в гостевой системе (Linux) некорректно обновляет содержимое файла (но правильно обновляет размер файла), возвращая обрезанное или искаженное содержимое.

Размонтирование общих дисков и их повторное подключение или редактирование файлов непосредственно в гостевой системе устранило проблему.

Мне потребовалось 6 месяцев, чтобы наконец понять это.

Вы не упоминаете, установлен ли у вас mod_cache или нет? При установке этот модуль по умолчанию включен.

Не хочу предлагать это, но помогает ли включение Etags?

Попробуйте отключить кеширование статистического механизма:

server.stat-cache-engine = "disable'

Эта опция lighttpd сработала для меня

server.network-backend = "writev" 

Попробуйте эти записи etag и посмотрите, помогут ли они вам:

Правила управления кешем для lighthttpd