nginx примеры редиректов

Дата | 22.05.2016

nginx примеры редиректов
Добавлю что бы не забыть про nginx примеры редиректов.
Понадобилось на одном из проектов реализовать такие виды редиректов.
Движок сайта bitrix (древний какой то двиг).

1 Редирект
301 редирект с www на без www.

server {
        listen 1.1.1.2:80;
        server_name www.site.local;
        return 301 http://site.local$request_uri;
}
server {
listen 1.1.1.2:80;
server_name site.local;
....
....

2 Редирект.
Дальше нужно было к ссылкам в конце добавлять символ слэша.
То-есть, имеем ссылку site.local/catalog/preparat-i/kosmetika нужно добавить в конце слэш site.local/catalog/preparat-i/kosmetika/
Вот как это выглядит на nginx, добавляем перед локейшеном /

rewrite ^([^.\?]*[^/])$ $1/ permanent;

3 Редирект
другой редирект это с index.php, index.html на /

if ($request_uri ~ "^(.*)index\.(?:php|html)") {
 return 301 $1;
}

Добавляем исключения для слов catalog и personal, с ними должен быть index.php.

if ($request_uri ~ "^(/(?!personal|catalog).*)index\.(?:php|html)") {
 return 301 $1;
}

Если в апаче есть RewriteCond %{QUERY_STRING} ^\z
то нужно привести редирект в nginx к такому виду.

if ($request_uri ~ "^(/(?!personal|catalog).*)index\.(?:php$|html)") {
 return 301 $1;
}

4 Редирект.
Другой редирект вида такого.

Redirect 301 /catalog/toy/toy_rr_1_3aa/ /catalog/toy_rr_1_3aa/

В nginx выглядит так.
Параметр permanent это означает 301 редирект.

rewrite /catalog/toy/toy_rr_1_3aa/ /catalog/toy_rr_1_3aa/ permanent;

5 Редирект.
Говорим как обрабатывать api.

location ~* api/ {
        rewrite ^/api/(.*)$ /api.php?_d=$1&ajax_custom=1&$args last;
}

Пояснение:
Условие RewriteCond обозначает совпадение с которым будет выполнено правило RewriteRule.
Поясню метасимволы:
. – Точка — это любой символ (но только один!).
^ — Эта метка означает начала строки.
$ — Эта метка означает конец строки.
\ — Эта экранирующий слэш, позволяет считать следующий за ним символ, обычным символом.
() – Этот символ обозначает группировку.
! – Метка отрицания.
+ — Этот символ повторяется от 1 до 65536 раз.
? — Этот символ повторяется 0 или 1 раз.
* — А этот символ повторяется от 0 до 65536 раз.
Флаги определяют дополнительные опции.
R — (redirect) — По умолчанию останавливает процесс преобразования, возвращает результат в браузер клиента, как редирект на данную страницу 302, MOVED TEMPORARY. Например флагу можно указать другой код результата, R=301 и он возвратит редирект клиенту с кодом 301 MOVED PERMANENTLY.
NC — (nocase) — Этот флаг отключает проверку регистра символов.
L — (last) — Флаг останавливает процесс преобразования, текущая ссылка считается окончательной.

Понадобилось как то у одного из проектов в определенном url добавить слэш в конце.
вот на примере урл:

https://site.local/brands/yves-delorme/postelnoe-bele/&utm_source=yandex&utm_medium=cpc&utm_campaign=ra:kpibox|cn:poisk_yves_delorme_rf|cid:31934670|src:&utm_content=test_a|dop:main|b:5144609016|k:|st:|a:|s:|t:&utm_term=&roistat=direct8__5144609016_&roistat_referrer=&roistat_pos=_

Фильтрацию таких урлов сделал через if в nginx, по такому содержимому в url «utm\_source\=yandex\&utm\_medium\=cpc»

if ($request_uri !~ "utm\_source\=yandex\&utm\_medium\=cpc") {
    rewrite ^([^.\?]*[^/])$ $1/ permanent;
}

Бывает случае что доменов однотипных много крутится и для них нужен редирект.
Вот пример такого.

server {
listen 80;
server_name "~^www\.(?.+)";
return 301 http://$domain$request_uri;
}
server {
listen 80;
server_name "~(?:^|\.)my_site\.local$";

Сделал редирект для всех доменов с www на без www.

Понадобилось в url убирать лишние слэши.
Допустим есть урл у сайта:
site.local/mon////site//my
делать 301 редирект на:
site.local/mon/site/my

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

Вот и вся мини инструкция nginx примеры редиректов.

5 thoughts on “nginx примеры редиректов

  1. Роман

    помогите пожалуйста с редиктами перевести
    RewriteEngine On
    # Редиректы
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} ^(.*)\.rss.xml$ [OR]
    RewriteCond %{REQUEST_URI} ^(.*)\.html(.+) [OR]
    RewriteCond %{REQUEST_URI} ^(.*)\.htm$ [OR]
    RewriteCond %{REQUEST_URI} ^(.*)\.ht$ [OR]
    RewriteCond %{REQUEST_URI} ^(.*)\.h$ [OR]
    RewriteCond %{REQUEST_URI} ^(.*)\.$
    RewriteRule ^(.*)\.(.*) $1.html [R=301,L]
    RewriteRule ^page/([0-9]+)(/?)$ index.php?cstart=$1 [L]

    1. root

      Я в апачевских редиректах не соображаю, опишите что как должно отдаваться?
      Я постараюсь сделать правила на nginx.
      То-есть все это
      RewriteCond %{REQUEST_URI} ^(.*)\.rss.xml$ [OR]
      RewriteCond %{REQUEST_URI} ^(.*)\.html(.+) [OR]
      RewriteCond %{REQUEST_URI} ^(.*)\.htm$ [OR]
      RewriteCond %{REQUEST_URI} ^(.*)\.ht$ [OR]
      RewriteCond %{REQUEST_URI} ^(.*)\.h$ [OR]

      должно редиректся на 1.html ?

  2. Роман

    емайл уведомлений нет что ли.
    я перенес сайт на другой сервер раньше был этот сайт на апаче сейчас nginx
    вот раньше у меня были редиректы пример сайт.ру/1591-ekipazh.html если кто то заходит так сайт.ру/1591-ekipazh.htm, сайт.ру/1591-ekipazh.ht,сайт.ру/1591-ekipazh.h то редирект автоматом перекидывает на 1591-ekipazh.html правильную ссылку а не отдает 404

  3. rick

    как реализовать редирект для разделов вида: /razdel1/razdel2/razdel3 необходимо чтобы razdel3 переименовался в razdel4 и помещался между razdel1 и razdel2. Т.е. должно получится что-то вроде /razdel1/razdel4/razdel2. При этом razdel1 и razdel2 динамические.
    Я сделал так: rewrite ^/(.*)/(.*)/razdel3 /$1/razdel4/$2 permanent;
    Но при таком записи, редирект происходит и для разделов вида /(.*)/(.*)/(.*)/razdel4.
    Т.е. как добиться редиректа только при совпадении первых двух разделов при условии что третий называется razdel3?

  4. root

    Хмм, так сразу не скажу, я не прогер что бы быстро написать динамический редирект.
    А чем плохи статичные редиректы сделать?
    Типа что куда и так для каждого раздела?
    Вы как то мутно объяснили, можно проще, есть /razdel1/razdel2/razdel3 , нужно поместить раздел3 между 1 и 2.
    Ну хз. если будит время посмотрю, тестировать нужно.
    А так проще нанять прогера, что бы он написал редиректы вам.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *