Марат-блог
Услуги по продвижению и разработке сайта
Отправить заявку
Заказать обратный звонок

Спасибо, Ваша заявка принята.

В ближайшее время менеджер свяжется с Вами.

Главная » DEV » Варианты реализации Редиректа с помощью файла .htaccess
Варианты реализации Редиректа с помощью файла .htaccess
Программирование
1130
12 июля 2015

Варианты реализации Редиректа с помощью файла .htaccess

  1. Простой редирект:
    Redirect 301 / http://www.domainname.ru/
    
    или
    redirect /secret http://www.site.ru/nosecret
    
    Ставится в файле .htaccess или httpd.conf для Apache. Первый "/" означает, что всё с верхнего уровня сайта, включая все подкаталоги, будет переадресовано (не забывайте поставить последний "/"). Если Вы хотите переадресовать только страницу, сохранив PR старой страницы, можно сделать так:

    Redirect 301 /old/old.htm http://www.you.ru/new.htm где:
    /old/old.htm - путь и имя старой страницы 
    http://www.you.com/new.htm - новый путь и новое имя перемещенной страницы 

  2. Редирект на любую страницу по ip пользователя или при запросе конкретной страницы (а также по маске имени).
    Если у пользователя ip 192.152.37.125, то он будет перенаправлен на страницу user.php:
    SetEnvIf REMOTE_ADDR 192.152.37.125 REDIR="redir"
    RewriteCond %{REDIR} redir
    RewriteRule ^/$ /user.php
    
  3. Редирект при запросе определённых файлов. Если запрашиваются файлы, расширение которых не указано в файле .htaccess (gif и jpg), то следует перенаправление:
    RewriteEngine On
    RewriteRule !.(gif|jpg)$ index.php
    
  4. Использование mod_rewrite:
    Options +FollowSymLinks
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^yourdomain\.ru
    RewriteRule ^(.*)$ http://www.yourdomain.ru/$1 [R=permanent,L]
    
  5. Редирект с регулярным выражением:
    RedirectMatch 301 (.*) http://www.yourdomain.ru$1 Прописывается в файле .htaccess.
    
    (.*) RedirectMatch фактически соответствует регулярным образцам выражения после доменного имени. Таким образом, нельзя выполнить соответствие образца на ^/yourdomain.ru. Однако, можно преобразовать страницы с использованием .html расширения к файлам того же самого названия, но с .php расширением:
    RedirectMatch 301 (.*)\.html$ http://www.yourdomain.ru$1.php
    
    Если необходимо сделать различное перенаправление для отдельных страниц, можно использовать следующее:
    RedirectMatch Permanent ^/html/resources.html$ http://www.newdomain.com/resources.php
    RedirectMatch Permanent ^/html/other_page.html$ http://www.newdomain.com/other_page.php
    RedirectMatch Permanent ^/(.*)$ http://www.newdomain.com/
    
    "RedirectMatch Permanent" - это эквивалент "RedirectMatch 301", строка с "*(Wildcard)" должна быть последней в этом списке. 

  6. Создание удобо читаемых URL
    Чтобы преобразовать, например, www.site.ru/product.php?id=123 в www.site.ru/product/123 следующим образом:
    RewriteEngine on
    RewriteRule ^product/([^/\.]+)/?$ product.php?id=$1 [L]
    
    В следующем примере преобразуем www.site.ru/script.php?product=123 в www.site.ru/cat/product/123/:
    RewriteRule cat/(.*)/(.*)/$ /script.php?$1=$2
    
  7. Редирект на PHP:
    header("HTTP/1.1 301 Moved Permanently");
        header("Location: http://www.newdomain.ru/newdir/newpage.htm");
        exit();
    Естественно, надо создать страницу, при обращении к которой и будет происходить Редирект, и разместить её на сервере. И лучше укажите HTTP/1.1 (а не HTTP/1.0 или HTTP/0.9, которые не поддерживают виртуальный хостинг) 

  8. Редирект всех файлов в папке на один файл.
    Например вы больше не нуждаетесь в разделе сайта Super discount и хотите перенаправить все запросы к папке /superdiscount на один файл /hot-offers.php. Для этого добавляем в .htaccess следующий код.
    RewriteRule ^superdiscount(.*)$ /hot-offers.php [L,R=301]
    
  9. Редирект всей папки кроме одного файла
    В следующем примере все файлы из папки /superdiscount будут редиректится на на файл /hot-offers.php, КРОМЕ файла /superdiscount/my-ebook.html котоый должен редиректится на /hot-to-make-million.html
    RewriteRule ^superdiscount/my-ebook.html /hot-to-make-million.html [L,R=301]
    RewriteRule ^superdiscount(.*)$ /hot-offers.php [L,R=301]
    
  10. Редирект динамического URL на новый файл.
    Данный вариант пригодится если вы хотите редиректить динамический URL с параметрами на новый статический файл.
    RewriteRule ^article.jsp?id=(.*)$ /latestnews.htm [L,R=301]
    
    То есть теперь, запрос к файлу вида http://www.kass.ws/article.jsp?id=8632 и/или http://www.kass.ws/article.jsp?id=1245 будет отправлен на файл http://www.kass.ws/latestnews.htm.

  11. Массовый редирект новых файлов.
    Тепепь перейдем к самому сложному моменту, когда вам надо редиректить массу URL-ов, например после смены вашей CMS. Тут сразу возникает ряд проблем. Во-первых, внесение всех изменившихся адресов в .htaccess файл займет очень много времени, да и само по себе занятие малоприятное. Во-вторых, слишком много записей в .htaccess файле будут тормозить Apache сервера. И в третьих, при внесении такого количества информации высока вероятность, что вы где то ошибетесь. По этому, самый лучший выход, это нанять програмиста который вам напишет динамический редирект.
    Нижеприведенный пример написан на PHP, но так же может быть выполнен на любом языке. Предположим вы перешли на новую систему ссылок на вашем сайте и все файлы оканчивающиеся на старый id должны быть средирекчены. Сначала создаем в базе таблицу, которая содержит старый id и новый URL для редиректа. old_id INT new_url VARCHAR (255) Далее пишем код который свяжет ваши старые id с новыми URL-ами
    После этого, добавляем следующую строчку в .htaccess:
    RewriteRule ^/product-(.*)_([0-9]+).php /redirectold.php?productid=$2
    
    затем создаем PHP файл redirectold.php, который будет поддерживать 301 редирект:
    <?php
    function getRedirectUrl($productid) {
    // Connect to the database
    $dServer = "localhost";
    $dDb = "mydbname";
    $dUser = "mydb_user";
    $dPass = "password";
    
    $s = @mysql_connect($dServer, $dUser, $dPass)
    or die("Couldn't connect to database server");
    
    @mysql_select_db($dDb, $s)
    or die("Couldn't connect to database");
    
    $query = "SELECT new_url FROM redirects WHERE old_id = ". $productid;
    mysql_query($query);
    $result = mysql_query($query);
    $hasRecords = mysql_num_rows($result) == 0 ? false : true;
    if (!$hasRecords) {
    $ret = 'http://www.yoursite.com/';
    } else {
    while($row = mysql_fetch_array($result))
    {
    $ret = 'http://www.yoursite.com/'. $row["new_url"];
    }
    }
    mysql_close($s);
    return $ret;
    }
    
    $productid = $_GET["productid"];
    $url = getRedirectUrl($productid);
    
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: $url");
    exit();
    ?>
    

    Теперь все запросы к вашим старым URL-ам будут вызывать redirectold.php, который найдет новый URL и вернет 301 ответ с вашей новой ссылкой.