Redirect

Матеріал з Wiki.Zina
Версія від 06:16, 14 жовтня 2023, створена >Zina (→www на без-www)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

301 редирект — лучший метод сохранения позиций в поисковых системах, если изменяется URL страницы или домен сайта.

Код 301 означает "перемещен навсегда" ("moved permanently").

Тестирование редиректов

[ред. | ред. код]

Редиректы Nginx

[ред. | ред. код]

Редактируется в конфигах под админом: WWW-домены — выбрать домен — кнопка Конфиг.

См. также:

Несколько доменов на один основной

[ред. | ред. код]

Настроим редирект с domain.org.ua на domain.com

server {
    ...
    if ($host ~* domain\.org\.ua(.*)) {
      rewrite ^ https://domain.com$request_uri? permanent;
    }
    location / {
    ...

www на без-www

[ред. | ред. код]

Т.к. в начале мы делаем средствами ISPmanager редирект с http на https, то остальные редиректы нужно прописывать во второй секции конфигурационного файла Nginx server {..., в которой упоминаются ssl_certificate.

server {
    #...
    if ($host ~* www\.(.*)) {
        set $host_without_www $1;
        rewrite ^(.*)$ https://$host_without_www$1 permanent;
    }
    location / {
    ...
}

Слеш / на без-слеша

[ред. | ред. код]
server {
   #...
   rewrite ^/(.*)/$ /$1 permanent;
   #...
}

index.html на /

[ред. | ред. код]
    #...
    location / {
        if ( $request_uri ~ "/index.html" ) {
            rewrite ^/(.*)/ /$1 permanent;
        }		
    }
    location /index.html {
        if ($request_uri = /index.html) {
            rewrite ^ $scheme://$host? permanent;
        }
    }	
    #...

*.shtml на *.html

[ред. | ред. код]
server {
       #...
       rewrite ^(.*)\.shtml$ $1.html permanent;
       #...

*.html на /

[ред. | ред. код]
   #...
   location / {
        if ($request_uri ~ ^/(.*)\.html) {
            return 301 /$1;
        }
        try_files $uri $uri.html $uri/ =404;
   }
   #...

Редирект с http на https

[ред. | ред. код]

Прод: в ISPmanager залогиниться под клиента и в узле WWW-домен поставить "Перенаправлять HTTP-запросы в HTTPS".

Бета/dev (нужно, чтобы работали почтовые формы https://api.zina.com.ua/send_form):

в файле etc\nginx\sites\имя.домена.conf добавить:

# Redirect non-https traffic to https
        if ($scheme != "https") {
            return 301 https://$host$request_uri;
        } # managed by Certbot

после сохранения выполнить:

service nginx reload

Редирект URL со слешом в конце на без слеша

[ред. | ред. код]

В .htaccess

 RewriteRule ^(.*)/$ /$1 [L,R=301]

Редирект с домена без www на домен с www

[ред. | ред. код]

Он есть в стандартном .htaccess Drupal. Найдите в этом файле строку RewriteEngine on и ниже нее раскомментируйте блок:

 RewriteCond %{HTTP_HOST} .
 RewriteCond %{HTTP_HOST} !^www\. [NC]
 RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Редирект с домена c www на домен без www

[ред. | ред. код]
RewriteEngine On
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

В nginx — редактируется в ISPmanager под админом: WWW-домены — выбрать домен — кнопка Конфиг, добавить в секцию server:

server {
       ...
       if ($host ~* www\.(.*)) {
         set $host_without_www $1;
         rewrite ^(.*)$ http://$host_without_www$1 permanent;
       }
       ...

Подробнее: Как настроить 301 редирект (redirect) при помощи Nginx на VPS | REG.RU

Другие примеры

[ред. | ред. код]

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

[ред. | ред. код]

1. Самое простое — редирект с одной страницы на другую: в .htaccess пишем:

Redirect 301 /old-file.html http://myserver.com/new-file.html

2. Более сложный вариант, когда сайт переносится, скажем, с одного домена на другой, и при этом сохраняется структура УРЛов:

RewriteEngine ON
RewriteRule ^(.*)$ http://mynewdomain.com/$1 [R=301,L]

Таким образом, если кто-то запрашивает страницу http://domain.com/asdf.html, его будет редиректить (301) на http://mynewdomain.com/asdf.html

3. Если же сайт, к примеру, переносится, а структура УРЛов меняется, то есть смысл использовать следующий метод:

RewriteEngine ON
RewriteRule /.* http://mynewdomain.com/ [R=301,L]

При этом все запросы со старого домена будут вести на главную страницу нового.

4. Еще один интересный момент, если вы хотите изменить разрешение файлов (например, с html на htm):

RedirectMatch 301 (.*)\.htm$ http://сайт.com$1.html

Пример редиректа:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.powerbody.ru$ [NC]
RewriteRule ^(.*)$ http://сайт.ru/$1 [R=301]
RewriteRule ^(index.php)$ http://сайт.ru/ [R=301,L]

преобразует www в без www и index.php в /

Простой редирект (в файле .htaccess или httpd.conf для Apache)

[ред. | ред. код]
Redirect 301 / http://www.you.com/new.htm

где:

  • Redirect 301 - это инструкция, говорящая что страница перемещена
  • / - означает, что все с верхнего уровня сайта, включая все подкаталоги, будет переадресовано
  • http://www.you.com/new.htm - новая страница или сайт (не забывайте поставить последний "/", если переадресация идет на сайт).

Чтобы переадресовать только страницу, сохранив PR старой страницы:

Redirect 301 /old/old.htm http://www.you.com/new.htm

где:

  • /old/old.htm - путь и имя старой страницы

Аналогичный синтаксис для переадресации сайта:

RedirectPermanent / http://www.you.com/

Пример переадресации каталога:

RedirectPermanent /old-directory http://www.domain.com/new-directory/

Например, зашедших в test переадресуем на www.test.com, остальных на enter.test.com (порядок следования записей важен):

Redirect permanent /test    http://www.test.com/
Redirect permanent /        http://enter.test.com/

Примечание: для моих целей (изменение домена) хватило первого варианта простого 301 редиректа.

Использование mod_rewrite (прописывается в файле .htaccess)

[ред. | ред. код]

Ставшая классической задача слияния имена сайта с www и без него, решается так:

Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^yoursite\.com
RewriteRule ^(.*)$ http://www.yoursite.com/$1 [R=permanent,L] . 

или альтернативный синтаксис:

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

Обозначение [R=301,L] означает: перенаправить клиента и отправить ему код статуса 301 (R=301) и сделать это правило последним (L).

Редирект старого домена на новый:

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://www.newdomain.com/$1 [R=301,L]

Например, если необходимо чтобы вместо rewrite.htm загружался файл rewrite.html, добавьте в .htaccess:

RewriteEngine   on
RewriteBase     /
RewriteRule     ^rewrite\.htm$  rewrite.html [R=permanent]

Для замены всех .htm файлов .html файлами:

RewriteEngine  on
RewriteBase     /
RewriteRule     ^(.*)\.htm$  $1.html [R=permanent]

Редирект на PHP

[ред. | ред. код]
<?php
header("HTTP/1.1 301 Moved Permanently");
header("Location: http://www.newdomain.ru/newdir/newpage.htm");
exit();
?>

Лучше указать HTTP/1.1, так как более старые не поддерживают виртуальный хостинг. Не забудьте, что до вызова header, ничего не должно выводиться (например, echo или print). Поэтому этот код лучше ставить в начало php-скрипта. Более полный вариант php редиректа с сохранением передаваемой страницы и параметров вызова:

<?
$ref=$_SERVER['QUERY_STRING'];
if ($ref!=) $ref='?'.$ref;
header('HTTP/1.1 301 Moved Permanently');
header('Location: http://newdomain.com/'.$ref);
exit();
?>

Ссылки

[ред. | ред. код]