nginx、x-accel-redirect 和 mime 类型

nginx、x-accel-redirect 和 mime 类型

在我的 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 会为您猜测类型并添加标头:)

相关内容