Comment faire pour supprimer la barre oblique de fin à partir de l'URL dans nginx seulement si le répertoire n'existe pas?

Je suis en cours d'exécution d'un serveur nginx 1.4.1 avec PHP en FastCGI. Actuellement, j'ai installé de sorte qu'il supprime les barres obliques de mon Url et les enjeux d'une redirection 301. Cependant, lorsque je visite un répertoire qui existe, je suis forcé dans une boucle de redirection. Mon document en cours de la racine ressemble à ceci:

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

Actuellement je ne peut pas visiter example.com/webgrind ou tout autre répertoire. Mon des journaux d'accès à maintes reprises de lecture similaire à:

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

C'est le bloc de 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 fautive. Si je le supprime et visite example.com/webgrind une 301 est délivré pour me rediriger vers example.com/webgrind/car c'est un répertoire. Cependant, ma demande maintenant accepter à la fois de fuite et non-barres obliques (c'est à dire example.com/users/et example.com/users) et ce n'est pas ce que je veux.

Emballage de la "si", la directive autour de mon réécrire comme suit encore crée une redirection en boucle pendant mes répertoires (si c'est le mal, apparemment, mais une réécriture de la directive dans ce cas est considéré comme sûr):

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

(Je sais que la visite de webgrind/index.php il permettrait de résoudre mon problème, mais j'aimerais éviter de coûteuses et peu professionnel rediriger les boucles lors de ma production répertoires sont poussés à vivre.)

Alors, comment puis-je conditionnelle de la bande de barres obliques seulement pour les ressources qui n'existent pas (mon application web des chemins)?

Mise à JOUR: Mon (inchangé) fastcgi_params config:

fastcgi_param   QUERY_STRING            $query_string;
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;
Un couple de choses: 1) je ne suis pas sûr que je comprends tout à fait ce que vous essayez d'atteindre en termes de comportement pour enlever le slash - êtes-vous d'essayer d'atteindre un niveau de serveur de redirection, où si le client envoie foo.com/aaa ou foo.com/aaa/ que le serveur répond avec un document; ou vous essayer d'obtenir le serveur pour indiquer au navigateur de redirection à partir foo.com/aaa/ à foo.com/aaa?
2) je ne peux pas reproduire la redirection en boucle si j'utilise le if bloc. Vous pouvez peut-être voir le problème si vous utilisez un ancien navigateur, voir Internet Explorer 9 en Permanence Caches Redirige pour un exemple. Donc, ce que cela signifie est que même avec le bloc "if", c'est à dire va essayer de rediriger car il avait la vieille réécrire mis en cache. Pour résoudre ce problème, vous devez effacer le cache de votre navigateur.
Je suis en train de forcer le serveur à dire le client de redirection à partir de foo.com/aaa/ pour foo.com/aaa avec une 301 réponse. Je l'ai testé sur la dernière version de Chrome et Firefox sur 2 ordinateurs différents et effacé le cache de mon navigateur et j'ai toujours ce problème.
Avec if bloquer je ne peut pas le reproduire, soit... Est-il des enregistrements dans nginx erreur.journal? Et peut être que, par hasard, votre application redirige l' wrongfolder à wrongfolder/(créant ainsi une boucle infinie elle-même, se battre avec nginx)?
Il n'y a pas d'enregistrements dans la nginx journal des erreurs concernant la redirection en boucle, et je ne suis pas surpris parce que les 301 sont des activités normales. Je ne suis pas sûr de ce que tu veux dire par wrongfolder... je suis 100% certain que ces dossiers existent si c'est ce que vous demandez. Si le répertoire n'existe pas, mon application (index.php) devrait prendre soin de la gamme (c'est ce que /index.php?$args est en train de faire). Je me sens mieux maintenant qu'il y a 2 cas de la if bloc de travail alors peut-être que mon installation de production va résoudre ce problème. Pourriez-vous poster un lien vers votre test de config? Je peux poster mon http bloc, mais ne sais pas si ça aide

OriginalL'auteur danronmoon | 2013-08-24