web-dev-qa-db-fra.com

Les fichiers image non existants ne sont pas gérés par PHP comme ils le devraient en raison de la configuration de ngnix

Je suis en train de construire une application web. Pour que cela fonctionne correctement, j'ai écrit cette règle:

  location / {
    if (!-e $request_filename) {
      expires 168h;
      add_header Pragma public;
      add_header Cache-Control "public, must-revalidate, proxy-revalidate";

      rewrite ^(.*)$ /libraries/render.php;
    }
  }

Cela fonctionne pour les URL avec des fichiers inexistants comme ceci: http://test.test/test mais pas pour une image inexistante: http://test.test/test.png

J'ai une deuxième règle qui pourrait affecter les images:

 location ~* \.(?:gif|jpe?g|png|ico)$ {
    expires 168h;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
  }

Mais je ne sais pas comment cela empêcherait le déclenchement de la règle de réécriture. Toutes les extensions de cette règle ne sont pas transmises à render.php
Lorsque je supprime cette règle (en la commentant), toutes les extensions sauf .png fonctionnent. C'est très étrange.

Ceci est toute ma config:

server {
  rewrite_log on;

  # IPv4
  listen 80;
  listen 443 ssl;
  # IPv6
  # listen [::]:80 ipv6only=on;
  # listen [::]:443 ssl ipv6only=on;

  server_name test.test;

  # SSL
  ssl_certificate /etc/ssl/private/ssl-bundle.test.test.crt;
  ssl_certificate_key /etc/ssl/private/test.test.key;
  ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!MD5;

  root /var/www/test;

  index index.php index.html index.htm;
  try_files $uri $uri/ $uri/index.php $uri/index.html $uri/index.htm =404;
  disable_symlinks off;

  location / {
    if (!-e $request_filename) {
      expires 168h;
      add_header Pragma public;
      add_header Cache-Control "public, must-revalidate, proxy-revalidate";

      rewrite ^(.*)$ /libraries/render.php;
    }
  }

  location = /config.inc.php {
    internal;
  }

  location /cache/ {
    internal;
  }

  location /libraries/ {
    internal;
  }

  location /images/ {
    internal;
  }

  location ~ \.php$ {
    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

    # With php5-cgi alone:
    #fastcgi_pass 127.0.0.1:9000;
    # With php5-fpm:
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    include fastcgi_params;
  }

  location ~ /\.ht {
    deny all;
  }

  location ~ /\.sh {
    deny all;
  }

  location ~* \.html$ {
    expires -1;
  }

  location ~* \.(?:gif|jpe?g|png|ico)$ {
    expires 168h;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
  }

  # Rewrites

  rewrite ^(?<filename>.+\.(?<type>css|js))$ /compress.php?file=$filename&type=$type;
}
1
BrainStone

Ainsi, après quelques essais et erreurs, j'ai trouvé une solution efficace qui ne me satisfait pas vraiment. Mais au moins ça marche.

Puisque toutes les images "réelles" sont situées dans /includes/ ou dans des sous-répertoires, j'ai simplement récrit la règle pour les images.

Donc ça

 location ~* \.(?:gif|jpe?g|png|ico)$ {
    expires 168h;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
  }

A été transformé en cette

 location ~* ^/includes/.+\.(?:gif|jpe?g|png|ico)$ {
    expires 168h;
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
  }
1
BrainStone