types nginx, x-accel-redirect et mime

9

Dans ma configuration nginx 0.8.34, j'utilise la fonction X-Accel-Redirect pour contrôler les téléchargements de fichiers dans le code de l'application sans que l'application gère le téléchargement lui-même.

Après beaucoup de douleur, cela fonctionne maintenant, sauf que nginx renvoie toujours le fichier avec le text/htmltype de contenu.

Le type de contenu par défaut est application / octet-stream, spécifié dans le httpbloc.

Le bloc serveur contient, entre autres, la définition du répertoire dans lequel les fichiers sont stockés:

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

J'ai donc spécifié le type de contenu même ici, mais rien n'a changé.

Je ne veux pas définir le Content-Type par l'application, car alors je ralentirais (je devrais d'abord le déterminer). Donc, idéalement, nginx retournerait le mimetype correct en fonction de l'extension du fichier (j'inclus mime.types dans le httpbloc).

Tomas Kohl
la source

Réponses:

12

Si vous voulez laisser nginx deviner le bon type de mime, il vous suffit de vous assurer qu'aucun type de contenu n'est renvoyé par votre serveur principal.

With django:
    response = HttpResponse()
    response['Content-Type'] = ''
    response['X-Accel-Redirect'] ='/my/file.jpg'
    return response
Sébastien Estienne
la source
1
avec tornado: tornado.web.RequestHandler.clear (self) self.set_header ('X-Accel-Redirect', redirect_location) self.clear_header ('Content-Type') car la méthode .clear définit le type de contenu sur text / html
Anthony
1

Personnellement, je viens de définir application / octet-stream dans l'application, mais vous pourrez peut- être utiliser fastcgi_ignore_headers pour empêcher Nginx d'utiliser l'en-tête fourni par le back-end.

fastcgi_ignore_headers Content-Type;
Martin Fjordvald
la source
Merci pour votre réponse. Je souhaite gérer différents types de contenu afin que les images soient rendues sous forme d'images et de fichiers zip comme option de téléchargement. Malheureusement, cela ne le résout pas tout à fait.
Tomas Kohl
L'avez-vous essayé ou pensez-vous simplement que cela ne fonctionnera pas? En ignorant l'en-tête fourni par le serveur principal, il devrait essayer de le déterminer en fonction du fichier.
Martin Fjordvald
2
On ne peut pas ignorer Content-Type. Selon wiki.nginx.org/HttpFcgiModule#fastcgi_ignore_headers valeurs possibles sont X-Accel-Redirect, X-Accel-Expires, ExpiresouCache-Control
jnns
1
"Il est possible de spécifier des en-têtes comme" tandis que le phrasé merdique ne signifie pas "les valeurs possibles sont". J'ai ignoré Content-Type auparavant en combinaison avec x-accel-redirect, donc je ne pense pas que ce soit impossible, cependant, je dois admettre que je ne suis pas intime avec les détails granuleux.
Martin Fjordvald
@MartinFjordvald, a essayé et nginx a refusé de commencer à se plaindre nginx: [warn] invalid value "Content-Type" in /etc/nginx/conf.d/default.conf:27mais fastcgi_ignore_headers "Expires"fonctionne
dnozay
0

avec php-fpm:

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

indique à php de ne pas envoyer d'en-tête Content-Type (pas même vide), et nginx devinera le type pour vous et ajoutera l'en-tête :)

hanshenrik
la source