Je configure un serveur Web assez standard en utilisant nginx. Le serveur fonctionne comme prévu, cependant, il y a un petit détail de configuration que je voudrais comprendre.
Ma configuration actuelle est la suivante:
index index.html index.htm index.php; location / { try_files $uri $uri/ /index.php?q=$uri; } location ~ \.php$ { try_files $uri =404; fastcgi_index index.php; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; }
Avec cette configuration, si j’accède à: http://myweb.com/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php je reçois un 404 comme prévu.
Cependant, avec cette configuration:
try_files $uri =404; location ~ \.php$ { fastcgi_index index.php; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /etc/nginx/fastcgi_params; }
Je reçois une page vierge avec “Accès refusé”.
Pourquoi le résultat est-il différent?
Je vous remercie
Vous avez probablement l’impression que try_files
au niveau du serveur doit fonctionner pour chaque requête. Pas du tout. Bien au contraire, cela ne fonctionne que pour les requêtes ne correspondant à aucun bloc de location
.
Réponse courte: depuis php5.3.9, php-fpm n’autorise pas les extensions autres que
réponse longue: ceci n’a rien à voir avec try_files étant à l’intérieur ou à l’extérieur d’un bloc de localisation. Laissez-nous casser et expliquer:
demande est: http://myweb.com/wp-content/uploads/2012/10/cropped-bitmap11.png/lol.php
sur votre première configuration
location ~ .php$ { ... }
car la requête se termine par .php
. try_files $uri =404;
La directive à l’intérieur .php$
emplacement location / { ... }
ne correspond jamais. il ne correspond que si aucun autre bloc d’emplacement n’est associé. (voir http://img.zgserver.com/configuration/ngx_http_core_module.html ( /wp-content/uploads/2012/10/cropped-bitmap11.png
, il existe) et refuse d’exécuter la requête à cause de l’extension .png. (voir la réponse courte) Je ne sais pas si c’est un bug ou une chose “par conception” mais, contrairement à la directive “root”, une directive try_files en dehors des blocs de localisation n’a pas hérité à l’intérieur du bloc de localisation. (quelqu’un peut corriger cela si c’est faux)