Я видел довольно много подобных вопросов и проблем по этому поводу, и я пришел к выводу, что это проблема с Safari, требующая ответа 206, а не 200.
В настоящее время Cloudflare возвращает 200, а не 206, но я не совсем уверен, что где-то еще все правильно настроено.
Это мой метод контроллера Rails, который обслуживает видео:
def videos
file_name = params.fetch(:filename, '')
file_path = "#{Rails.root}/app/assets/videos/#{file_name}.#{params.fetch(:extension, '')}"
raise ActionController::RoutingError, 'Not Found' unless file_name.index('/').nil? && File.exist?(file_path)
send_file(file_path, type: 'video/mp4', disposition: 'inline', status: (request.headers['Range'].present? ? 206 : 200))
end
По сути, он проверяет, есть ли / в имени файла (чтобы избежать каких-либо проблем с безопасностью... все видео, обслуживаемые таким образом, находятся в одной папке на сервере), и гарантирует, что файл существует, а затем использует send_file для его доставки, и если присутствует заголовок Range, возвращает статус 206, иначе 200.
Я думаю, что это правильно ... и конфигурация nginx очень проста, в основном просто проходит через puma, но мне совсем не ясно, имеет ли это значение, поскольку заголовок «Range», похоже, не проходит Cloudflare на мой сервер, несмотря ни на что (я сбросил заголовки и ничего не увидел о «Диапазоне»).
Кодировка правильная, тип содержимого/MIME правильный, он отлично работает в Chrome и Firefox, все кажется отличным, за исключением того, что он просто не воспроизводится в Safari.
Я потратил большую часть сегодняшнего дня, пытаясь понять это, и я пробовал массу разных вещей, но у меня просто нет других идей.
Как заставить эту дурацкую штуку работать в Safari?