我在nginx网络服务器上有一个rails web app。我的服务器上有一些音频文件,我希望人们能够听到它们,并且能够从那一点寻找音频文件的任何部分来收听。
简单吧?
我在html5音频元素的src中使用了直接链接。它运作得很好。该文件可以播放并寻求工作。
输入安全性和可审计性。
我的音频文件很敏感。我只希望某些人能够听取他们的意见。我每次听他们都需要知道。突然,公共目录无法运行。
输入rails的send_file。
Send_file最初似乎正是我所需要的。它允许rails提供我的音频文件,我可以将我的文件保存在受保护的目录中,我可以检查当前用户的权限,我可以创建适当的审计跟踪。除了...
使用send_file我无法寻找。这是一个交易破坏者。
一些stackoverflow问题解决了让send_file处理http范围/字节范围请求的问题。我评论过的是:
what is the proper way to serve mp4 files through rails...
rails media file stream accept byte range request through send file ...
经过更多的研究,我发现了以下博文: https://blog.echoplex.us/2014/08/19/so-you-want-to-stream-videoaudio-with-rails/
TL;博士 不要使用rails send_file来提供媒体服务。不要试图让它像堆栈溢出问题说的那样。相反,使用nginx和X-Accel-Redirect,最后得到一个看起来像你的请求管道 - > nginx-> rails-> nginx->你
我正在考虑采取他的方法,但不知道是否有更好的方法来做到这一点。
我有什么选择?
(另外,你可以假设我使用当前版本的rails和nginx)
答案 0 :(得分:2)
请不要使用sendfile。使用X-Accel-Redirect或以下建议。
Nginx secure_link模块可帮助您直接从具有私有链接的磁盘提供文件。不需要后端。完整的示例是here。