在我的 nginx 0.8.34 设置中,我使用 X-Accel-Redirect 功能来控制应用程序代码中的文件下载,而不是让应用程序本身处理下载。
经过许多痛苦之后,现在它基本上可以工作了,除了 nginx 总是返回具有内容类型的文件text/html
。
默认内容类型是 application/octet-stream,在http
块中指定。
除其他内容外,服务器块还包含存储文件的目录的定义:
location /files {
default_type application/octet-stream;
alias /srv/www/uploads;
internal;
}
所以我在这里指定了内容类型,但什么都没有改变。
我不想通过应用程序设置 Content-Type,因为这样会减慢我的速度(我必须先确定它)。因此,理想情况下,nginx 会根据文件扩展名返回正确的 mimetype(我确实在块中包含了 mime.types http
)。
答案1
如果您想让 nginx 猜测正确的 mime 类型,您只需确保后端服务器没有返回任何内容类型。
With django:
response = HttpResponse()
response['Content-Type'] = ''
response['X-Accel-Redirect'] ='/my/file.jpg'
return response
答案2
我个人只是在应用程序中设置了 application/octet-stream,但你可能能够使用fastcgi_ignore_headers以防止 Nginx 使用后端提供的标头。
fastcgi_ignore_headers Content-Type;
答案3
使用 php-fpm:
<?php
header("Content-Type: ");
header("X-accel-redirect: (...)");
告诉 php 根本不要发送 Content-Type 标头(甚至不要发送空的标头),然后 nginx 会为您猜测类型并添加标头:)