Comment supprimer la double barre oblique dans les URL servies par nginx?


9

J'ai besoin de répliquer les règles de réécriture Apache suivantes dans la configuration Nginx sur Ubuntu 12.04. Quel est le nginx équivalent à:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]


Quiconque a trouvé cela en ligne et essaie de copier-coller les réponses suggérées, méfiez -vous si vous utilisez une configuration Virtualbox avec des ports personnalisés. J'ai dû le changer, par exemple, rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;4321 est le port externe du nginx Virtualbox'd auquel mon navigateur se connecte.
aexl

Réponses:


6

Je voudrais suggérer cette approche:

# remove multiple sequences of forward slashes
# rewrite URI has duplicate slashes already removed by Nginx (merge_slashes on), just need to rewrite back to current location
# note: the use of "^[^?]*?" avoids matches in querystring portion which would cause an infinite redirect loop
if ($request_uri ~ "^[^?]*?//") {
rewrite "^" $scheme://$host$uri permanent;
}

Il utilise le comportement par défaut de nginx - fusion des barres obliques, donc nous n'avons pas besoin de remplacer les barres obliques, nous redirigeons simplement

trouvé ici



Cela ne fonctionne pas pour SSL via certbot si vous avez nginx comme proxy inverse via proxy_pass
Jonathan

3

J'ai trouvé que la réponse de kwo ne fonctionnait pas. En regardant mon journal de débogage, voici ce qui se passe:

2014/08/18 15:51:04 [debug] 16361#0: *1 http script regex: "(.*)//+(.*)"
2014/08/18 15:51:04 [notice] 16361#0: *1 "(.*)//+(.*)" does not match "/contact-us/", client: 59.167.230.186, server: *.domain.edu, request: "GET //////contact-us//// HTTP/1.1", host: 
"test.domain.edu"

J'ai trouvé que cela fonctionnait pour moi:

if ($request_uri ~* "\/\/") {
  rewrite ^/(.*)      $scheme://$host/$1    permanent;
}

Réf: http://rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/


Le lien de référence est ce que vous devez vérifier. La bonne solution est là. Je vais essayer de modifier la réponse.
Anup Nair

1

Essaye ça:

merge_slashes off;
rewrite (.*)//+(.*) $1/$2 permanent;

Il peut y avoir plusieurs redirections pour les barres obliques> 3 ou plusieurs groupes de barres obliques.


'merge_slashes off' n'a fait aucune différence et n'a entraîné aucun changement.
Anup Nair

1
Pourquoi ça ne merge_slashes on;marche pas? Le nginx est-il buggé?
Jonathan

1
@Jonathan - Je viens de tomber sur ce point également. Ma compréhension, c'est que merge_slashes oncela ne fait pas ce que vous pensez. Il dit essentiellement à nginx de prendre // et / et /// comme une seule barre oblique (de ne pas fusionner et rediriger de lui-même)
Andrew Newby

1

Je parle d'expérience de l'exécution de plusieurs serveurs de production et serveurs de développement pour une équipe. Ne faites pas cela dans nginx. Utilisez plutôt votre routeur sur votre serveur d'applications (JS / PHP, etc.).

Nginx n'est pas fiable pour les travaux de fond. Par exemple, les redirections, les réécritures et les ifclauses ne sont pas déterministes si vous modifiez votre configuration pour utiliser SSL, un proxy inverse, des ports cachés, etc. Vous pouvez donc le faire fonctionner correctement dans un environnement, mais il pourrait être impossible de le faire fonctionner dans un autre.

Tenez-vous à un langage de programmation approprié pour résoudre les problèmes, même aussi simple que de fusionner des doubles barres obliques. Tu me remercieras plus tard.


Bien que je partage votre opinion, je pense que nous devrions donner aux gens la possibilité de se forger leur propre opinion sur la question. Je préfère Apache à Nginx, pour la même raison que la vôtre. Remarque: Apache mod_rewrite peut également être considéré comme un langage de programmation simple. :-)
peterh


-1

URL example.com//dir1////dir2///dir3 et plus Essayez ça marche pour moi

merge_slashes off; emplacement ~ ^ (. *?) // + (. *?) $ {return 301 $ 1 / $ 2; }

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.