Avec le cache Nginx qui fonctionne même avec un retour 404

a marqué ce sujet comme résolu.

Bonjour à tous,

Je redirige les erreurs 404 vers un fichier php pour faire de la réécriture d’URL:

1
    error_page 404 = /url_rewriting.php;

Ensuite, mon script PHP génère des images à la volet qui se trouve dans un répertoire /render/:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    set $no_cache 0;

    location ~ /render/ {
            include snippets/fastcgi-php.conf;
            #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            fastcgi_pass 127.0.0.1:9000;

            fastcgi_buffers 8 16k; # increase the buffer size for PHP-FTP
            fastcgi_buffer_size 32k; # increase the buffer size for PHP-FTP
            fastcgi_cache_key $scheme$host$request_uri$request_method;
            fastcgi_cache PROD;
            fastcgi_cache_valid any 20d;
            fastcgi_cache_valid 404      1d;
            fastcgi_cache_use_stale updating error timeout invalid_header http_500 http_503;
            fastcgi_ignore_headers Cache-Control Expires Set-Cookie;
            fastcgi_hide_header "Set-Cookie";
            fastcgi_cache_bypass $no_cache;
            fastcgi_no_cache $no_cache;
            expires 10M;
            access_log off;
            add_header Cache-Control "public";
            add_header X-Cache-Status $upstream_cache_status;
    }

Le système de cache fonctionne correctement avec une URL comme ceci:

https://mywebsite.com/include/php/render/framed/img.php?VR=1&size=300&image=U3pmwKi

Mais ce système de cache ne fonctionne pas avec une URL comme ceci:

https://mywebsite.com/include/php/render/framed/file/VR/1/size/300/image/U3dpwK

La seule différence pour la seconde URL et qu’elle passe par l’erreur 404 qui redirige vers /url_rewriting.php; parce que le répertoire "file" n’existe pas. Mais le script affiche l’image générée grâce à url_rewriting.php qui analyse l’URL et récupére les variables et require le bon fichier.

Qu’est ce que je dois faire pour que Nginx soit capable de de faire du cache sur des réponses 404 ?

Merci.

Salut, je suis pas sûr de bien comprendre alors je vais résumer et tu me dis si c’est ça que tu fais.

J’ai l’impression que tu rediriges les 404 vers ton truc de génération pour ne pas servir de 404 si l’image existe, générer l’image et rediriger vers /php/render/framed/file/VR/1/size/300/image/truc.

Pourquoi ne pas laisser les 404 tranquilles et simplement dire à nginx d’utiliser url_rewriting.php quand on demande /php/render/framed/* ?

+0 -0

Bonsoir Victor,

Il faut éviter les .php? dans l’URL des images pour leurs référencements, donc l’objectif est d’avoir une image comme ceci au niveau HTML:

1
<img src="https://mywebsite.com/include/php/render/framed/file/VR/1/size/300/image/U3dpwK/uneimage.jpg">

Et aujourd’hui elle est bien comme ceci avec le url_rewriting.php, sauf que maintenant le cache Nginx ne fonctionne plus… :( Et j’en ai absolument besoin, je ne peux pas générer à la volet une image à chaque fois qu’elle est affichée…

Comment dire à Nginx d’utiliser url_rewriting.phpquand on demande /php/render/framed/*? Ne risque-t-on pas de tomber en erreur 404 aussi ?

+0 -0

Donc j’ai bien compris ton problème ?

Ce que tu veux c’est qu’accéder à /php/render/framed/* retourne une image ? Si oui regarde ici : http://nginx.org/en/docs/http/ngx_http_core_module.html#location

+0 -0

Non, mon script PHP retourne déjà une image. Le fichier jpg https://mywebsite.com/include/php/render/framed/file/VR/1/size/300/image/U3dpwK/uneimage.jpg n’existe pas, il est généré automatiquement en php via le error_page 404 = /url_rewriting.php;

Par contre ce que je veux c’est que même en 404 Nginx active le fastcgi ce qu’il ne fait pas, pourtant j’ai bien fastcgi_cache_valid 404 1d; dans les options.

Mon location ~ /render/ { devrait fonctionner, il y a bien render dans l’URL du fichier jpg.

J’ai remplacé par /php/render/framed/* mais c’est parail, toujours pas de cache de généré.

Par contre, ce qui coince peut-être c’est au niveau de l’URL du fichier jpg, il n’y a pas de .php à la fin mais .jpg et peut-être ceci n’est pas valide dans mon location ~ /render/:

1
2
3
4
5
            include snippets/fastcgi-php.conf;
            #fastcgi_pass unix:/run/php/php7.0-fpm.sock;
            fastcgi_pass 127.0.0.1:9000;

`
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte