Nginx: try_files hors emplacement

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

  • il correspond au bloc location ~ .php$ { ... } car la requête se termine par .php .
  • le try_files $uri =404; La directive à l’intérieur .php$ emplacement
  • le bloc 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)