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') .clear 메소드는 content-type을 text / html로 설정합니다
Anthony

1

개인적으로 응용 프로그램에서 application / octet-stream을 설정했지만 fastcgi_ignore_headers 를 사용하여 Nginx가 백엔드 제공 헤더를 사용하지 못하게 할 있습니다 .

fastcgi_ignore_headers Content-Type;

답변 주셔서 감사합니다. 이미지와 zip 파일이 다운로드 옵션으로 제공 될 때 이미지가 렌더링되도록 다른 컨텐츠 유형을 서버로 만들고 싶습니다. 불행히도 이것은 해결되지 않습니다.
Tomas Kohl

시도 했습니까 아니면 작동하지 않는다고 가정합니까? 백엔드 제공 헤더를 무시하면 파일을 기반으로 헤더를 판별해야합니다.
Martin Fjordvald

2
무시할 수 없습니다 Content-Type. 따르면 wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers 가능한 값이며 X-Accel-Redirect, X-Accel-Expires, Expires또는Cache-Control
jnns는

1
시끄러운 문구는 "가능한 값은"을 의미하지 않지만 "같은 헤더를 지정할 수 있습니다". x-accel-redirect와 함께 Content-Type을 무시했기 때문에 불가능하다고 생각하지는 않지만 거친 세부 사항에 친숙하지 않다는 것을 인정합니다.
Martin Fjordvald

@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.