Nginx가 인라인 대신 일반 텍스트 파일을 다운로드로 제공하도록하려면 어떻게해야합니까?


18

Nginx와 함께 작동하는 Rails 응용 프로그램 (Redmine)이 있습니다. 브라우저 (firefox, 즉 크롬)에서 첨부 파일을 클릭하면 파일 다운로드를 요청합니다. 그러나 txt 형식의 첨부 파일을 클릭하면 브라우저에서이 파일을 엽니 다.

내가 이해하는 것처럼 Nginx의 임무는 브라우저에서 파일을 열거 나 다운로드하는 것입니다. 어떻게 설정합니까?

답변:



20

변화 Content-Type.txt파일이 작동 할 수 있지만 사용자의 브라우저가 예상 어떻게 반응 할 100 % 보장 할 수 있기 때문에이 문제를 해결하기 위해 다소 위험한 방법입니다. 또한 .txt파일을 이진 파일로 레이블링하는 것은 잘못된 것입니다 .

대신 파일을 표시하지 않고 브라우저를 강제로 다운로드하는 표준 방법을 사용하는 것이 좋습니다. Content-Disposition이 값은 attachment( RFC 2183 , RFC 2616 참조) 헤더 를 사용하는 것 입니다.

예를 들어,이 nginx location블록은 URI .txt아래에 파일이 있는 해당 헤더를 전송 /downloads/하므로 다운로드해야합니다.

location ~ ^/downloads/.*\.txt$ {
  add_header Content-Disposition "attachment";
}

따라서 구성에 적합한 다른 적절한 일치 등을 추가 할 수 있습니다.


3
가장 좋은 해결책 인 것 같습니다.
Vadim

그러나 Content-Disposition크롬 브라우저의 해킹은 콘솔에 나쁜 단어를 말하고 페이지에서 파일 다운로드를 중지 할 수 있습니다. 그것은 다음과 같이 thinhgs (노란색 삼각형으로) 말합니다 :"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

다운로드 가능한 파일의 위치를 ​​추출하고 해당 컨텐츠 유형을로 설정해야합니다 application/octet-stream.

다운로드 가능한 프로모션 자료 (pdf, 이미지 및 일부 문서 포함)에 대한 서비스 위치는 다음과 같습니다.하지만 txt 파일에서도 작동합니다.

location /promomaterial/download/ {
         add_header Content-Type application/octet-stream;
}

우리가 시도한 모든 브라우저는 파일을 표시하지 않고이 위치에서 모든 파일을 다운로드합니다.


4
"add_header"를 사용하는 것은 절대적으로 잘못입니다. 대신 "default_type"을 사용하십시오. location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin 왜 default_type이 add_header보다 낫습니까?
user193661

2
@ user193661 "add_header"는 문자 그대로 새로운 헤더 "Content-Type"을 추가하므로 응답으로 두 개의 "Content-Type"헤더를 얻을 수 있으며 이로 인해 HTTP 클라이언트의 이상한 동작이 발생할 수 있습니다. 응답으로 "default_type"이 단일 "Content-Type"헤더로 설정 (덮어 쓰기)됩니다.
Oleg Neumyvakin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.