web-dev-qa-db-fra.com

Redirection NginX vers le fichier PHP si l'image n'existe pas sur le serveur de fichiers

C'est ce que j'essaie de faire. Je ne connais pas suffisamment Nginx pour créer des règles de réécriture personnalisées, comme vous pouvez le faire avec Apache. Ce serait grandement apprécié si quelqu'un pouvait m'aider avec le fichier de configuration Nginx! Merci d'avance!

J'ai un serveur d'images qui exécute Nginx sur le port 80 et Apache qui écoute sur 8080. Ce que j'aimerais faire, c'est ...

lorsque vous demandez une image qui n'existe pas comme ceci:

http://img.server.com/(...ANY DIRECTORY...)/123_4_anyimagename.jpg

il va rediriger vers

http://img.server.com:8080/image.php?id=123_4_anyimagename

Je vous remercie! J'ai presque ce travail! Je devais mettre à la racine

location ~ \.(gif|jpg|png)${
    root /var/www/mysite.com/httpdocs/;
    try_files $uri @img_proxy
}

location @img_proxy {
    rewrite ^(.*)$ /image.php?id=$1
    proxy_pass      http://127.0.0.1:8080;
}

Donc, dans le fichier images.php qui se trouve à

/var/www/mysite.com/httpdocs/image.php

J'ai simplement

<?php echo "test"; ?>  

pour voir si ça marche. Le problème semble être php n'est pas en train de démarrer et son juste rendu en texte brut. C'est presque là! Des indices pour savoir où chercher?

Si je lance http://mydomain.com:8080/image.php je reçois "test" en sortie. Donc, je sais que php fonctionne. Qu'est-ce que je surveille?

2
angel

Nginx utilise la directive try_files pour "voir si quelque chose existe et se rabattre sur une autre option" au lieu d'utiliser des instructions if et des réécritures.

Dans votre bloc de serveur, créez un bloc d’emplacement correspondant à vos fichiers (par exemple, des fichiers se terminant par jpg, gif, png - ajoutez les extensions de votre choix). Dans ce bloc, vous allez ajouter votre directive try_files. Nginx essaiera les chemins dans l’ordre - vous commencez par le chemin direct de l’image, puis vous énumérez le chemin de votre fichier php (mais vous devez utiliser un proxy, utilisez plutôt un emplacement nommé). Peut-être quelque chose comme ce qui suit:

location ~ \.(gif|jpg|png) {
    try_files $uri @img_proxy;
}

Ce qui précède revient essentiellement à ce qui suit: Pour tous les fichiers se terminant par .gif, .jpg ou .png, essayez d’abord le chemin ($uri), et s’il n’existe pas, passez à @img_proxy.

Maintenant, vous devez créer un deuxième emplacement @img_proxy que nginx utilisera s’il ne trouve pas le fichier réel. En cela, vous spécifierez vos paramètres de proxy, vous aurez également une réécriture pour changer le chemin, et vous passerez finalement l'URI au serveur principal.

Quelque chose comme ce qui suit (la regex n’est PAS ce que vous recherchez - elle transmettra le chemin complet, pas seulement le nom du fichier - vous pourrez le modifier à votre guise):

location @img_proxy {
    rewrite ^(.*)$ /image.php?id=$1;
    proxy_pass      http://127.0.0.1:8080;
}

[modifié pour corriger certains points-virgules manquants]

7
cyberx86

Ceci est un vieux post, car les autres réponses ne fonctionnaient pas pour moi, alors je partage ma solution simple avec d'autres programmeurs qui ont le même problème. Les codes manquent redirect ou permanent à la fin des règles de réécriture:

location ~ \.(gif|jpg|png)${
    root /var/www/mysite.com/httpdocs/;
    try_files $uri @img_proxy;
}

location @img_proxy {
    rewrite ^(.*)$ /image.php?id=$1 redirect;
    proxy_pass      http://127.0.0.1:8080;
}

Ou en une ligne:

location @img_proxy {
    rewrite ^(.*)$ http://127.0.0.1:8080/image.php?id=$1 redirect;
}
1
KeitelDOG

la réponse de cyberx86 a très bien fonctionné pour moi, mais j'ai dû supprimer la ligne proxy_pass, supprimer un signe dollar et ajouter des points-virgules. L'ajout à ma config est:

    location ~ \.(gif|jpg|png) {
        try_files $uri @img_proxy;
    }

    location @img_proxy {
        rewrite ^(.*)$ /tools/image/?url=$1;
    }
0
Dean Rather