1 votes

Nginx try_files gotcha

Ok - j'utilise cette règle depuis un moment.

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    alias /usr/local/image/$1;
    error_page 404 /handler.php;
}

si le fichier image existe, il est servi - si le fichier n'existe pas, une page d'erreur 404 personnalisée nommée /handler.php fonctionne pour livrer la marchandise. si l'image est inchangée, elle renvoie un 304 - les nouvelles images renvoient un 200. Presque parfait.

Le problème est que renvoyer un 404 avec l'image n'est pas la bonne chose à faire - je devrais accepter la demande, déterminer si le fichier existe, et sinon exécuter le gestionnaire et renvoyer l'image - et ne pas afficher un 404.

J'ai essayé de remplacer error_page par try_files, mais je n'obtiens pas le résultat souhaité :

 location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
     alias /usr/local/image/$1;
     try_files $uri $uri/ /handler.php;
 }

Rien ne semble correspondre dans try_files et toutes les requêtes aboutissent à handler.php. Je comprends que l'alias est un modèle de correspondance spécial, mais si j'essaie d'entrer dans le champ

try_files "" /handler.php;

Ce qui fonctionne, mais le "" renvoie un type de contenu incorrect (Content-Type:-application/octet-stream) alors que handler.php renvoie le type correct (Content-Type:-image/jpeg).

Bien sûr, je pourrais ajouter "default_type image/jpeg ;" pour forcer la valeur par défaut, mais je cours le risque de renvoyer un type de contenu jpeg alors que l'image réelle pourrait être gif ou png.

Je suis sous debian 6 - nginx-1.0.6-1~dotdeb.2

Des idées sur la façon de faire fonctionner ce système ?

5voto

Dan Points 205

Tout d'abord, vous pourriez forcer Nginx à retourner le code d'état de votre script en utilisant error_page :

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    alias /usr/local/image/$1;
    error_page 404 = /handler.php;
}

Ce signe égal indique à Nginx de retourner le code d'état de handler.php au lieu de 404 .

A partir de try_files essayez cette configuration :

location ~* /(?:abc12345|12abcdef)/(.*\.(jpe?g|gif|png)) {
    root /usr/local/image;
    try_files /$1 /handler.php;
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X