Wie entferne ich doppelte Schrägstriche in URLs, die von nginx bereitgestellt werden?

9

Ich muss die folgenden Apache-Umschreiberegeln in der Nginx-Konfiguration unter Ubuntu 12.04 replizieren. Was ist das Nginx-Äquivalent zu:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
Codecowboy
quelle
Wer dies online gefunden hat und versucht, die vorgeschlagenen Antworten zu kopieren und einzufügen, sollte vorsichtig sein, wenn Sie ein Virtualbox-Setup mit benutzerdefinierten Ports verwenden. Ich hatte es zu ändern zB zu sein , rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;wo 4321 die externen Port des Virtualbox'd ist nginx mein Browser eine Verbindung herstellt zu.
Aexl

Antworten:

6

Ich möchte diesen Ansatz vorschlagen:

# 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;
}

Es verwendet das Standardverhalten von Nginx - das Zusammenführen von Schrägstrichen, sodass wir keine Schrägstriche ersetzen müssen, sondern einfach umleiten

hier gefunden

Schlafwandler
quelle
Dies funktioniert nicht für SSL über Certbot, wenn Sie Nginx als Reverse-Proxy über proxy_pass
Jonathan
3

Ich fand kwos Antwort, nicht zu funktionieren. Wenn Sie sich mein Debug-Protokoll ansehen, geschieht Folgendes:

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"

Ich fand das funktionierte für mich:

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

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

DaveQB
quelle
Referenzlink ist das, was Sie überprüfen müssen. Die richtige Lösung ist da drin. Ich werde versuchen, die Antwort zu bearbeiten.
Anup Nair
1

Versuche dies:

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

Es kann mehrere Weiterleitungen für Schrägstriche> 3 oder mehrere Gruppen von Schrägstrichen geben.

kwo
quelle
'merge_slashes off' machte keinen Unterschied und führte zu keiner Änderung.
Anup Nair
1
Warum funktioniert das nicht merge_slashes on;einfach? Ist Nginx fehlerhaft?
Jonathan
1
@ Jonathan - Ich bin auch gerade darauf gestoßen. Mein Verständnis ist, dass merge_slashes ondas nicht das tut, was Sie denken. Grundsätzlich wird nginx angewiesen, // und / und /// als einzelnen Schrägstrich zu verwenden (nicht zusammenzuführen und umzuleiten)
Andrew Newby
1

Ich spreche aus der Erfahrung, mehrere Produktionsserver und Entwicklungsserver für ein Team zu betreiben. Tun Sie dies nicht in Nginx. Verwenden Sie stattdessen Ihren Router auf Ihrem Anwendungsserver (JS / PHP usw.).

Nginx ist für inhaltliche Arbeiten nicht zuverlässig. Beispielsweise sind Weiterleitungen, Umschreibungen und ifKlauseln nicht deterministisch, wenn Sie Ihr Setup so ändern, dass SSL, ein Reverse-Proxy, versteckte Ports usw. verwendet werden. Möglicherweise funktioniert es in einer Umgebung ordnungsgemäß, in einer anderen kann es jedoch unmöglich sein, es zum Laufen zu bringen.

Halten Sie sich an eine geeignete Programmiersprache, um Probleme zu lösen, selbst wenn Sie doppelte Schrägstriche zusammenführen. Du wirst mir später danken.

Jonathan
quelle
Obwohl ich Ihrer Ansicht zustimme, glaube ich, dass wir den Menschen die Möglichkeit geben sollten, sich eine eigene Meinung zu dieser Angelegenheit zu bilden. Ich bevorzuge Apache gegenüber Nginx aus demselben Grund wie Ihren. Beachten Sie, dass Apache mod_rewrite auch als einfache Programmiersprache betrachtet werden kann. :-)
peterh - Monica
-1

URL example.com//dir1////dir2///dir3 und mehr Versuchen Sie dies, es funktioniert für mich

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

SoniNow
quelle