Nginx rewrite

JonnyB
На сайте с 23.08.2006
Offline
185
325

Доброго дня.

Подскажите, как сделать 301 редирект с:

site.ru/dir/anything/.../anything/?anything

на:

site.ru/dir/

Делаю так:

rewrite ^(/dir/[^/]+/).+$ /$1 permanent;

и получаю почти то что нужно, но зацикливание ERR_TOO_MANY_REDIRECTS.

https://jonnyb.ru/ (http://jonnyb.ru/)
SocFishing
На сайте с 26.09.2013
Offline
118
#1

JonnyB, у вас нет location условия для редиректа

location ~* /dir/anything/ {

return 301 /dir/;

}

что-то типа того. Ваш rewrite зацикливается, так как нет IF. Перепишите на ваши регулярки

★Сервис идентифицирует (https://socfishing.com/?utm_source=searchengines) посетителей вашего сайта и предоставляет их профили ВКонтакте, Телефон, Почта! Цены копеечные, работаем 8 лет.
JonnyB
На сайте с 23.08.2006
Offline
185
#2

SocFishing, спасибо, мысль понял. А если нужно что то сматчить и использовать в урле для редиректа?

Ну например site.ru/dir/dir2/anything редиректим на site.ru/dir/dir2/, site.ru/dir/dir3/anything редиректим на site.ru/dir/dir3/. Попробовал свой rewrite обернуть локейшн, но все равно зацикливается:

	location ~* /dir/[^/]+/.+ {
rewrite ^(/dir/[^/]+/).+$ /$1 permanent;
}

Хотя вроде бы site.ru/dir/dir2/ уже не должен попадать повторно сюда, потому что вконце рег выражения .+

SocFishing
На сайте с 26.09.2013
Offline
118
#3

JonnyB,

У вас дело в том, что у вас rewrite к текущему урлу делает еще /dir. Вроде надо делать так rewrite ^(/dir/[^/]+/).+$ $scheme://$host/$1 permanent;

Можно еще использовать такие конструкции:

location ~* / {

if ($request_uri ~ ^/dir/dir2/(.*)/$) {

return 301 /dir/dir2/;

}

if ($request_uri ~ ^/dir/dir3/(.*)/$) {

return 301 /dir/$1/; #передать anything в редирект

}

}

К сожалению я уже подзабыл, читать мануалы не хочется и тестить еще где-то надо. У nginx есть еще map директива для создания переменных. Не часто я занимаюсь тонкой настройкой, так что не пинайте, помог чем смог ;)

JonnyB
На сайте с 23.08.2006
Offline
185
#4

SocFishing, спасибо, очень помогли. Заработала вот такая конструкция:

	if ($request_uri ~ ^/dir/(.*)/.+$) {
return 301 /dir/$1/;
}

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий