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 ?