typy nginx, x-accel-redirect i mime

9

W mojej konfiguracji nginx 0.8.34 korzystam z funkcji X-Accel-Redirect, aby kontrolować pobieranie plików w kodzie aplikacji, ale aplikacja nie obsługuje samego pobierania.

Po dużym bólu działa to teraz w zasadzie, z wyjątkiem tego, że nginx zawsze zwraca plik z text/htmltypem zawartości.

Domyślny typ zawartości to application / octet-stream, określony w httpbloku.

Blok serwera zawiera między innymi definicję katalogu, w którym przechowywane są pliki:

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

Podałem więc typ zawartości nawet tutaj, ale nic się nie zmieniło.

Nie chcę ustawiać typu zawartości według aplikacji, ponieważ wtedy spowolniłbym (najpierw musiałbym to określić). Idealnie więc nginx zwróciłby prawidłowy typ mimetyczny na podstawie rozszerzenia pliku (w httpbloku dołączam mime.types ).

Tomas Kohl
źródło

Odpowiedzi:

12

Jeśli chcesz pozwolić nginx odgadnąć właściwy typ MIME, musisz tylko upewnić się, że żaden typ zawartości nie zostanie zwrócony z twojego serwera zaplecza.

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response
Sebastien Estienne
źródło
1
with tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type'), ponieważ metoda .clear ustawia typ zawartości na text / html
Anthony
1

Ja osobiście po prostu ustawić application / octet-stream w aplikacji, ale może być w stanie wykorzystać fastcgi_ignore_headers aby zapobiec Nginx z pomocą back-end dostarczonego nagłówek.

fastcgi_ignore_headers Content-Type;
Martin Fjordvald
źródło
Dziękuję za Twoją odpowiedź. Chcę serwować różne typy treści, aby obrazy były renderowane jako obrazy i pliki zip oferowane jako opcja pobierania. Niestety nie rozwiązuje to tego problemu.
Tomas Kohl
Próbowałeś, czy po prostu zakładasz, że to nie zadziała? Ignorując dostarczony nagłówek zaplecza, powinien spróbować ustalić go na podstawie pliku.
Martin Fjordvald
2
Nie można zignorować Content-Type. Według wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers możliwych wartości X-Accel-Redirect, X-Accel-Expires, ExpireslubCache-Control
jnns
1
„Możliwe jest określenie nagłówków takich jak”, podczas gdy gówniane frazowanie nie oznacza „możliwe wartości to”. Zignorowałem wcześniej Content-Type w połączeniu z przekierowaniem x-accel, więc nie sądzę, że to niemożliwe, ale przyznam, że nie jestem intymny z drobiazgowymi szczegółami.
Martin Fjordvald,
@MartinFjordvald, próbowałem i nginx odmówił rozpoczęcia narzekań, nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27ale fastcgi_ignore_headers "Expires"działa
dnozay
0

z php-fpm:

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

mówi php, aby w ogóle nie wysyłał nagłówka Content-Type (nawet pustego), a nginx zgadnie typ dla Ciebie i doda nagłówek :)

hanshenrik
źródło