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;
}
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";
}