Избавляемся от www в адресе сайта

    Универсальное решение проблемы постоянных редиректов на домен без www при помощи mod_rewrite. Просто и полезно. Работает на любом домене без необходимости править для каждого сайта. Ранее на хабре видел подобное, но без независимости от доменного имени.
    В корень бросаем файл .htaccess со следующим содержимым:
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    # В переменную окружения %{ENV:PROTOCOL} помещаем протокол
    RewriteRule ^(.*)$ - [E=PROTOCOL:http]
    RewriteCond %{HTTPS} ^on$ [NC]
    RewriteRule ^(.*)$ - [E=PROTOCOL:https]
    # Если нужно убираем www
    RewriteCond %{SERVER_PORT} ^80$
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ %{ENV:PROTOCOL}://%1%{REQUEST_URI} [R=301,L]
    RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
    RewriteRule ^(.*)$ %{ENV:PROTOCOL}://%1:%{SERVER_PORT}%{REQUEST_URI} [R=301,L]
    </IfModule>
    Поделиться публикацией
    Похожие публикации
    Ой, у вас баннер убежал!

    Ну. И что?
    Реклама
    Комментарии 43
    • –2
      Никогда не понимал зачем делают подобные редиректы. Имхо, сайт должен работать и с www, и без.
      Мало ли зачем пользователь ввел в адресную строку адрес с www. Разумеется, www — как правило обычный домен третьего уровня, технически ничем от других третьеуровневых не отличающийся. Но исторически так сложилось, что, например, в оффлайне вместо домена второго уровня указывается домен третьего — www, так люди малознакомые с интернетом лучше понимают что указано имя сайта (особенно если непривычная зона, не .ru).
      • +3
        Я так понимаю, www.server.ru — ведет именно на веб-сервер домена server.ru. Т.е. вроде как там может много всяких услуг предоставляться, а вот услуга web — на www. Это сейчас у нас все равно происходит анализ типа пакетов и перенаправление на нужный сервер (внутри сети). А раньше это мог быть отдельный сервер со своим именем. ИМХО, пережитки старины.
        • 0
          Если под словами «ведет именно на веб-сервер» вы имеете ввиду обслуживание по протоколу http/https, то, как правило, это делается на 80-м порту. А «много всяких услуг» — на других портах. И не важно физически один сервер отвечает запросы по доменам server.ru и www.server.ru или это разные сервера, я лишь говорю о том что сайт должен работать и так и так.
          • –1
            Я в курсе всех дел (портов, протоколов и проч. :) Я имел ввиду, что, возможно, когда компьютеры не были такими мощными, ставили отдельный комп для веб.
            • 0
              То есть, «компы не такие мощные»? ))) У нас вот например для доступа к корпоративной сети стоит роутер. На нем вообще ничего кроме правильно настроенного роутера нет. Второй — собственно веб-сервер, третий — база данных для веб-сервера (БД должна быть отдельно против хакеров), четвертый — гейт для корпоративных не-веб сервисов, скоро будут еще (например, неплохо бы выделить внешний тестовый веб-хостинг на отдельную машину, ломанут — так хоть и бэкапы есть, и нежалко).
              Всё правильно в такой доменной архитектуре! Доменное имя _должно_ редиректиться автоматически на www, если на него зашли с помощью браузера. Это типа мегасемантично, и вообще.
              • 0
                Походу никто внимательно мои комменты не читает. «А раньше это мог быть отдельный сервер со своим именем. ИМХО, пережитки старины.» Я выдвинул предположение, как это могло быть раньше. И почему осталось.

                Сейчас, естественно, должно редиректиться.
                • 0
                  А почему и сейчас не делать отдельный сервер с отдельным именем? Так хотя бы адрес красивый будет, а в плане запоминания и пиара — замечательная вещь.

                  Например, заходишь браузером на ssh.somehost.com, а тебе выводится веб-страничка: чтобы соединиться по протоколу SSH вам нужно позвонить такому-то и такому-то системному администратору и получить пароль, скачать вот эту прогу, и соединиться на ЭТОТ же адрес, но уже по другому протоколу.

                  Или вообще сделать отдельный гейт для подключения по SSH. С собственным именем и внешним ip. Так, чтобы на остальные сервера подсоединиться по SSH было в принципе невозможно.
                  Поэтому, например, если на сервер mailer.somehost.com начинает кто-то стучаться по SSH, то можно смело расценивать это как хакерскую атаку и принимать меры ;) А если на ssh.somehost.com — то всё нормально.
          • –3
            три слова — SEO :)

            для Google www и без два разных url, но так как там один и тот же контент, велика вероятность что страницы будут помечены как копии друг друга и не будут проиндексированы.
            • 0
              Неужели вы думаете что 90% сайтов в интернете не проиндексированы Гуглом, потому что он считает их копиям :)

              Формально это действительно два разных урла. Даже более того — два разных домена. Но Гугл не был бы Гуглом, если бы там сидели такие дураки, не понимающие этой проблемы :)
              • 0
                Вначале Google и Яндекс будут их считать разными сайтами, а потом через некоторое время склеют. У гугла это обычно быстро происходит, а вот Яндекс мешкается иногда даже несколько месяцев, половина сайта видна с www, половина без.
                Для Яндекса можно помочь с выбором и указать что сайты одинаковые, добавив строку с основным доменом:
                Host: site.ru
                в robots.txt
                Но это сразу не подействует, а просто ускорит склейку домена с www или без.
            • 0
              дла того-же Яндекса, к примеру, www.server.ru и server.ru — разные сайты… это разве ничего не значит?
              • –5
                Я не совсем понял что значит у вас «разные сайты». У Яндекса перенаправление с yandex.ru на www.yandex.ru. Яндекс хороший поисковк, замечательная компания, но это не мешает мне считать, что перенаправление это неправильно.

                Кстати, заметьте, что Яндекс делает обратное предложенным автором правилам, кидает на домен с www :)
                • 0
                  Яндекс делает абсолютно правильно. А автор топика копает себе яму — когда-нибудь в неё свалится.
                  • +1
                    Ок. Только поясните, пожалуйста, почему Яндекс делает правильно?
                    • +1
                      Чуть ниже. У Яндекса много сервисов и лишняя головная боль по исследованию того, как куки, выставляемые разными сервисами взаимодествуют между собой и подробные инструкции о том, как через XSS на фотках можно взломать почту — им не нужны. Если вы никогда-нигода-никогда не захотите завести у себя на домене Wiki или Форум — можете перенаправлять на имя без www…
                      • +1
                        Кстати Хабр перенаправляет на http://habrahabr.ru/ — но тут это делается сознательно ибо разные блоги расположены на разных поддоменах, а авторизация — общая. Но это очень сильно ограничивает вас в дальнейшем (глюков конкретно на Хабре, возникших из-за этого решения было уже найдено и пофикшено несколько и, я думаю, ещё будет), так что если вы хотите поступить именно так — делайте это сознательно. Довода «без www короче и красивее» недостаточно…
                        • +2
                          Да, понял, спасибо. Полностью согласен, что для сайтов активно использующих домены третьего уровня, а то и вовсе передающих эти домены в пользование третьих лиц важно иметь именно www.site.ru.

                          Доводы «без www короче и красивее» — это вообще бред, имхо, об этом речь не идет :)
                          Я говорил про то, что набирая адрес сайта я могу набрать его как с www так и без — и должен попасть нормально на сайт. Лишнее перенаправление не есть гуд, если оно лишнее (исключение, когда перенаправление оправдано, — Вы привели).
                • +6
                  На самом деле ответ тривиален до боли. Всё дело в воздушных пузырьках куках. Дело в том, что куки, выданные на имя_домена.com действуют и на www.имя_домена.com и на promo.имя_домена.com и на другие сайты в этом домене. Тем самым разместив что-либо кроме редиректа на имя_домена.com вы связываете себя по рукам и ногам: вы уже никогда не сможете разместить в вашем домене сайт, который для вас делает кто-то другой, вы не сможете разместить там независимый форум или wiki — фактически вы берёте на себе обязанность контролировать в этом домене всё и вся. Не надо так делать — потом боком выйдет!
                  • 0
                    Спасибо за замечание, на самом деле не знал.
                    Однако, набор этих правил понравится поклонникам сайта nowww.ru :)
                    • +1
                      Есть много людей, плохо разбирающихся в безопасности, но считающих себя большими специалистами во всём. Если бы в префиксе www не было бы смысла, то уж наверное такие компании как Яндекс, Гугл и прочие от этого «атавизма» бы отказались.

                      А nowww.ru большой популярностью не пользуется — и слава богу…
                • 0
                  Кстати, ваши правила не совсем уж универсальны. Протокол https, например, не учтен.
                  • +1
                    Спасибо за замечание, не подумал. Сейчас исправлю.
                  • +8
                    Кто-то что-то новое узнал?
                    • 0
                      Я узнал. Использовал редирект, но всегда зависил от конкретного домена — приходилось править всегда ручками. Когда автор выложит исправление для https — буду использовать и у себя.

                      p.s. Web — профессия, а чисто для развлечения и расширения кругозора…
                    • 0
                      Сделал проверку протокола, однако это черновой вариант. Еще вспомнил о том, что может быть указан нестандартный порт (не 80). Окончательный вариант правил напишу позднее, уже пора с работы уходить :)
                      • –6
                        На работе надо РАБОТАТЬ.
                        • +3
                          Вы на время гляньте. Человек скорее всего уже всерхурочно работает. Да и впринципе ничего ему не мешает и в рабочее время для разминки и отвлечения мозгов сделать что-нибудь типа этого.
                          • –4
                            Время не показатель.
                            Сверхурочно? Сидя на хабре целый день при нормальном руководстве можно и на ночь остаться работать.
                            А для отвлечения мозга советую вообще от компа удалиться (кофе/чай с пончиками или болтовня с коллегами).
                            У меня уже почти с десяток контактов в IM лишились работы. Они всё валят на кризис, на начальство, а на самом деле их уволили за разгильдяйство на рабочем месте. Они оказались самым слабы звеном.
                            К автору топика я претензий не имею. Просто высказал своё мнение по поводу занятия на работе посторонними вещами.
                            • +2
                              гораздо полезней вместо калорийных пончиков и пустой болтовни с коллегами почитать интересную статью.
                              • 0
                                Тогда объясните чем пустая болтовня с коллегами отличается от нашей болтавни здесь.
                                А на счёт калорийности пончиков — это был лишь пример.
                                • 0
                                  с удовольствием объясню:
                                  1. не всегда, а скорее в редких исключениях, болтовня на Хабре пустая.
                                  2. аудитория Хабра несравнимо больше количества ваших коллег, а соответственно больше мнений и идей, которые могут быть интересными и полезными для вашего кругозора и развития.
                                  3. неинтересную для вас тему всегда можно пропустить мимо.
                              • 0
                                Если 10 минут посторонних вещей увеличивают в 2 раза продуктивность на ближайший час, то почему бы нет? Яды в малых количествах бывают полезны.
                                • 0
                                  А на счёт этого никто и не спорил.
                        • –4
                          Вы будете смеяться, но до сих пор аходятся сайты, которые без www. вообще не открываются. Доступ к ним можно получить только лишь набрав в адресной строке www.домен.ру.
                        • 0
                          хорошо, а стоит ли тогда насильственно редиректить с сайт.ру на www.сайт.ру?
                          • 0
                            ок, а если надо перебрасывать с site.ru на www.site.ru?

                            через тройное отрицание:
                            RewriteCond %{HTTP_HOST} ^([^w][^w][^w]\.?.*) [NC]
                            RewriteRule ^(.*)$ www.%1/$1 [R=301,L]

                            как-то неспортивно :)
                            • 0
                              RewriteCond %{HTTP_HOST} !^www\. [NC]
                              RewriteRule (.*) www.sitename.ru/$1 [R=301,QSA,L]

                              и не парься…
                              • 0
                                ну так у Вас адрес сайта статично прописан, а автор статьи предлагает универсальный вариант для любого домена.
                                • –1
                                  Автор предлагает обратное направление.
                                  А по поводу универсальности, говносайты строчить? Или трудно один раз написать?
                                  • 0
                                    Прошу прощения, если непонятно написал: хотелось бы универсальное решение для переброса на www с адресов, которые без www. В общем-то, я догадался, что автор предлагает обратное направление, и обозначил свое желание в комментарии выше.

                                    А по поводу универсальности ─ она применяется не только в говносайтах (мне, например, для CMS). Надоело каждый раз генерировать .htaccess из шаблона.
                            • 0
                              Если кому интересно — сделал универсальный набор правил с учетом протокола (http или https) и номера порта (80 или другой).
                              <IfModule mod_rewrite.c>
                              RewriteEngine On
                              RewriteBase /
                              # В переменную окружения %{ENV:PROTOCOL} помещаем протокол
                              RewriteRule ^(.*)$ - [E=PROTOCOL:http]
                              RewriteCond %{HTTPS} ^on$ [NC]
                              RewriteRule ^(.*)$ - [E=PROTOCOL:https]
                              # Если нужно добавляем www
                              RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
                              RewriteCond %{SERVER_PORT} ^80$
                              RewriteRule ^(.*)$ %{ENV:PROTOCOL}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
                              RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
                              RewriteRule ^(.*)$ %{ENV:PROTOCOL}://www.%{HTTP_HOST}:%{SERVER_PORT}%{REQUEST_URI} [R=301,L]
                              </IfModule>
                              • 0
                                *универсальный набор правил для того, чтобы были постоянные редиректы на сайт с www.

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