Jak usunąć podwójne ukośniki w adresach URL obsługiwanych przez nginx?


9

Muszę zreplikować następujące reguły przepisywania Apache w konfiguracji Nginx na Ubuntu 12.04. Co to jest ekwiwalent nginx:

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


Ktokolwiek znalazł to w Internecie i próbuje skopiować i wkleić sugerowane odpowiedzi, strzeż się, jeśli używasz konfiguracji Virtualbox z niestandardowymi portami. Musiałem to zmienić np. rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;Tam, gdzie 4321 jest zewnętrznym portem Virtualbox, do którego łączy się moja przeglądarka.
aexl

Odpowiedzi:


6

Chciałbym zaproponować takie podejście:

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

Wykorzystuje domyślne zachowanie nginx - scalanie ukośników, więc nie musimy zamieniać ukośników, po prostu przekierowujemy

znaleziono tutaj



To nie działa dla SSL przez certbot, jeśli masz nginx jako odwrotne proxy przez proxy_pass
Jonathan

3

Znalazłem odpowiedź KWO na nie działa. Patrząc na mój dziennik debugowania, dzieje się tak:

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"

Odkryłem, że to zadziałało dla mnie:

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

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


Link referencyjny jest tym, co musisz sprawdzić. Tam jest właściwe rozwiązanie. Spróbuję edytować odpowiedź.
Anup Nair

1

Spróbuj tego:

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

Może istnieć wiele przekierowań dla ukośników> 3 lub wiele grup ukośników.


„merge_slashes off” nie miało znaczenia i nie spowodowało żadnych zmian.
Anup Nair

1
Dlaczego merge_slashes on;po prostu nie działa? Czy Nginx jest buggy?
Jonathan

1
@Jathanathan - właśnie to spotkałem. Rozumiem, że merge_slashes onto nie robi tego, co myślisz. Mówi w zasadzie, że nginx ma traktować // i / i /// jako pojedynczy ukośnik (nie scalać i przekierowywać samodzielnie)
Andrew Newby

1

Mówię z doświadczenia w prowadzeniu wielu serwerów produkcyjnych i serwerów deweloperskich dla zespołu. Nie rób tego w nginx. Zamiast tego użyj routera na serwerze aplikacji (JS / PHP itp.).

Nginx nie jest wiarygodny w przypadku prac merytorycznych. Na przykład przekierowania, przepisywania i ifklauzule nie są deterministyczne, jeśli zmienisz konfigurację tak, aby korzystała z protokołu SSL, odwrotnego proxy, ukrytych portów i tak dalej. Może więc sprawić, że będzie działał poprawnie w jednym środowisku, ale może być niemożliwe, aby działał w innym.

Trzymaj się odpowiedniego języka programowania do rozwiązywania problemów, nawet tak prostych jak łączenie podwójnych ukośników. Podziękujesz mi później.


Chociaż zgadzam się z twoim poglądem, uważam, że powinniśmy dać ludziom możliwość wyrażenia własnej opinii na ten temat. Wolę Apache od Nginx z tego samego powodu niż twój. Uwaga: Apache mod_rewrite może być również uważany za prosty język programowania. :-)
Peter - Przywróć Monikę


-1

URL example.com//dir1////dir2///dir3 i więcej Wypróbuj to, działa dla mnie

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.