• Главная - Wiki - Настройка 301 редиректов для Apache и Nginx

Настройка 301 редиректов для Apache и Nginx

Опубликовано: 26.06.2019 в 00:25
Содержание
1. Apache
1.1. Основные редиректы внутри домена

Подборка стандартных примеров для настройки 301 редиректа

Полезные ссылки:
Обработка редиректов: https://yandex.ru/support/webmaster/robot-workings/managing-redirects.html
Перенос сайта:   https://support.google.com/webmasters/topic/6029673?hl=ru&ref_topic=9427949

    Apache

    Основные редиректы внутри домена

    С одной страницы на другую

    Простой:

    Redirect 301 /old/ https://site.ru/new/
    

    Подробный:

    RewriteCond %{REQUEST_URI} ^/old/$
    RewriteRule ^.*$ http://site.ru/new/? [R=301,L]
    

    C www на без www

    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^(.*)$ http://%1/$1 [L,R=301] 
    

    C без www на www

    RewriteCond %{HTTP_HOST} ^([^www].*)$
    RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]
    

    С http на https

    RewriteCond %{HTTPS} !=on
    RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
    

    Если возникает циклический редирект, то воспользуйтесь этим вариантом:

    RewriteCond %{HTTPS} off
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
    

    Для сертификатов https c Cloudflare:

    RewriteCond %{HTTP:CF-Visitor} '"scheme":"http"'
    # Without Cloudflare:
    # RewriteCond %{HTTPS} off 
    RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,R=301,L]
    

    C https на http

    RewriteCond %{HTTPS} =on
    RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1 [R=301,L]
    

    С index.php на главную страницу

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP
    RewriteRule ^index\.php$ http://site.ru/ [R=301,L]
    

    С index.php на главную страницу

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.html\ HTTP
    RewriteRule ^index\.html$ http://site.ru/ [R=301,L]
    

    Со страниц со слешем на без слеша

    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} ![^\/]$
    RewriteRule ^(.*)\/$ /$1 [R=301,L]
    

    Со страниц без слеша на слеш

    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]
    

    Один 301 редирект на без www и с слешем на конце адреса страницы

    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^(.*)$ http://%1/$1/ [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} ![^\/]$
    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteCond %{HTTP_HOST} ^([^www].*)$
    RewriteRule ^(.*)$ http://%1/$1/ [L,R=301]
    

    Один 301 редирект на c www и со слешем на конце адреса страницы

    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^(.*)$ http://www.%1/$1/ [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteCond %{HTTP_HOST} ^([^www].*)$
    RewriteRule ^(.*)$ http://www.%1/$1/ [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} ![^\/]$
    RewriteCond %{HTTP_HOST} ^([^www].*)$
    RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]
    

    Один 301 редирект на c www и без слеша на конце адреса страницы

    RewriteCond %{REQUEST_URI} ^\/$
    RewriteCond %{HTTP_HOST} ^([^www].*)$
    RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} \/$
    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^(.*)\/$ http://www.%1/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteCond %{HTTP_HOST} ^([^www].*)$
    RewriteRule ^(.*)$ http://www.%1/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} \/$
    RewriteCond %{HTTP_HOST} ^([^www].*)$
    RewriteRule ^(.*)\/$ http://www.%1/$1 [L,R=301]
    

    Один 301 редирект на без www и без слеша на конце адреса страницы

    RewriteCond %{REQUEST_URI} ^\/$
    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} \/$ 
    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^(.*)\/$ http://%1/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} !\/$
    RewriteCond %{HTTP_HOST} ^www\.(.*)$
    RewriteRule ^(.*)$ http://%1/$1 [L,R=301]
    
    RewriteCond %{REQUEST_URI} !\?
    RewriteCond %{REQUEST_URI} !\&
    RewriteCond %{REQUEST_URI} !\=
    RewriteCond %{REQUEST_URI} !\.
    RewriteCond %{REQUEST_URI} \/$
    RewriteCond %{HTTP_HOST} ^([^www].*)$
    RewriteRule ^(.*)\/$ http://%1/$1 [L,R=301]
    

    Редирект только адреса site.ru/index.php (без GET параметров) на основное зеркало site.ru

    RewriteCond %{REQUEST_URI} /index.php
    RewriteCond %{QUERY_STRING} ^\z
    RewriteRule ^(.*)$ http://site.ru/? [R=301,L]
    

    Редирект всех адресов с index.php и GET параметрами на страницы только с GET параметрами (вырезать в url index.php)

    Пример: типа site.ru/index.php?n=1 на site.ru/?n=1

    RewriteCond %{REQUEST_URI} /index.php
    RewriteRule ^(.*)$ http://site.ru/ [R=301,L]
    

    Редирект для index.php, index.html или index.htm, массовая склейка

    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.(php|html|htm)\ HTTP/ 
    RewriteRule ^(.*)index\.(php|html|htm)$ http://site.ru/$1 [R=301,L]
    

    Редирект url с GET параметрами (динамический URL) на статический

    1 вариант (простой адрес с GET параметром)

    RewriteCond %{QUERY_STRING} ^id=229
    RewriteRule ^.*$ /supermodel/? [R=301,L] 
    

    2 вариант (со страницы и GET параметром)

    RewriteCond %{REQUEST_URI} /test/
    RewriteCond %{QUERY_STRING} ^id=229
    RewriteRule ^.*$ /supermodel/? [R=301,L] 
    

    Редиректы с домена на домен

    Все страницы одного домена на главную страницу другого домена

    RewriteCond %{REQUEST_URI} (.*)
    RewriteRule ^(.*)$ http://site.ru/ [L,R=301]
    

    Каждая страница одного домена на такой же адрес другого url

    RewriteCond %{REQUEST_URI} (.*)
    RewriteRule ^(.*)$ http://site.ru/$1 [L,R=301]
    

    Переезд на другой домен вместе с поддоменами

    RewriteCond %{HTTP_HOST} ^old-site.com
    RewriteRule ^(.)$ https://new-site.com/$1 [R=301,L] RewriteCond % HTTP_HOST} ^www.aptekaplys.ru RewriteRule ^(.)$ https://new-site.com/$1 [R=301,L]
    
    RewriteCond %{HTTP_HOST} ^(.).old-site.com RewriteRule ^(.)$ https://%1.new-site.com/$1 [R=301,L]
    RewriteCond %{HTTP_HOST} ^www.(.).old-site.com RewriteRule ^(.)$ https://%1.new-site.com/$1 [R=301,L]
    

    Nginx

    301 редирект с http на https протокол

    server {
        #...
        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }
    }
    

    или

    server {
        #...
        listen  server_ip:80;
        server_name  www.site.com;
        rewrite ^ https://www.site.com$request_uri? permanent; 
    }
    

    301 редирект с https на http протокол

    server {
       listen  443;
       server_name  www.devreadwrite.com;
       rewrite ^ http://www.devreadwrite.com$request_uri? permanent; 
    }
     
    server {
        listen  80;
        server_name www.devreadwrite.com;
        #...
    }
    

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

    server {
        #...    
        if ($host ~* ^www\.(.+)$) {
            return 301 $scheme://$1$request_uri;
        }
    
        }
    }
    

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

    server {
        #...
        server_name site.com;
        rewrite ^/(.*)$ http://www.site.com/$1 permanent;
    }
     
    server {
        listen  80;
        server_name www.site.com;
        #...
    }
    

    301 редирект с index.php на без index.php

    server {
    if ($request_uri ~* "^(.*/)index\.php$") {
            return 301 $1;
        }
    }
    

    301 редирект для одной страницы

    server {
        #...
        if ( $request_filename ~ oldpage/ ) {
            rewrite ^ http://www.site.com/newpage/? permanent;
        }
        #...
    }
    

    301 редирект для директории

    server {
        #...
        if ( $request_filename ~ oldfolder/.+ ) {
            rewrite ^(.*) http://www.site.com/newfolder/$1 permanent;
        }
        #...
    }
    

    301 редирект с одного домена на другой

    server {
        server_name site.com www.site.com; 
        rewrite ^ $scheme://www.new-site.com;
    }
    

    Постраничный 301 редирект

    server {
        server_name site.com www.site.com; 
        rewrite ^ $scheme://www.new-site.com$request_uri permanent;
    }
    

    301 редирект со страниц со слешем на страницы без слеша

    server {
        #...
        rewrite ^/(.*)/$ /$1 permanent;
        #...
    }
    

    301 редирект со страниц без слеша на страницы со слешем

    server {
        #...
        rewrite ^(.*[^/])$ $1/ permanent;
        #...
    }
    

    Завершение настройки

    После завершения настройки редиректов необходимо перезагрузить nginx

    service nginx reload
    

    или

    service nginx restart