Jak mogę się upewnić, że Nginx wyświetla pliki w postaci zwykłego tekstu jako plik do pobrania zamiast wbudowanego?


18

Mam aplikację Rails (Redmine), która współpracuje z Nginx. Jeśli klikam dowolny załącznik, moja przeglądarka (Firefox, tj. Chrome) poprosi mnie o pobranie pliku. Ale jeśli kliknę załącznik typu txt, moja przeglądarka otworzy ten plik w przeglądarce.

Jak rozumiem, zadaniem Nginx jest decyzja - otwórz plik w przeglądarce lub pobierz go. Jak mogę to skonfigurować?

Odpowiedzi:



20

Zmiana Content-Typez .txtplikami może pracować, ale jest to dość ryzykowny sposób, aby rozwiązać ten problem, ponieważ nie można zagwarantować 100%, że przeglądarka użytkownika będzie reagować, jak można się spodziewać. Ponadto mylące jest oznaczanie .txtpliku jako pliku binarnego.

Zamiast tego sugeruję użycie standardowego sposobu, aby zmusić przeglądarkę do pobrania zamiast wyświetlać plik, którym jest użycie Content-Dispositionnagłówka o wartości attachment( RFC 2183 , patrz także RFC 2616 ).

Na przykład ten locationblok nginx wyśle ​​taki nagłówek z .txtplikami pod /downloads/identyfikatorem URI, a zatem zostaną zmuszone do pobrania:

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

Możesz więc dodać inne odpowiednie dopasowania itp., Odpowiednie do konfiguracji.


3
To wydaje się być najlepszym rozwiązaniem.
Vadim

Ale Content-Dispositionwłamanie się do przeglądarki chromu może zacząć wypowiadać złe słowa do konsoli, a nawet przestać pobierać pliki ze strony. Mówi cienkie (z żółtymi trójkątami) jak:"Resource interpreted as Document but transferred with MIME type image/png:"
Nakilon

4

Musisz wyodrębnić lokalizację pliku do pobrania i ustawić jego typ zawartości jako application/octet-stream.

W naszej usłudze mamy następującą lokalizację dla materiałów promocyjnych do pobrania (które obejmują pliki pdf, obrazy i niektóre dokumenty, ale jestem pewien, że będzie działać również z plikami txt):

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

Każda wypróbowana przeglądarka pobiera wszystkie pliki z tej lokalizacji zamiast próbować je wyświetlić.


4
Używanie „add_header” jest całkowicie błędne, zamiast tego użyj „default_type”: location / smth / {default_type application / octet-stream ;; }
Oleg Neumyvakin

@OlegNeumyvakin Dlaczego domyślny typ jest lepszy od add_header?
user193661,

2
@ user193661 Ponieważ „add_header” dosłownie dodaje nowy nagłówek „Content-Type”, więc w odpowiedzi możesz otrzymać dwa nagłówki „Content-Type”, co może prowadzić do dziwnego zachowania klientów HTTP. „default_type” jest ustawiany (zastępuje) pojedynczy nagłówek „Content-Type” w odpowiedzi.
Oleg Neumyvakin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.