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;
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
Vous devez vous connecter pour publier un commentaire.
Mettre le
root
directive à l'extérieur de lalocation
bloc comme un enfant direct de l'server
bloc fixe le problème.Apparemment c'est un piège que la Nginx wiki recommande à éviter.
Je crois que si la clause de vérification pour un répertoire a été le seul à résoudre le problème...
OriginalL'auteur danronmoon