Re: Как задать условие в rewrite?

Maxim Dounin mdounin на mdounin.ru
Вс Окт 14 03:34:17 UTC 2018


Hello!

On Sat, Oct 13, 2018 at 12:26:12PM -0400, serzh82 wrote:

> Здравствуйте! Я убрал слеш в конце урл с помощью:
> location ~ .+/$ {
>     rewrite (.+)/$ $1 permanent;
>     }
> 
> Но дело в том, что этот код убирает слеш там, где это не нужно. Например,
> есть урл sait.ru/en/?page=2 из-за кода убирается слеш и получается урл
> sait.ru/en?page=2, что дает ошибку 404. Подскажите пожалуйста, как можно
> задать условие, чтобы код не убирал слеш, если после него стоит
> вопросительный знак ? Так возможно сделать?

Произвольные условия делаются с помощью директивы if.  Скажем, 
убрать слэш, только если в запросе нет аргументов, можно так:

    if ($is_args = "") {
        rewrite (.+)/$ $1 redirect;
    }

Подробнее в документации тут:

http://nginx.org/ru/docs/http/ngx_http_rewrite_module.html#if

Но вообще я бы не рекомендовал заниматься подобными действиями, 
особенно - в рамках сколько-нибудь сложных сайтов целиком.  В 
частности потому, что стандартное поведение nginx'а - это 
добавление слэша, если каталог пытаются запрашиваеть без слэша в 
конце, и таким образом очень легко можно плучить, например, 
бесконечный цикл редиректов.  Ну и других проблем, скорее всего, 
вы тоже получите - как в рассматриваемом случае со "/en/?page=2".

Адреса со слэшом в конце и без него - это разные адреса.  Они 
могут быть взаимозаменяемы, если так написан код сайта, а могут и 
не быть.  Соответственно если хочется поменять одно на другое - 
это следует делать локально, и строго там, где соответствующие 
адреса точно взаимозаменямемы.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru