Доброго воскресного дня!
Очень часто на форумах можно встретить вопросы, посвящённые .htaccess — файлу конфигурации веб-сервера Apache. Основной камень преткновения в том, что при разработке не стояла задача удобной конфигурации для конечного пользователя (в дистрибутив не включена оболочка для визуальных установок с помощью галочек, выпадющих списков и тому подобное), зато администраторы серверов справляются с этой задачей замечательно, довольствуясь «маном» (от команды Linux — man — краткое руководство от разработчиков, или в данном случае — от профессионалов для профессионалов).
В большинстве случаев требуются совсем несложные манипуляции: безусловный редирект на другой сайт, либо перенаправление с одного места в другое (допустим, когда поменялся URL раздела). И каждый человек начинает считать, что уж его-то проблемы точно нигде нет, и даже бесполезно искать решение в интернете и поиске по форуму. Давайте же посмотрим, что эти проблемы таковыми на самом деле не являются.
Редирект .htaccess: постоянное перенаправление, 301
Подобная штука имеет разные названия. Непонятки может вызвать разве что число — почему же 301? Суть кроется в самом протоколе HTTP, который на запросы клиента отвечает определённым кодом состояния. Код 404 Not Found (Страница не найдена) известен почти всем. Код 200 OK почти не известен, но именно он означает, что всё в порядке и документ будет показан в браузере. А вот код 301 Moved Permanently означает, что документ окончательно перебрался на новый адрес. Именно его и называют чаще всего перенаправлением, хотя общий пул ответов обозначен как — 3xx: Redirection.
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).
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]
Как создать .htaccess
Такие вопросы тоже возникают. Проблема в том, что стандартный Проводник (приложение в Windows, отвечающее за графический интерфейс) не позволяет создавать файлы, начинающиеся с точки (созданием файлов или папкок осуществляется щелчком правой кнопкой на рабочем столе или в окне, и выбора нужного действия из списка Создать). Но выход есть: открывайте стандартный рекдатор Notepad (блокнот), в меню выбираете Файл → Сохранить как…, и в качестве имени сохраняемого файла указываете .htaccess — после этого он будет создан.
Файл .htaccess не работает
Бывают случаи, когда директивы из файла не работают. Обычно это вызвано тем, что в конфигурации Apache отключена поддержка .htaccess, за что отвечает директива:
AllowOverride none
Обычно это делается, чтобы несколько увеличить быстродействие — в этом случае веб-сервер не производит поиск и разбор .htaccess.
Возможен и такой вариант, что на сервере не используется Apache, например, IIS — основной «гость» на Windows-хостинге. Для уточнения свяжитесь с поддержкой своего хостера.
Есть ли какой-нибудь аналог .htaccess в nginx?
Ещё один довольно частый вопрос. В этом веб-сервера такой возможности нет. Однако, подобное обычно и не требуется. Дело в том, что nginx, как правило, устанавливается в качестве фронденда, т. е. принимает и обрабатывает все запросы, которые либо выполняет сам, либо перенаправляет на бэкенд, роль которого может выполнять Apache, который можно дополнительно конфигурировать с помощью .htaccess.
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости
продлением хостинга на +1 месяц
.htaccess вообще очень помогает, если правильно приописывать в нем директивы. Особенно хорош 301 редирект, который помогает бороться с техническими дублями на сайте.
Можно вопрос не в тему: ко мне обратились за помощью определить, почему сайт под фильтром.
Я обнаружила странную вещь: домен склеен, причем сайт открывается по двум адресам на одном хостинге! Как такое могло произойти? Хозяйка понятия не имеет, как она такое накуралесила…
Вот этот горе-сайт: женщина-счастливая.рф.xsph.ru он же женщина-счастливая.рф
Тут даже спорить неуместно, редирект 301 — бесподобен
По поводу вопроса. Кому принадлежит сайт 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
Но это одна часть. Странно ведь, отчего хостинг принимает запрос на другой домен.
В панели управления хостингом найти прикреплённый домен (поддомен) и удалить его.
Попробую объяснить хозяйке. Я вообще была ошарашена такой странностью. Тем более что сайта xsph.ru вообще не существует
Надежда, сайта может не существовать, но поддомен прописывается на стороне регистратора (либо сервиса, который предоставляется поддержку dns, это может быть, но не в данном случае, яндекс). соответственно, когда-то давно кто-то решил создать данный поддомен (аж 4 уровня), который до сих пор успешно висит и, возможно, вредит
Я вот и думаю, кому это было нужно: создавать поддомен 4 уровня и склеивать его с нормальным доменом? Получается, бедной женщине впарили типа хороший домен, он вроде бы находится в ЯК… Но я в этом мало понимаю. Ведь и основной домен вроде бы ей принадлежит.
Возможно, кто-то нашёл древнюю статью и решил попробовать заработать денег.
Несколько лет назад у Яндекса был интересный глюк: можно было в robots.txt прописать директиву Host, после чего твой сайт становился зеркалом со всеми вытекающими (тИЦ присваивался, как у оригинала). Работай это сейчас, запись в роботсе:
Host: yandex.ru
дала бы 270к тица
На данный момент проблема в том, что на хостинге отрабатывается длиннющий домен 4 уровня. Нужно его удалить из конфигов веб-сервера (где он, скорее всего, подцеплен алиасом). Скорее всего, действовать надо через панель управления хостингом. Если это свой VPS или сервер, то попросить администратора, который настраивал, удалить это из конфигов (или набраться смелости и самостоятельно, с помощью клиента winscp, зайти по SSH и поправить).
Привет, это никакой не поддомен 4го уровня, это технический домен на хостинге у Спринтхост
Алекс, здравствуйте!
Спасибо за дополнение.
Настолько глубоко хостинги не копал и в их функционирование не вмешивался. Всё оказалось гораздо прозаичнее.
Кнопка твита выдает ошибку…
Ох уж мне эта кнопка твита
Видимо, придётся вообще отказаться, раз она такая…
Спасибо!
Почему то у меня не работает ((
Игорь, на каком сайте?
Уже разобрался, на сервере неправильно были прописаны DNS, добавил запись
A www IP
Чудес не бывает
Помогите пожалуйста с дублями! Не могу понять как мне [ R=301, L] сделать. По разному пробовал, но никак.
domen-moy.ru/
domen-moy.ru/statya/
После слеша возможна подстановка поиска
?s=чайник&submit=Поиск
Хочу чтобы ссылки могли состоять только из букв нижнего регистра и знака (-) , и все символы и спецсимволы после слеша редиректили на активную ссылку, Но есть строка поиска после слеша (ее надо исключить чтобы эту строку не обрезало вместе с остальными символами), а внутри строки поиска появляется текст при поиске по сайту, там также условие чтоб только буквы нижнего регистра были, но уже без знака (-). Сайт на wordpress.
Ника, здравствуйте!
Прошу прощения, не понял, что Вы конкретно хотите.
Правило редиректа для букв нижнего регистра и символа —
RewriteRule ^([a-z-]+/).+ /$1 [R=301,L]
Это не работает с параметрами после знака вопроса. Чтобы чекнуть, есть ли в строке запроса хоть что-то, перед RewriteRule добавляется проверка. В итоге, что-то такое:
RewriteCond %{QUERY_STRING} ^.+
RewriteRule .* /? [R=301,L]
Если запрос есть — редирект на главную. Правил можно делать много, выполняются они одно за другим. Не сработало первое, проверяется второе, и т. д.
Подскажите, реально ли сделать перенаправление со страницы поиска одного сайта на результаты поиска на другом сайте. Саму страницу поиска перенаправить не проблема, но вот можно ли сделать так, чтобы человеку не приходилось заново вводить данные для поиска.
Например вот такая у меня задача:
сайт№1.ру/index.php?route=product/search&search=поисковаяфраза
Нужно перенаправить на:
сайт№2.ру/search/?search=поисковаяфраза
«поисковаяфраза» — любая фраза, которую вводит пользователь на сайте №1
Алексей, здравствуйте.
Можно. Пример:
Это обрабатывает не только Ваш вариант, но и
site1.ru/index.php?search=phrase
и
site1.ru/index.php?search=phrase2&route=product/search
То есть нужно вместо фразы подставить %1 ?
Не отрабатывает что-то (
Даже Ваш пример если пробовать, пишет — задан пустой поисковый запрос..
Прошу прощения, второй карман: %2
Первый — «пусто или амперсанд», используется для других нужд.
Вот теперь работает. Супер! Спасибо!
А ещё вот такой хитрый вопрос. Суть в том, что я переезжаю с одного домена на другой и большинство страниц имеет разные адреса, большинству (как с поиском) я прописал правила и конкретные перенаправления. Но остались не задействованые страницы. Как можно сделать, чтобы соблюдалось условие:
Если в htaccess не прописано правило перенаправление для страницы, то перенаправление должно идти на главную страницу?
Пока попытки решить этот вопрос приводят к тому, что все страницы направляются на главную, индивидуальные правила игнорируются(
После всех условий/правил:
Они работают друг за другом. Если ни одно условие/правило не сработало, будет выполняться последнее, с безусловным переходом на главную.
Это должно быть добавлено в .htaccess на старом сайте.
Здравствуйте!
Если создан новый поддомен вида filial.nekoe_uchrezhdenie.ru и необходимо организовать постоянное перенаправление с него на страницу nekoe_uchrezhdenie/filial, а в каталоге filial.nekoe_uchrezhdenie.ru на хостинге лежит только автоматически созданная хостером страница index.php, и не используется какая-либо CMS, то укладывать .htaccess в практически пустой каталог бесполезно?
Антон, здравствуйте!
Для почти пустого каталога как раз логичнее перенаправлять конфигом веб-сервера, это и быстрее, и правильнее. Незачем каждый раз передавать управление пыху.
спасибо большое, решил проблему быстро.
Иван, здравствуйте.
Рад что статья оказалась полезной. Значит, не зря корпел над ней.