Як видалити подвійну косу рису в URL-адресах, поданих nginx?


9

Мені потрібно повторити наступні правила перезапису Apache в конфігурації Nginx в Ubuntu 12.04. Що таке еквівалент nginx:

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


Хто знайшов це в Інтернеті і намагається скопіювати запропоновані відповіді, будьте обережні, якщо ви використовуєте налаштування Virtualbox за допомогою спеціальних портів. Мені довелося змінити його, наприклад, rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;там, де 4321 - зовнішній порт Virtualbox'd nginx, до якого підключається браузер.
aexl

Відповіді:


6

Я хотів би запропонувати такий підхід:

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

Він використовує поведінку nginx за замовчуванням - злиття косої риси, тому нам не потрібно замінювати косої риски, ми просто перенаправляємо

знайдені тут



Це не працює для SSL через certbot, якщо у вас є nginx як зворотний проксі через proxy_pass
Джонатан,

3

Я виявив, що відповідь kwo не працює. Переглядаючи мій журнал налагодження, ось що відбувається:

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"

Я виявив, що це працює для мене:

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

Посилання: http://rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/


Довідкове посилання - це те, що вам потрібно перевірити. Правильне рішення є там. Я спробую відредагувати відповідь.
Ануп Найр

1

Спробуйте це:

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

Можливо, буде кілька перенаправлень на косу рису> 3 або кілька груп косої риски.


"merge_slashes off" не змінився і не призвів до змін.
Ануп Найр

1
Чому merge_slashes on;просто не працює? Баггі nginx?
Джонатан

1
@Jonathan - Я просто натрапив і на це. Я розумію, що merge_slashes onце не робить те, що ви думаєте. В основному це говорить nginx приймати // та / і /// як єдину косу рису (не зливатися та переспрямовувати самостійно)
Ендрю Ньюбі

1

Я говорю з досвіду роботи декількох виробничих серверів та серверів розробників для команди. Не робіть цього в nginx. Натомість використовуйте роутер на сервері додатків (JS / PHP тощо).

Nginx не є надійним для предметної роботи. Наприклад, переадресації, перезаписи та ifпропозиції не є детермінованими, якщо ви змінюєте налаштування на використання SSL, зворотного проксі, прихованих портів тощо. Тому ви можете змусити це працювати правильно в одному середовищі, але працювати в іншому може бути неможливо.

Дотримуйтесь належної мови програмування для вирішення проблем, навіть настільки ж простих, як об'єднання подвійних косої риски. Ви подякуєте мені пізніше.


Хоча я згоден з вашою думкою, я вважаю, що ми повинні дати людям можливість формувати власну думку з цього питання. Я віддаю перевагу Apache перед Nginx з тієї ж причини, ніж ваша. Зауважте, Apache mod_rewrite також може розглядатися як проста мова програмування. :-)
peterh


-1

URL example.com//dir1////dir2///dir3 та багато іншого Спробуйте це працює для мене

merge_slashes off; розташування ~ ^ (. *?) // + (. *?) $ {return 301 $ 1 / $ 2; }

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.