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

Дата | 22.05.2016

Добавлю что бы не забыть.
Понадобилось на одном из проектов реализовать такие виды редиректов.
Движок сайта 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) — Флаг останавливает процесс преобразования, текущая ссылка считается окончательной.

3 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

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

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