Пятница , 19 Апрель 2024
ДомойПубликацииРедирект .htaccess: переадресация на другой домен и перенаправление на другую страницу

Редирект .htaccess: переадресация на другой домен и перенаправление на другую страницу

Доброго воскресного дня!

Очень часто на форумах можно встретить вопросы, посвящённые .htaccess — файлу конфигурации веб-сервера Apache. Основной камень преткновения в том, что при разработке не стояла задача удобной конфигурации для конечного пользователя (в дистрибутив не включена оболочка для визуальных установок с помощью галочек, выпадющих списков и тому подобное), зато администраторы серверов справляются с этой задачей замечательно, довольствуясь «маном» (от команды Linux — man — краткое руководство от разработчиков, или в данном случае — от профессионалов для профессионалов).

В большинстве случаев требуются совсем несложные манипуляции: безусловный редирект на другой сайт, либо перенаправление с одного места в другое (допустим, когда поменялся URL раздела). И каждый человек начинает считать, что уж его-то проблемы точно нигде нет, и даже бесполезно искать решение в интернете и поиске по форуму. Давайте же посмотрим, что эти проблемы таковыми на самом деле не являются.

Редирект .htaccess

Редирект .htaccess: постоянное перенаправление, 301

Подобная штука имеет разные названия. Непонятки может вызвать разве что число — почему же 301? Суть кроется в самом протоколе HTTP, который на запросы клиента отвечает определённым кодом состояния. Код 404 Not Found (Страница не найдена) известен почти всем. Код 200 OK почти не известен, но именно он означает, что всё в порядке и документ будет показан в браузере. А вот код 301 Moved Permanently означает, что документ окончательно перебрался на новый адрес. Именно его и называют чаще всего перенаправлением, хотя общий пул ответов обозначен как — 3xx: Redirection.

У Apache есть несколько возможностей для осуществления редиректов. Модуль mod_rewrite предоставляет отличный механизм работы с перенаправлениями, и в дальнейшем я буду использовать в примерах именно его. В модуле mod_alias тоже имеются директивы для редиректов с определённого адреса или с адреса, который соответствует регулярному выражению:
Redirect permanent / http://newsite.ru/
RedirectMatch permanent .* http://newsite.ru/

Но в mod_rewrite имеются дополнительные возможности для переадресации, поэтому лучше применять (IMHO) его.

В общем случае, для безусловного внешнего (назовём его пользовательским) редиректа, при котором браузер автоматически переадресовывается на другую страницу, обычно незаметно для пользователя (изменяется адресная строка), можно в .htaccess поместить такой код:
RewriteEngine On
RewriteRule .* http://newsite.ru/ [L,R=permanent]

Здесь, первая строка включает механизм модуля mod_rewrite, который позволяется вытворять с адресами всё, что угодно. Назовём это преобразованием URL по условиям на лету. Вторая строка определяет непосредственно правило для преобразования, в примере выше все запросы редиректятся на http://newsite.ru/. В квадратных скобках размещаются флаги: L — последнее (Last) правило, R — тип перенаправления (Redirect), указывается в виде R=code, где code — буквенное или числовое обозначение (permanent или 302).

На самом деле, mod_rewrite — штука очень полезная, ведь именно благодаря этому многие движки активно используют так называемые ЧПУ (Человеку Понятный URL). Если вам незнаком этот термин, поясню на примере. Статья про бесплатные движки для сайта имеет адрес:

https://a-panov.ru/2014/11/free-cms/

Взглянув на этот URL, сразу видно, что статья опубликована в ноябре 2014. Убрав название с заключающим слешем — https://a-panov.ru/2014/11/ — получим список всех публикация за ноябрь. Обычные адреса, вида:

https://a-panov.ru/?p=389

особой дружелюбностью не отличаются. Увидев такой адрес, нельзя сказать о странице, на которую он ведёт, решительно ничего.

Этот способ хорош, когда вам неважно, на какую страницу нового сайта ссылаться. Но если вы переехали на другой домен, то желательно делать редиректы всех запросов с сохранением адресов. Для этого используйте такой код:
RewriteRule ^.*$ http://newsite.ru/$0 [QSA,L,R=permanent]
Новый флаг QSA сохранит так же и параметры, которые можно встретить в адресах после знака вопроса. В уже знакомом примере:

https://a-panov.ru/?p=389

если я размещу в .htaccess код выше, то произойдёт перенаправление на адрес http://newsite.ru/?p=389 чего без данного флага не было бы.

Здесь и дальше я буду опускать директиву включения преобразований:
RewriteEngine On
просто помните: если вы пользуетесь механизмом mod_rewrite, то все условия/преобразования должны выполняться после данной директивы. Для отключения используется такая строка:
RewriteEngine Off
соответственно, для каждого правила нет нужды постоянно «включать» преобразования — это начинает делаться автоматически, сразу после первой директивы.

Как настроить редирект на www (или без www)

Подобные перенаправления требуются для случаев, когда сайт доступен по вариантам nsite.ru и www.nsite.ru, в этом случае поисковики считают их дублями и могут либо самостоятельно выбрать один из вариантов в качестве главного зеркала, либо в поиске будут варианты с обоих доменов. В общем случае, это отрицательный фактор при ранжировании сайта.

Вариант попроще, для одного домена. Перенаправление производится с поддомена www.site.ru на site.ru:
RewriteCond %{HTTP_HOST} ^www\.nsite\.ru$
RewriteRule .* http://nsite.ru/$0 [QSA,L,R=permanent]

Здесь появилась новая директива RewriteCond, которая задаёт условие, при котором должны срабатывать редиректы — правила RewriteRule. Условие, в данном случае, имя домена, соответствующее www.nsite.ru (в регулярных выражения символ точки означает «любой символ», поэтому его желательно экранировать с помощью обратного слеша).

Обратное перенаправление тоже выполнить очень просто:
RewriteCond %{HTTP_HOST} ^nsite\.ru$
RewriteRule .* http://www.nsite.ru/$0 [QSA,L,R=permanent]

Оба варианта рабочие, но у них есть маленький минус — для каждого нового конфига необходимо заменять домен nsite.ru на свой собственный. Нельзя ли сделать уникальный вариант? Легко!

Редирект с любого поддомена www:
RewriteCond %{HTTP_HOST} ^www\.(.*)$
RewriteRule .* http://%1/$0 [QSA,L,R=permanent]

Редирект на поддомен с www:
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* http://www.%{HTTP_HOST}/$0 [QSA,L,R=permanent]

%{HTTP_HOST} — текущий домен

Как создать .htaccess

Такие вопросы тоже возникают. Проблема в том, что стандартный Проводник (приложение в Windows, отвечающее за графический интерфейс) не позволяет создавать файлы, начинающиеся с точки (созданием файлов или папкок осуществляется щелчком правой кнопкой на рабочем столе или в окне, и выбора нужного действия из списка Создать). Но выход есть: открывайте стандартный рекдатор Notepad (блокнот), в меню выбираете Файл → Сохранить как…, и в качестве имени сохраняемого файла указываете .htaccess — после этого он будет создан.

Файл .htaccess не работает

Бывают случаи, когда директивы из файла не работают. Обычно это вызвано тем, что в конфигурации Apache отключена поддержка .htaccess, за что отвечает директива:
AllowOverride none

Обычно это делается, чтобы несколько увеличить быстродействие — в этом случае веб-сервер не производит поиск и разбор .htaccess.

Возможен и такой вариант, что на сервере не используется Apache, например, IIS — основной «гость» на Windows-хостинге. Для уточнения свяжитесь с поддержкой своего хостера.

Есть ли какой-нибудь аналог .htaccess в nginx?

Ещё один довольно частый вопрос. В этом веб-сервера такой возможности нет. Однако, подобное обычно и не требуется. Дело в том, что nginx, как правило, устанавливается в качестве фронденда, т. е. принимает и обрабатывает все запросы, которые либо выполняет сам, либо перенаправляет на бэкенд, роль которого может выполнять Apache, который можно дополнительно конфигурировать с помощью .htaccess.

Рейтинг: 1

Автор публикации

2 070
не в сети 12 месяцев

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (5 голосов, в среднем: 4,80 из 5)
Загрузка...

26 комментариев

  1. Надежда Давыдова

    .htaccess вообще очень помогает, если правильно приописывать в нем директивы. Особенно хорош 301 редирект, который помогает бороться с техническими дублями на сайте.

    Можно вопрос не в тему: ко мне обратились за помощью определить, почему сайт под фильтром.
    Я обнаружила странную вещь: домен склеен, причем сайт открывается по двум адресам на одном хостинге! Как такое могло произойти? Хозяйка понятия не имеет, как она такое накуралесила…
    Вот этот горе-сайт: женщина-счастливая.рф.xsph.ru он же женщина-счастливая.рф

    Рейтинг: 1
    • Тут даже спорить неуместно, редирект 301 — бесподобен smile

      По поводу вопроса. Кому принадлежит сайт xsph.ru? У него создан один из поддоменов (ресурсная запись типа A, которая ведёт на ip, где располагается оригинальный сайт):
      женщина-счастливая.рф
      xn—-7sbbajogrd3arb8cbp1f2a5j.xn--p1ai.xsph.ru

      Возможное решение (привожу для регистратора reg, т. к. домен зарегистрирован там): вывести список своих доменов, жмакнуть на домен xsph.ru, Управление зоной (в подразделе Управление доменом). Там будет что-то типа этого:
      xn—-7sbbajogrd3arb8cbp1f2a5j.xn--p1ai A 141.8.195.81
      женщина-счастливая.рф A 141.8.195.81

      Но это одна часть. Странно ведь, отчего хостинг принимает запрос на другой домен.
      В панели управления хостингом найти прикреплённый домен (поддомен) и удалить его.

      Рейтинг: 1
      • Надежда Давыдова

        Попробую объяснить хозяйке. Я вообще была ошарашена такой странностью. Тем более что сайта xsph.ru вообще не существует

        Рейтинг: 1
        • Надежда, сайта может не существовать, но поддомен прописывается на стороне регистратора (либо сервиса, который предоставляется поддержку dns, это может быть, но не в данном случае, яндекс). соответственно, когда-то давно кто-то решил создать данный поддомен (аж 4 уровня), который до сих пор успешно висит и, возможно, вредит

          Рейтинг: 1
          • Надежда Давыдова

            Я вот и думаю, кому это было нужно: создавать поддомен 4 уровня и склеивать его с нормальным доменом? Получается, бедной женщине впарили типа хороший домен, он вроде бы находится в ЯК… Но я в этом мало понимаю. Ведь и основной домен вроде бы ей принадлежит.

            Рейтинг: 1
            • Возможно, кто-то нашёл древнюю статью и решил попробовать заработать денег.
              Несколько лет назад у Яндекса был интересный глюк: можно было в robots.txt прописать директиву Host, после чего твой сайт становился зеркалом со всеми вытекающими (тИЦ присваивался, как у оригинала). Работай это сейчас, запись в роботсе:
              Host: yandex.ru
              дала бы 270к тица laugh

              На данный момент проблема в том, что на хостинге отрабатывается длиннющий домен 4 уровня. Нужно его удалить из конфигов веб-сервера (где он, скорее всего, подцеплен алиасом). Скорее всего, действовать надо через панель управления хостингом. Если это свой VPS или сервер, то попросить администратора, который настраивал, удалить это из конфигов (или набраться смелости и самостоятельно, с помощью клиента winscp, зайти по SSH и поправить).

              Рейтинг: 1
    • Привет, это никакой не поддомен 4го уровня, это технический домен на хостинге у Спринтхост

      Рейтинг: 2
  2. Надежда Давыдова

    Кнопка твита выдает ошибку…

    Рейтинг: 2
  3. Почему то у меня не работает ((

    Рейтинг: 2
  4. Помогите пожалуйста с дублями! Не могу понять как мне [ R=301, L] сделать. По разному пробовал, но никак. 
    domen-moy.ru/  
    domen-moy.ru/statya/  

    После слеша возможна подстановка поиска      

     ?s=чайник&submit=Поиск   

    Хочу чтобы ссылки могли состоять только из букв нижнего регистра и знака (-)  , и все символы и спецсимволы после слеша редиректили на активную ссылку, Но есть строка поиска после слеша (ее надо исключить чтобы эту строку не обрезало вместе с остальными символами), а внутри строки поиска появляется текст при поиске по сайту, там также условие чтоб только буквы нижнего регистра были, но уже без знака (-).  Сайт на wordpress.

    Рейтинг: 1
    • Ника, здравствуйте!
      Прошу прощения, не понял, что Вы конкретно хотите.
      Правило редиректа для букв нижнего регистра и символа —
      RewriteRule ^([a-z-]+/).+ /$1 [R=301,L]
      Это не работает с параметрами после знака вопроса. Чтобы чекнуть, есть ли в строке запроса хоть что-то, перед RewriteRule добавляется проверка. В итоге, что-то такое:
      RewriteCond %{QUERY_STRING} ^.+
      RewriteRule .* /? [R=301,L]

      Если запрос есть — редирект на главную. Правил можно делать много, выполняются они одно за другим. Не сработало первое, проверяется второе, и т. д.

      Рейтинг: 1
  5. Подскажите, реально ли сделать перенаправление со страницы поиска одного сайта на результаты поиска на другом сайте. Саму страницу поиска перенаправить не проблема, но вот можно ли сделать так, чтобы человеку не приходилось заново вводить данные для поиска.
    Например вот такая у меня задача:
    сайт№1.ру/index.php?route=product/search&search=поисковаяфраза
    Нужно перенаправить на:
    сайт№2.ру/search/?search=поисковаяфраза

    «поисковаяфраза» — любая фраза, которую вводит пользователь на сайте №1

    Рейтинг: 1
    • Алексей, здравствуйте.
      Можно. Пример:

      RewriteEngine on
      RewriteCond %{QUERY_STRING} (|\&)search=([^&]+)
      RewriteRule .* https://yandex.ru/yandsearch?text=%2 [R=301,L]

      Это обрабатывает не только Ваш вариант, но и
      site1.ru/index.php?search=phrase
      и
      site1.ru/index.php?search=phrase2&route=product/search

      Рейтинг: 1
      • То есть нужно вместо фразы подставить %1 ?
        Не отрабатывает что-то (
        Даже Ваш пример если пробовать, пишет — задан пустой поисковый запрос..

        Рейтинг: 2
        • Прошу прощения, второй карман: %2
          Первый — «пусто или амперсанд», используется для других нужд.

          Рейтинг: 1
          • Вот теперь работает. Супер! Спасибо!
            А ещё вот такой хитрый вопрос. Суть в том, что я переезжаю с одного домена на другой и большинство страниц имеет разные адреса, большинству (как с поиском) я прописал правила и конкретные перенаправления. Но остались не задействованые страницы. Как можно сделать, чтобы соблюдалось условие:
            Если в htaccess не прописано правило перенаправление для страницы, то перенаправление должно идти на главную страницу?
            Пока попытки решить этот вопрос приводят к тому, что все страницы направляются на главную, индивидуальные правила игнорируются(

            Рейтинг: 2
            • После всех условий/правил:

              RewriteRule .* http://newdomain.ru [R=301,L]

              Они работают друг за другом. Если ни одно условие/правило не сработало, будет выполняться последнее, с безусловным переходом на главную.
              Это должно быть добавлено в .htaccess на старом сайте.

              Рейтинг: 1
  6. Здравствуйте!
    Если создан новый поддомен вида filial.nekoe_uchrezhdenie.ru и необходимо организовать постоянное перенаправление с него на страницу nekoe_uchrezhdenie/filial, а в каталоге filial.nekoe_uchrezhdenie.ru на хостинге лежит только автоматически созданная хостером страница index.php, и не используется какая-либо CMS, то укладывать .htaccess в практически пустой каталог бесполезно?

    Рейтинг: 1
  7. спасибо большое, решил проблему быстро.

    Рейтинг: 1

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

Политика конфиденциальности

Наш сайт использует файлы cookies, чтобы улучшить работу и повысить эффективность сайта. Продолжая работу с сайтом, вы соглашаетесь с использованием нами cookies и политикой конфиденциальности.

Принять