Использование директив файла .htaccess — часть четвертая: редирект, переадресация

Здравствуйте, гости и подписчики блога 4remind.ru. В этой, четвертой части темы «Использование директив файла .htaccess», освещена базовая информация о том, как просто и правильно осуществлять редирект (переадресацию, перенаправление) посетителей сайта, включая и поисковые системы, ну нужные страницы и другие ресурсы.

Базовая переадресация (редирект)

Базовая, самая простая переадресация осуществляется с помощью директивы Redirect. Если вам понадобится перенаправить все запросы, ведущие на главную страницу сайта, на другую страницу или домен, то можно использовать следующую конструкцию:

Redirect 301 / http://vashsait.ru

Таким способом часто пользуются например для редиректа при переносе сайта с одного домена на другой.

В следующем примере все запросы к директории (каталогу) «mycodes» будут перенаправляться на другой каталог:

Redirect 301 /mycodes http://vashsait.ru/src/mycodes

Этот пример показывает, что при запросе страницы items2011.html клиент будет перенаправлен на страницу:

Redirect 301 /items2011.html http://vashsait.ru/items2012.html

Вместо кода «301» в параметрах можно указывать и символическое имя «permanent»:

Redirect permanent /mycodes http://vashsait.ru/src/mycodes

Но все же лучше в параметрах использовать именно код «301», так как именно он наиболее часто используется.

Директиве Redirect можно передавать в качестве кода (кода состояния) любой из диапазона 300-399. Однако в основном используется только четыре из них для того, чтобы сообщить клиенту о том, чем обусловлена или вызвана переадресация.

301 Постоянный редирект. Запрошенному ресурсу назначен новый адрес на постоянной основе. Браузеры и другие клиенты, использующие кэш, должны кэшировать и в будущем использовать именно новый адрес.
302 Времменный редирект. Ресурс перемещен временно. Браузеры и другие клиенты, использующие кэш, НЕ должны кэшировать новый адрес, и в будущем они должны использовать изначальный адрес.
303 Клиент может найти ответ по другому адресу. Причем запрос к альтернативному адресу должен использоваться методом GET. Данный ответ НЕ кэшируется, но сама переадресованная страница может кэшироваться на основании того, что она не является постоянной заменой изначальной страницы.
410 Запрошенная страница или ресурс удален, больше не существует или намеренно недоступен. В ответе с этим кодом переадресованный URL не указывается. Во избежание «недоразумений» на стороне клиента рекомендуется по возможности вместо этого кода использовать код 303.

Пример редиректа с кодом 410:

Redirect 410 /temp/olddoc.html

Для сайтов, которые посещают реальные люди, все же редирект 410 обрабатывать следующим образом:
- создать страницу с информацией о причине удаления страницы или ресурса;
- добавить в .htaccess обработку ошибки 410;

Redirect 410 /temp/olddoc.html
ErrorDocument 410 /error410.html

Таким образом посетитель будет видеть причину или обоснование отсутствия запрошенного им ресурса или страницы.

Регулярные выражения в переадресации

В более новых версиях вэб-сервера Apache в модуле «mod_alias» есть директива RedirectMatch, для которой в качестве параметра исходного URI используется регулярное выражение, что позволяет более гибко составлять редирект. Например, для того, чтобы переадресовать все запросы к файлам с расширениями .xls, .doc, .pdf на другой адрес или вообще другой сервер, можно сделать так:

RedirectMatch (.*)\.(xls|doc|pdf)$ http://docs.archives.org/$1.$2

Что-то подобное многие из вас уже наверно встречали в статье Счетчик скачиваний файлов на PHP с применением htaccess и MySQL, правда там использовалась директива «RewriteRule», о которой речь пойдет в следующей части об использовании директив файла .htaccess.

Заключение… Простота базовой переадресации (редиректа) заключается в том, что для нее используется модуль «mod_alias», который как правило подключен изначально в конфигурации сервера Apache и нет необходимости подключать дополнительный модуль «mod_rewrite», требующий больше ресурсов на стороне сервера.

Метки: apache, htaccess, директива, переадресация, редирект, сервер

Поделитесь материалом с другими, воспользуйтесь этими кнопками:
Получать обновления и новые материалы блога по E-mail

36 комментариев к “Использование директив файла .htaccess — часть четвертая: редирект, переадресация”

  1. Natalia:

    Мне нужно сделать редирект,но увы,не поняла,как и где прописать необходимые директивы.Такой уж я чайник

  2. Вит:

    «mod_alias» и «mod_rewrite» — какова в разнице нагрузка на сервер этими модулями? Насколько первый экономит ресурсы сервера? Спасибо

    • Вит, «mod_rewrite» по сравнению с «mod_alias» просто монстр (в хорошем смысле этого слова), обладающий гораздо большей гибкостью и функциональностью.
      Разницу в нагрузке на сервер этими модулями определенно сказать невозможно, так как все зависит от «железа», конфигурации, посещаемости сервера, а так же от количества и разнообразия используемых директив в .htaccess и httpd.conf.
      Одно можно точно сказать, что при работе модуль «mod_rewrite» занимает гораздо больше памяти, больше нагрузки на процессор и больше времени выполнения, чем модуль «mod_alias».

  3. Azarchick:

    Я встречала пока что только 301 (подавляющее бол-во) и 302 редиректы. Полезные штуки)
    И, кстати, каким обычно смотришь тулом http заголовки?

    • Смотрю с помощью «Firebug» (плагин для браузеров) или «Fiddler Web Debugger» (самостоятельное приложение, очень его рекомендую: http://www.fiddler2.com/fiddler2/)

      • Azarchick:

        Firebug пользуюсь постоянно) А так смотрю с помощью internetofficer.com/seo-tool/redirect-check/ :)

  4. artis72:

    Может кто подскажет, что лучше для нового сайта 301 редирект с дублирующей страницы или ее запрет в robots.txt

    • Можно к примеру временно поставить 301-й редирект и спустя какое-то время вообще удалить дублирующую страницу, и одновременно (или уже после) в вэб-мастерах (Google и Яндекс) дополнительно через соответствующую форму запретить индексирование страницы-дубликата.

  5. rza2008:

    А я так и не разобрался с такими тонкостями :(

  6. Андрей:

    у меня только 301 стоит. не знаю достаточно ли.

  7. Lidia:

    А так можно?
    RewriteCond %{QUERY_STRING} ^(.*)$ [NC]
    RewriteRule ^album-download-musik/(.*)?$ /404.shtml [R=410,L]
    В принципе эта директива отдает 410 страницу, вот только не пойму это редирект как 301 или это все таки правильная отдача 410 страницы

    • Lidia, ответ с кодом 410 иногда называют косвенным редиректом, который говорит о том, что какой-то ресурс по такому-то адресу раньше был, но на данный момент отсутствует (возможно временно) и возможно может появиться вновь, поэтому лучше всего запросы перенаправлять на страницу с информацией о 404-й ошибке, что собственно и сделано в вашем примере.

  8. Lidia:

    Я ка бы думала что 410 не редирект и редирект бывает только 301 и если даже пренапровлять на страницу 404 через 301 то это будет все равно считаться 301 редиректом
    Зашла в панель Гугла страницы с 410 так и остались Гугл их не удалил из индекса почему то

    • Lidia, Гугл со временим удалит их из индекса (это может произойти примерно через месяц, а может и позже), если Вы конечно уже убрали перенаправление с 410-м кодом. А Гугл добавлял страницы в индекс потому, что реально страница у Вас существовала (ведь у Вас была реальная страница 404.shtml), даже хоть и была она с информацией о том, что страница не найдена.

      • Lidia:

        Ну пусть будет так, теперь я сделал что редиректа нет на создану 404 страницу а теперь выходит обычная 410 белая страница с предупреждением так нормально то есть правильно?
        Вот пример моей страницы которая отдает 410
        _http://lekud.com/component/jdownloads/viewdownload/27/72

  9. Lidia:

    Тот код что я описала выше редирект на 410 страницу правильно?

    • Lidia, тот код может редиректить куда вам пожелается, но с кодом сообщения #410 для браузера.
      Если же Вам нужно что-то редиректить, то лучше бы использовать 301-й редирект.
      Вы бы объяснили зачем Вам это нужно сейчас и тогда было бы проще понять в чем проблема и дать вам совет. Да, и еще, было бы неплохо узнать, что сейчас у Вас в RewriteCond и RewriteRule прописано (в файле .htaccess, если это конечно не конфиденциальная информация).

  10. Lidia:

    Вобщем у меня дубли развелись очень много тысячи и делать для каждой 301 редирект просто невозможно так я сделала просто общее для определенных адресов 410 страницу, то есть адреса в которых присуствет вот эта строка component/jdownloads/ вели на 410 страницу
    Вот полный код

    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteCond %{QUERY_STRING} ^(.*)$ [NC]
    RewriteRule ^component/jdownloads/(.*)?$ /410.shtml [R=410,L]

    Страницы 410.shtml физически не сосуществует но в коде она присутствует если вы обратили внимание так как без этой строчки код не работает но она не мешает
    И мне было важно узнать можно ли делать 301 редирект на страницу 410

    Я выше привела пример адрес сайта который ведет на 410 страницу, главное что бы 410 страница была правильная то есть Гугл примет 410 страницу пусть она даже выдается через 301 редирект вот что главное для меня

    • 301-й редирект можно делать практически куда угодно, и неважно какое имя будет у страницы, на которую идет перенаправление. То есть по вашему примеру можно смело делать так:

      RewriteRule ^component/jdownloads/(.*)?$ /410.shtml [R=301,L]

      или так:

      RewriteRule ^component/jdownloads/(.*)?$ /myredirect.shtml [R=301,L]

      В этих случаях запросы по адресам «component/jdownloads/(.*)?» будут перенаправлены на страницу 410.shtml или во втором случае на myredirect.shtml

      Только я бы Вам не рекомендовал делать редирект на страницы, которых физически не существует, иначе браузеру будет отправляться код статуса 404, говорящий ему о том, что страница реально не найдена.

  11. Lidia:

    Но вы можете посмотреть выше я привела ссылку сайта аддреса он ведь ведет на 410 страницу?
    _http://lekud.com/component/jdownloads/viewdownload/27/72
    Вот тут выше вы меня поняли что я имела виду если перейти по этому адресу то редирект ведет на 410 страницу и я никак не пойму браузер показывает 40 страницу а вот Гугл ли примет такой ответ сервера
    Вы бы не могли сказать с тем кодом что я привла выше это нормальная страница 410 или нет

    Вот этот код не работает
    1 RewriteRule ^component/jdownloads/(.*)?$ /410.shtml [R=301,L]

    или так:
    1 RewriteRule ^component/jdownloads/(.*)?$ /myredirect.shtml [R=301,L]

  12. Lidia:

    Еще хотела сказать в моем случаее 301 редирект не пойдет так как дублей более тысячи и когда слишком много 301 страниц то Гугл может это посчитать манипуляцией и послать сайт с сопли это точно такое произошло с другим моим сайтом Гугл отправил его в сопли потому что слишком много 301 страниц было они прямо так и написали мне
    А Все это из за того что у Joomla проблема с дублями если вы знаете

    • Lidia, если для Вас неприемлем множественный редирект, то думаю Вам в таком случае лучше провести оптимизацию файла robots.txt и там запретить для индексации дублирующие пути (ссылки).

  13. Lidia:

    Это уже интересно, пожалуста не могли бы подсказать как через robots.txt запретить для индекса дубли если их несколько тысячь а то незнаю что делать с ними

    • Lidia, приведите пример ваших ссылок, которые являются дублями. Например так:
      страница _http://sait.ru/zametki/zametka1.html является дублем
      страницы _http://sait.ru/2013/03/zametka1.html и так далее.

      Лучше несколько таких примеров и тогда сможем точнее определиться с тем, что нужно будет прописать в robots.txt

  14. Lidia:

    Вот дубли
    _http://lekud.com/component/jdownloads/viewdownload/29/35
    _http://lekud.com/jdownloads/viewdownload/viewdownload/29/35
    Но я как выше писала я сделала редирект через htaccess на 410 страницу и меня смущает то что 410 страница выдается через редирект и сам вопрос считается ли правильной страница 410 если она через 303 редирект
    Вот этот код который я применила для редиректа
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteCond %{QUERY_STRING} ^(.*)$ [NC]
    RewriteRule ^component/jdownloads/(.*)?$ /410.shtml [R=410,L]

    А через robots.txt нужно каждый адрес исключать отдельно из индекса что не легко потому что дублей тысячи

    • Если дублями считаются эти страницы и им подобные
      _http://lekud.com/component/jdownloads/viewdownload/29/35
      _http://lekud.com/jdownloads/viewdownload/viewdownload/29/35

      то Вы можете прописать в robots.txt:

      Disallow: /component/jdownloads/viewdownload/

      или

      Disallow: /component/jdownloads/

      тогда все страницы из выше указанных каталогов будут исключаться из индекса, т.е. если у Вас тысячи дублей из каталога и подкаталогов /component/jdownloads/…, то не придется ничего, кроме одной строчки в robots.txt прописывать.

  15. Lidia:

    Немного перепутала написала 303 редирект, хотела написать вообще считается ли правильной 410 страница если ссосна через редирект или сервер обрабатывает 401 страницу как то иначе, дело в том что Гугл до сих пор не убрал из индекса дубли страниц хотя месяц примерно.

    • Lidia, я бы посоветовал Вам вообще не использовать 410-й редирект (косвенный он). Используйте для редиректа всегда 301-й. А про дубли я вам ответил на ваш предыдущий комментарий. Google же может вообще не выбросить из индекса страницы с редиректом, пока Вы не запретите их либо в robots.txt, либо через Google-вебмастер: Ваш сайт -> Оптимизация -> Удалить URL-адреса.

  16. Lidia:

    Через панель вебмастера удилть URL-адреса начала удалять дубли потом пришло письмо от Гугл где написано было что этой опцией нужно пользоваться в крайнем случаее из если я еще буду таким способом удалять достаточно много адресов то они это воспримут как манипуляция поисковиком из за этого могу получить штрафные санкции так что опцией URL-адреса нельзя часто использоваться

    Спасибо за подсказку robots.txt попробую сделать так
    Как вы думаете а не может быть так что весть компонент из за это перестанет индексировать даже с адресами которые мне нужна нпример вот такие _http://lekud.com/jdownloads/viewdownload/viewdownload/29/35 ведь это адрес этого жен кмопонента?
    Или запрет будет распостронять стого на те адеса в котоых есть вот это
    /component/jdownloads

  17. Lidia:

    Спасибо так и сделаю
    Сеня зашла на сайт вместо исключение из индекса добавились еще дубли странно

  18. Alex:

    Поставил редирект на мобильную версию стиля при заходе с мобильного устройства.
    Вот пример:

    RewriteCond %{HTTP_USER_AGENT} (android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge\ |maemo|midp|mmp|mobile.+firefox|netfront|opera\ m(ob|in)i|palm(\ os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows\ (ce|phone)|xda|xiino [NC,OR]
    RewriteCond %{HTTP_USER_AGENT} ^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a\ wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r\ |s\ )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1\ u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(\ i|ip)|hs\-c|ht(c(\-|\ |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(\ |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(\ |\/)|klon|kpt\ |kwc\-|kyo(c|k)|le(no|xi)|lg(\ g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|\ |o|v)|zz)|mt(50|p1|v\ )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v\ )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|\ )|webc|whit|wi(g\ |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-) [NC]
    RewriteRule ^$ http://Мобильный стиль [R,L]
    

    Редирект работает нормально, НО только с главной страницы сайта. С остальных страниц переход не осуществляется. Может кто знает как это можно поправить, что-бы переход был со всех страниц?

    • Alex, попробуйте для начала сократить запись в RewriteCond %{HTTP_USER_AGENT} до одной, например только для агента «android» и проверьте именно с android-устройства или имитируйте юзер-агента, так будет легче обнаружить проблему:

      RewriteCond %{HTTP_USER_AGENT} android [NC]
      

      • Alex:

        Попробовал. Ничего нового. Только на андройде тоже перенаправляет только с главной.

        Ответить

Оставить комментарий к Владимир

Уважаемые посетители, пожалуйста, пишите осмысленные и исчерпывающие комментарии. Короткие фразы типа «спасибо автору», «возьму на заметку», «мне помогло» и т.п. будут удаляться. Исключение, когда Вы отвечаете на чей-то вопрос или благодарите за помощь.

Ссылки на Ваш сайт получат статус DoFollow после третьего комментария.

Для вставки кода в комментарии можно использовать BB-коды:
[text] [/text], [php] [/php], [html] [/html]

Подписаться на обновления блога 4remind.ru по RSS
Новости блога в социальных сетях

4remind.ru - персональный блог вебмастера



Наверх
Наверх