Принудительное добавление или удаление www в адресе сайта

Список разделов phpBBex 1.x (поддерживается) Мастерская 1.x

Описание: Только готовые решения! Статьи, заметки, моды и другие полезности для phpBBex 1.x и phpBB 3.0.x.
Модератор: Поддержка

Сообщение #1 VEG » 10.10.2012, 12:27

Универсальное решение проблемы постоянных редиректов на домен с или без www при помощи mod_rewrite без привязки к вашему домену. Просто и полезно. Работает на любом домене без необходимости править для каждого сайта. Все способы сохраняют исходный URI, изменяется только домен!

Для работы данного способа у вас в Apache должен быть включён модуль mod_rewrite. Если при добавлении указанных ниже строк вы получаете 500 ошибку — скорее всего дело в отсутствии данного модуля. Также проверьте кодировку: она должна быть UTF-8 без BOM или ANSI. Ещё возможны проблемы с неверным типом перевода строки: он должен быть или Win, или Unix, и ни в коем случае не Mac! Кодировки и перевод строки можно смотреть и настраивать в Notepad++.

Итак, начнём. Для начала открываете (или создаёте новый) .htaccess файл в корне сайта и ищете там следующие строки, если нет — добавляете в конец:
Код: Выделить всё
RewriteEngine On
RewriteBase /
После этих строк нужно вставить нужный вариант правил, описание которых ниже.

Принудительный редирект с субдомена www на обычный (простой способ для HTTP и стандартного порта):
Код: Выделить всё
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,L]

Если ваш сайт работает по HTTPS или на каком-то нестандартном порту, вам пригодится более мощный способ удаления www:
Код: Выделить всё
# В переменную окружения %{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]

Принудительный редирект с обычного домена на субдомен www (простой способ для HTTP и стандартного порта):
Код: Выделить всё
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Для сайтов, доступных по HTTPS или на нестандартных портах также есть возможность принудительного добавления www:
Код: Выделить всё
# В переменную окружения %{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]

Если у вас кривой хостинг, позволяющий открывать сайт с любым количеством www перед доменом (www.www.www.example.com), избавиться от них можно также одним редиректом. Этот код нужно устанавливать вместо указанных выше, а не в дополнение к ним!

Версия с удалением всех www в адресе (для HTTP и стандартного порта):
Код: Выделить всё
RewriteCond %{HTTP_HOST} ^(www\.)+(.*) [NC]
RewriteRule ^(.*)$ http://%2%{REQUEST_URI} [R=301,L]

Версия с сохранением одного www в адресе (для HTTP и стандартного порта):
Код: Выделить всё
RewriteCond %{HTTP_HOST} ^www\.(www\.)+(.*) [NC]
RewriteRule ^(.*)$ http://www.%2%{REQUEST_URI} [R=301,L]

Для исключения возникновения 500 ошибок при отсутствии mod_rewrite можно все инструкции для этого модуля разместить в блоке:
Код: Выделить всё
<IfModule mod_rewrite.c>
# Инструкции для mod_rewrite здесь
</IfModule>

То есть в результате, например, для простого способа удаления www из адреса у вас должно получиться что-то вроде:
Код: Выделить всё
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев


Сообщение #21 VEG » 26.02.2013, 11:46

madbatman, написано же
VEG:Для начала открываете (или создаёте новый) .htaccess файл в корне сайта
Корень — это /, а не /forum/. Впрочем, странно всё равно, что никакого эффекта нет (по идее должно затрагивать каталог форума для редиректов).
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #22 madbatman » 26.02.2013, 15:28

И туда и туда уже кидал - толку ноль.
Писал же ранее - у меня руки кривые!
madbatman M
Аватара
Откуда: Москва
Репутация: 4
С нами: 11 лет 9 месяцев

Сообщение #23 madbatman » 06.03.2013, 12:39

Опять вернусь в эту тему.
Может где ошибка у меня?
Никак не могу победить это WWW

Код: Выделить всё
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.fanbusbabas.ru\.(.*) [NC]
RewriteRule ^(.*)$ http://fanbusbabas.ru/%1%{REQUEST_URI} [R=301,L]

Какие права у .htaccess должны быть?
Вложения
Снимок экрана 2013-03-06 в 13.38.42.png
madbatman M
Аватара
Откуда: Москва
Репутация: 4
С нами: 11 лет 9 месяцев

Сообщение #24 madbatman » 12.03.2013, 15:36

Сработало! Теперь форум в корне лежит, а не /forum/ моментом WWW отцепилось!
madbatman M
Аватара
Откуда: Москва
Репутация: 4
С нами: 11 лет 9 месяцев

Сообщение #25 gcib » 27.07.2013, 09:29

Ещё одна статья на эту тему: Перенаправление домена с www на без www
Там предложен только такой способ:
Код: Выделить всё
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.site\.org\.ua$ [NC]
RewriteRule ^(.*)$ http://site.org.ua/$1 [R=301,L]
Но у меня всё классно работает.
gcib M
Аватара
Откуда: Киев, УССР
Репутация: 0
С нами: 11 лет 7 месяцев

Сообщение #26 VEG » 28.07.2013, 13:12

gcib, недостаток этого способа в том, что вы указываете конкретное название домена в .htaccess. Такой файл нельзя без изменений перенести на другой домен, например.
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #27 Valerka » 12.09.2013, 14:03

Вопрос чуть-чуть не по теме, но близко.
Как известно, многие темы и посты имеют формат "<сайт>/viewtopic.php?f=6&t=11". Как можно сделать, что бы в адресной строке было такое отображение: "<сайт>/6/11" Или так: <сайт>/6&11
И можно ли вообще?
Valerka
Репутация: 9
С нами: 11 лет 2 месяца

Сообщение #28 Sumanai » 12.09.2013, 15:36

Valerka:И можно ли вообще?

Можно сделать что- то похожее, есть СЕО моды, но глюков с ними очень много. Оставьте как есть. Никто давно полностью адрес до страницы не набирает.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #29 Valerka » 12.09.2013, 16:20

никаких модов. Меня больше интересует, хотя бы надпись viwetopic.php выпилить возможно из адресной строки?
Valerka
Репутация: 9
С нами: 11 лет 2 месяца

Сообщение #30 Sumanai » 12.09.2013, 16:29

Valerka:никаких модов.

Такой настройки нет, только модификациями, по сути моды.

Valerka:Меня больше интересует, хотя бы надпись viwetopic.php выпилить возможно из адресной строки?

Нет, без серьёзного переписывания движка.
Забейте, никто не обращает на это внимание.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 9 месяцев

Сообщение #31 hobot-bobot » 12.09.2013, 17:39

Спасибо, очень помогло
hobot-bobot M
Аватара
Откуда: Череповец
Репутация: 23
С нами: 11 лет 7 месяцев

Сообщение #32 Xisp » 13.09.2013, 01:54

Вот такой вопрос- как грамотно организовать перенаправление с http на https версию, сохранив удаление www из имени?
Xisp
Репутация: 9
С нами: 11 лет 7 месяцев

Сообщение #33 VEG » 15.09.2013, 00:03

Xisp, набросал такой код, но не тестировал:
Код: Выделить всё
RewriteCond %{HTTPS} !^on$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #34 Xisp » 15.09.2013, 00:07

Скушала домен :smile:
Xisp
Репутация: 9
С нами: 11 лет 7 месяцев

Сообщение #35 VEG » 15.09.2013, 00:14

Xisp, в смысле? Что было на вход и что получилось?
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #36 Xisp » 15.09.2013, 00:17

В смысле жму на шапку http://мой_домен.ru/index.php получается https://index.php/
Если убрать RewriteCond %{HTTPS} !^on$ [NC,OR] то редирект идёт нормально, куда надо, но только для www.мой_домен.ru --> https://мой_домен.ru
Детали: В заголовке Location значение https:///index.php
Xisp
Репутация: 9
С нами: 11 лет 7 месяцев

Сообщение #37 VEG » 15.09.2013, 00:29

Странно. А так? :) Если не сработает, можно просто вместо %1 в третьей строке указать ваш домен как есть.
Код: Выделить всё
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC,OR]
RewriteCond %{HTTPS} !^on$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #38 Xisp » 15.09.2013, 00:39

VEG:Если не сработает,

Ага, не сработало :smile: Такая же ситуация.

VEG:можно просто вместо %1 в третьей строке указать ваш домен как есть.

Так сработало, но выглядит слегка некрасиво. Хотелось бы идеального решения, на все времена, чтобы последующим админам не пришлось долго думать, что не так. Перфекционизм :smile:
Информация для размышления: если записать вот так:
Код: Выделить всё
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC,OR]
RewriteCond %{HTTPS} ^on$ [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,L]
То есть убрать восклицательный знак перед ^on$ и s из протокола, то редирект идёт нормально, но, само собой, в другую сторону, то есть с https://мой_домен.ru или http://www.мой_домен.ru или https://www.мой_домен.ru на http://мой_домен.ru . Такие дела.
Xisp
Репутация: 9
С нами: 11 лет 7 месяцев

Сообщение #39 VEG » 15.09.2013, 00:58

Xisp, тогда напишите:
Код: Выделить всё
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC,OR]
RewriteCond %{HTTPS} ^off$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
:)
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #40 Xisp » 15.09.2013, 01:14

Ничего не понимаю- не хочет.
Понял, в чём проблема. В рекомендованной для всех случаев строке
Код: Выделить всё
RewriteEngine On
RewriteBase /
Точнее, во второй строке. Последний вариант заработал
Ага, рано радоваться. Варианты http://www.мой_домен.ru и https://www.мой_домен.ru работают как положено, а вот http://мой_домен.ru не пашет :insane: :spy:
Xisp
Репутация: 9
С нами: 11 лет 7 месяцев

Пред.След.

Вернуться в Мастерская 1.x