Comment supprimer les slash de fin d’URL dans nginx uniquement si le répertoire n’existe pas?

Je gère un serveur sur nginx 1.4.1 avec PHP-FastCGI. Actuellement, je l’ai configuré pour qu’il supprime les barres obliques à partir de mes URL et lance une redirection 301. Cependant, lorsque je visite un répertoire qui existe, je suis forcé dans une boucle de redirection. Ma racine de document actuelle ressemble à ceci:

- index.php (app) - webgrind - index.php - static - css 

Actuellement, je ne peux pas visiter example.com/webgrind ou tout autre répertoire. Mes journaux d’access sont répétés comme suit:

 GET /webgrind/ HTTP/1.1" 301 178 "-" GET /webgrind HTTP/1.1" 301 178 "-" 

Ceci est le bloc serveur dans mon nginx.conf:

 server { listen 80; server_name example.com; location / { try_files $uri $uri/ /index.php?$args; root /var/www/example/public; index index.php index.html index.htm; } rewrite ^/(.*)/$ /$1 permanent; location = /favicon.ico { access_log off; log_not_found off; } location ~ \.php$ { try_files $uri $uri/ /index.php?$args; root /var/www/example/public; index index.php index.html index.htm; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/example/public$fastcgi_script_name; fastcgi_param APPLICATION_ENV testing; fastcgi_param PATH /usr/bin:/bin:/usr/sbin:/sbin; fastcgi_intercept_errors on; include fastcgi_params; } } 

Je suis conscient que rewrite ^/(.*)/$ /$1 permanent; est la ligne en cause. Si je le supprime et que je visite le site example.com/webgrind, un 301 est émis pour que je puisse redirect vers example.com/webgrind/ car il s’agit d’un répertoire. Cependant, mon application acceptera désormais les barres obliques de fin et de fin (c.-à-d. Example.com/users/ et example.com/users) et ce n’est pas ce que je veux.

Encapsuler la directive «if» autour de ma réécriture comme suit crée toujours une boucle de redirection pour mes répertoires ( if est mal , apparemment, mais une directive de réécriture dans ce cas est considérée comme sûre):

 if (!-d $request_filename) { rewrite ^/(.*)/$ /$1 permanent; } 

(Je sais que la visite de webgrind / index.php résoudrait mon problème, mais je voudrais éviter les boucles de redirection coûteuses et non professionnelles lorsque mes répertoires de production sont diffusés en direct.)

Alors, comment puis-je supprimer les barres obliques de manière conditionnelle uniquement pour les ressources qui n’existent pas (mes chemins d’applications Web)?

UPDATE : ma configuration (non modifiée) fastcgi_params:

 fastcgi_param QUERY_STRING $query_ssortingng; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx/$nginx_version; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_param HTTPS $https; # PHP only, required if PHP was built with --enable-force-cgi-redirect fastcgi_param REDIRECT_STATUS 200; 

Placer la directive root dehors du bloc d’ location tant qu’enfant direct du bloc server résolu le problème.

 server { listen 80; server_name example.com; # This WORKS! root /var/www/example/public; location / { try_files $uri $uri/ /index.php?$args; index index.php index.html index.htm; } if (!-d $request_filename) { rewrite ^/(.*)/$ /$1 permanent; } location = /favicon.ico { access_log off; log_not_found off; } location ~ \.php$ { try_files $uri $uri/ /index.php?$args; index index.php index.html index.htm; fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/example/public$fastcgi_script_name; fastcgi_param APPLICATION_ENV testing; fastcgi_param PATH /usr/bin:/bin:/usr/sbin:/sbin; fastcgi_intercept_errors on; include fastcgi_params; } } 

Apparemment, c’est un piège que le wiki Nginx recommande d’éviter.