我让Nginx提供我在Gunicorn上运行的静态Django文件。我正在尝试提供MP3文件并让他们拥有头部206,以便他们将被Apple接受播客。目前,音频文件位于我的静态目录中,并直接通过Nginx提供。这是我得到的回应:
HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Wed, 30 Jan 2013 07:12:36 GMT
Content-Type: audio/mpeg
Content-Length: 22094968
Connection: keep-alive
Last-Modified: Wed, 30 Jan 2013 05:43:57 GMT
有人可以帮助提供正确的方式来提供mp3文件,以便接受字节范围。
更新:这是我视图中通过Django
提供文件的代码 response = HttpResponse(file.read(), mimetype=mimetype)
response["Content-Disposition"]= "filename=%s" % os.path.split(s)[1]
response["Accept-Ranges"]="bytes"
response.status_code = 206
return response
答案 0 :(得分:2)
如果你只想在nginx
中执行此操作,那么在负责提供静态.mp3文件的location
指令中添加以下指令:
# here you add response header "Content-Disposition"
# with value of "filename=" + name of file (in variable $request_uri),
# so for url example.com/static/audio/blahblah.mp3
# it will be /static/audio/blahblah.mp3
# ----
set $sent_http_content_disposition filename=$request_uri;
# or
add_header content_disposition filename=$request_uri;
# here you add header "Accept-Ranges"
set $sent_http_accept_ranges bytes;
# or
add_header accept_ranges bytes;
# tell nginx that final HTTP Status Code should be 206 not 200
return 206;
我希望它会给你一些帮助。
答案 1 :(得分:1)
配置中有一些内容阻止nginx支持对这些静态文件的范围请求。使用标准nginx模块时,这可能是以下过滤器之一(这些过滤器修改响应,如果在请求主体处理期间可能发生修改,则禁用字节范围处理):
所有这些模块都有指令来控制它们使用的MIME类型(gzip_types
,gunzip_types
,addition_types
,ssi_types
)。默认情况下,它们设置为限制性的MIME类型集,并且范围请求适用于大多数静态文件,即使启用了这些模块也是如此。但是放置像
ssi on;
ssi_types *;
进入配置将禁用所有受影响的静态文件的字节范围支持。
检查您的nginx配置并删除有问题的行,和/或确保关闭您提供mp3文件的位置的相关模块。
答案 2 :(得分:0)
您可以定义自己的状态代码:
response = HttpResponse('this is my response data')
response.status_code = 206
return response
如果您使用的是Django 1.5,您可能需要查看新的StreamingHttpResponse:
https://docs.djangoproject.com/en/dev/ref/request-response/#streaminghttpresponse-objects
这对大文件非常有帮助。