nginx、x-accel-redirectおよびmimeタイプ


9

私のnginx 0.8.34セットアップでは、X-Accel-Redirect機能を使用して、アプリケーション自体でダウンロードを処理せずに、アプリケーションコードでファイルのダウンロードを制御しています。

多くの苦痛の後、これは今や基本的に動作しますが、nginxは常にtext/htmlコンテンツタイプのファイルを返します。

デフォルトのコンテンツタイプは、httpブロックで指定されたapplication / octet-stream です。

サーバーブロックには、特に、ファイルが格納されているディレクトリの定義が含まれています。

location /files {
  default_type  application/octet-stream;
  alias /srv/www/uploads;
  internal;  
}

したがって、ここでもコンテンツタイプを指定しましたが、何も変更されていません。

アプリケーションでContent-Typeを設定したくないので、速度が低下します(最初に確認する必要があります)。したがって、理想的には、nginxはファイル拡張子に基づいて正しいmimetypeを返します(httpブロックにはmime.typesを含めます)。

回答:


12

nginxに正しいMIMEタイプを推測させたい場合は、バックエンドサーバーからコンテンツタイプが返されないことを確認する必要があります。

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

1
tornado:tornado.web.RequestHandler.clear(self)self.set_header( 'X-Accel-Redirect'、redirect_location)self.clear_header( 'Content-Type')as .clearメソッドがcontent-typeをtext / htmlに設定するため
Anthony

1

私は個人的にアプリケーションでapplication / octet-streamを設定しましたが、fastcgi_ignore_headersを使用して、Nginxがバックエンドで提供されるヘッダーを使用しないようにすることができる場合があります。

fastcgi_ignore_headers Content-Type;

お返事ありがとうございます。画像が画像としてレンダリングされ、ダウンロードオプションとしてzipファイルが提供されるように、さまざまなコンテンツタイプを提供したいと考えています。だから残念ながら、これはそれを完全に解決しません。
Tomas Kohl、

試してみましたか、それとも機能しないと思い込んでいますか?バックエンドが提供するヘッダーを無視することにより、ファイルに基づいてそれを決定しようとする必要があります。
マーティンフィヨルドヴァルト

2
無視することはできませんContent-Type。よるwiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers可能な値はX-Accel-RedirectX-Accel-ExpiresExpires又はCache-Control
jnns

1
「ヘッダーを次のように指定することは可能ですが、不自然な言い回しは「可能な値が」であることを意味しません。x-accel-redirectと組み合わせる前にContent-Typeを無視したので、それは不可能ではないと思いますが、細かいところに詳しくないことは認めます。
マーティンフィヨルドヴァルト

@MartinFjordvald、それを試して、nginxは不平を言うことを拒否しましたnginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27が、fastcgi_ignore_headers "Expires"機能します
dnozay

0

php-fpm:

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

phpにContent-Typeヘッダーを送信しないように指示します(空のヘッダーも送信しません)。nginxはタイプを推測してヘッダーを追加します:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.