Как удалить двойную косую черту в URL, обслуживаемых nginx?

9

Мне нужно скопировать следующие правила переписывания Apache в конфигурации Nginx на Ubuntu 12.04. Что такое nginx эквивалентно:

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
codecowboy
источник
Кто бы ни нашел это онлайн и попытается скопировать предложенные ответы, будьте осторожны, если вы используете установку Virtualbox с пользовательскими портами. Мне пришлось изменить его, например, rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;где 4321 - это внешний порт Virtualbox, к которому подключается мой браузер 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 - объединение слешей, поэтому нам не нужно заменять слеш, мы просто перенаправляем

нашел здесь

SleepWalker
источник
1
«если» - зло: nginx.com/resources/wiki/start/topics/depth/ifisevil
MacroMan
Это не работает для 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/

DaveQB
источник
Ссылка на ссылку - это то, что вам нужно проверить. Правильное решение там. Я постараюсь отредактировать ответ.
Anup Nair
1

Попробуй это:

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

Для слешей> 3 может быть несколько перенаправлений или несколько групп слешей.

KWO
источник
'merge_slashes off' не имеет значения и не приводит к изменениям.
Anup Nair
1
Почему merge_slashes on;просто не работает? Nginx глючит?
Джонатан
1
@ Джонатан - я только что столкнулся с этим. Насколько я понимаю, merge_slashes onэто не делает то, что вы думаете. Он в основном говорит nginx принимать // и / и /// как одну косую черту (не объединять и не перенаправлять самостоятельно)
Эндрю Ньюби
1

Я говорю из опыта запуска нескольких рабочих серверов и серверов разработки для команды. Не делайте этого в nginx. Вместо этого используйте свой маршрутизатор на сервере приложений (JS / PHP и т. Д.).

Nginx не надежен для основной работы. Например, перенаправления, переписывания и ifпредложения недетерминированы, если вы измените настройку на использование SSL, обратного прокси-сервера, скрытых портов и т. Д. Таким образом, вы можете заставить его работать правильно в одной среде, но может оказаться невозможным работать в другой.

Придерживайтесь правильного языка программирования для решения проблем, даже такого простого, как объединение двойных слешей. Ты поблагодаришь меня позже.

Джонатан
источник
Хотя я согласен с вашей точкой зрения, я считаю, что мы должны дать людям возможность составить собственное мнение по этому вопросу. Я предпочитаю Apache Nginx по той же причине, что и ваша. Обратите внимание, что Apache mod_rewrite также может рассматриваться как простой язык программирования. :-)
Петер - Восстановить Монику
-1

URL example.com//dir1////dir2///dir3 и др. Попробуйте, это работает для меня

merge_slashes off; местоположение ~ ^ (. *?) // + (. *?) $ {return 301 $ 1 / $ 2; }

SoniNow
источник