Коллеги, здравствуйте.
Использую nginx для проксирования и кэширования на диск видео-файлов (mp4) из социальной сети ВКонтакте.
Приложение на php узнаёт ссылку на файл на удалённом сервере, определяет где будет хранится файл на диске и отдаёт эту информацию в заголовком
Для воспроизведения видео на сайте используется html5-плеер, который, для определения возможности перемотки на ещё не загрузившийся момент, к заголовку запроса добавляет "Range: bytes=0-" и если сервер ответил кодом 206, то даёт возможность делать такую перемотку, если код 200, то такой возможности не предоставляется.
Но nginx кэширует ответы только с кодом 200, а 206 с "Range: bytes=0-" нет. В принципе, это хорошо, т.к. неполные файлы в кэше не нужны, но в данном ситуации кэшировать файлы с помощью nginx не представляется возможным (т.к. плеер всегда делает запрос с заголовком Range).
Демонстрационный-код + конфиг: https://gist.github.com/anonymous/07a89471f2d2c7a18bda8f0464c3091e
Подскажите, пожалуйста, как можно сделать, чтобы nginx таки кэшировал файлы?
Мне видятся 2 варианта решения данного вопроса:
- из php возвращать код 206 и сделать 2 location, один из которых будет поддерживать заголовок Range, но не будет сохранять файл на диск, а второй будет слать запрос к удалённому серверу без Range и nginx будет сохранять на диск файл;
- написать что-то в конфиге nginx, чтобы он заменял код 200 на 206, при наличии заголовка "Range: bytes=0-";
Но как реализовать любой из них - не представляю.
P.S. Flash-плеер, который не умеет слать заголовок Range, использовать нет возможности.
Благодарю.
С уважением.