Я видел довольно много похожих вопросов и проблем, связанных с этим, и я пришел к выводу, что это проблема с 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 к моей подачеr, независимо (я сбросил заголовки и ничего не увидел в 'Range').
Кодировка правильная, тип content / mime верный, он отлично работает в Chrome и Firefox, все выглядит великолепно, кромеон просто не играет в Safari.
Я потратил большую часть сегодняшнего дня, пытаясь выяснить это, и я пробовал кучу разных вещей, но у меня просто нет дальнейших идей.
Как мне заставить эту глупость работать в Safari?