nginx,x-accel-redirect和mime类型


9

在我的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(我确实在http块中包含mime.types )。

Answers:


12

如果要让nginx猜测正确的mime类型,则必须确保后端服务器未返回任何内容类型。

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response

1
与龙卷风:tornado.web.RequestHandler.clear(self)self.set_header('X-Accel-Redirect',redirect_location)self.clear_header('Content-Type')作为.clear方法将content-type设置为text / html
安东尼

1

我个人只是在应用程序中设置了application / octet-stream,但是您可能可以使用fastcgi_ignore_headers来阻止Nginx使用后端提供的头文件。

fastcgi_ignore_headers Content-Type;

谢谢您的回答。我想要服务器提供不同的内容类型,以便将图像渲染为图像和zip文件作为下载选项。因此,不幸的是,这并不能完全解决问题。
Tomas Kohl,2010年

您尝试过还是只是假设它不起作用?通过忽略后端提供的标头,它应尝试根据文件确定它。
Martin Fjordvald 2010年

2
人们不能忽视Content-Type。根据wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers可能的值是X-Accel-RedirectX-Accel-ExpiresExpiresCache-Control
jnns

1
“可以指定类似的标题”,而粗俗的措辞并不意味着“可能的值是”。在结合使用x-accel-redirect之前,我已经忽略了Content-Type,因此,我认为这是不可能的,但是,我承认我并不熟悉严格的细节。
马丁·峡湾

@MartinFjordvald,尝试了一下,nginx拒绝开始抱怨,nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27fastcgi_ignore_headers "Expires"可以工作
dnozay 2014年

0

使用php-fpm:

<?php
    header("Content-Type: ");
    header("X-accel-redirect: (...)");

告诉php完全不发送Content-Type标头(甚至不是一个空的标头),nginx会为您猜测类型并添加标头:)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.