Я использую 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 и посмотрите, помогут ли они вам: