Задать вопрос
Shlop
@Shlop
Full Stack Developer (PHP/Laravel/JavaScript)

Можно ли сделать в конфигурации nginx редирект из URL с многократными слэшами на без слэшей?

Подскажите пожалуйста мне необходимо сделать вот такие редиректы:

https://domain.ru///foo => https://domain.ru/foo
https://domain.ru///foo//bar/ => https://domain.ru/foo/bar
https://domain.ru/ => https://domain.ru

Это можно ли сделать через nginx ?
Все варианты которые я пробовал приводят к тому что происходит 2 редиректа а хотелось бы одним редиректом.
Или проще это сделать в логике приложения ?
  • Вопрос задан
  • 61 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
Lynn
@Lynn
nginx, js, css
UPD: подставлять $uri в редирект это весьма плохая идея.

Третий пункт невозможен по определению. path в запросе есть всегда.

Для остального вот улучшенный вариант решения от AUser0

map $uri $clean_uri {
    default $uri$is_args$args;
    "~(?'_'.+)/$" $_$is_args$args;
}

server {
    if ($request_uri != $clean_uri) {
        return 302 $clean_uri;
    }
}


Примеры:
$ curl -s -o /dev/null -w '%{http_code}: %{redirect_url}\n' http://localhost:7777///foo
302: http://localhost:7777/foo
$ curl -s -o /dev/null -w '%{http_code}: %{redirect_url}\n' http://localhost:7777/foo//bar/
302: http://localhost:7777/foo/bar
$ curl -s -o /dev/null -w '%{http_code}: %{redirect_url}\n' http://localhost:7777///foo?q=42
302: http://localhost:7777/foo?q=42
$ curl -s -o /dev/null -w '%{http_code}: %{redirect_url}\n' http://localhost:7777/foo//bar/?q=42
302: http://localhost:7777/foo/bar?q=42
$ curl -s -o /dev/null -w '%{http_code}: %{redirect_url}\n' http://localhost:7777/foo
200: 
$ curl -s -o /dev/null -w '%{http_code}: %{redirect_url}\n' http://localhost:7777/foo?q=42
200:
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@AUser0
Чем больше знаю, тем лучше понимаю, как мало знаю.
Дубликаты легко проверяются через
if ($request_uri != $uri) {
    return 302 $scheme://$host$uri ;
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы