Принудительное добавление или удаление 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 месяцев

Сообщение #2 pisikot » 10.10.2012, 12:31

Вчера как раз искал инфу по этому поводу)
pisikot M
Аватара
Откуда: Россия
Репутация: 43
С нами: 12 лет 1 месяц

Сообщение #3 Dbonz » 10.01.2013, 07:10

Здравствуйте уважаемый VEG!

А как лучше склеить index.php с корнем, в самом index.php или через .htaccess применительно к phpBBex?
И надо ли это делать?
Dbonz
Гость

Сообщение #4 VEG » 10.01.2013, 09:45

Dbonz, делать это не обязательно — форум на главной странице указывает Canonical URL без index.php, соответсвенно поисковики должны игнорировать вариант с index.php.
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #5 Dbonz » 10.01.2013, 10:22

Благодарю! Буду знать.
Dbonz
Гость

Сообщение #6 factotum » 10.01.2013, 17:07

VEG:Также проверьте кодировку: она должна быть UTF-8 без BOM или ANSI. Ещё возможны проблемы с неверным типом перевода строки: он должен быть или Win, или Unix, и ни в коем случае не Mac!
Вчера потерял на два часа жизни на детской ошибке.
на локальном сервере (Win) htaccess в UNIX ANSI. Заливаю на сервер через FileZilla - апач не подхватывает большую часть директив. Проверяю строчку за строчкой - все верно. Заливаю снова - не работает. И так по кругу. Вопрос решился случайно - оказалось, FileZilla выкрутила исходные UNIX ANSI на Windows ANSI. Смена фтп-менеджера решила вопрос.
factotum
Откуда: Люксембург
Репутация: 234
С нами: 12 лет 7 месяцев

Сообщение #7 Валентин » 10.01.2013, 23:36

Буквально позавчера искал такую информацию, по коррекции www через http быстро нашел, а вот вариант с https так и не нашел (да еще и без указания полного доменного имени), вобщем - респект!

Добавлено спустя 3 часа 13 минут 13 секунд:
А еще такой вопрос, не подскажите, как правильно редиректить сайт с корня в папку?
В том смысле, что стоит на сайте только форум (в папке /forum/) и хотелось бы все запросы, вида "http://сайт/что-то" переправлялись бы на "http://сайт/forum/что-то" (по-максимуму без указания полного доменного имени в файле .htaccess)...
Валентин
Репутация: 21
С нами: 11 лет 10 месяцев

Сообщение #8 VEG » 11.01.2013, 09:57

Валентин, вы можете просто в корне создать файл index.php в корне с таким содержанием:
Код: Выделить всё
<?php
define('PHPBB_ROOT_PATH', './forum/');
include('./forum/index.php');
В результате главная страница будет открываться и по адресу без /forum/ и без редиректов. На phpbbex.com сделано именно так.
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #9 Валентин » 11.01.2013, 13:21

Это решение ничем не отличается от конструкции в .htaccess
Код: Выделить всё
Redirect 301 /index.php /forum/
Вопрос касался передачи всего в папку, например, чтобы запрос mysite/sitemap переадресовывался в mysite/forum/sitemap, запрос mysite/allurl на mysite/forum/allurl для всех запросов, а не только index.php
Валентин
Репутация: 21
С нами: 11 лет 10 месяцев

Сообщение #10 prebbex » 12.01.2013, 19:12

у вас корень ни для чего не предназначен? -- может просто перенести файлы самого форума? проще будет.
Переносил так:
  1. копия /forum/ в root;
  2. переназначение в админке местоположения форума (на главной слева настройки сервера, изменить путь к конференции на ковый);
  3. сброс кеша;
  4. удаление /forum/ (переименовывал, на всякий)
на phpbb3.0.10 -- никаких проблем не было

Добавлено спустя 16 минут 12 секунд:
VEG, у меня такая проблема.
Официальный форум и провайдер отказываются помочь, пишут глупейшие советы для десятиклассика...
Наблюдается на phpbb 3.0.10 и на вашем последнем (номер забыл). Хостинг один, один сервак, разные домены.
При автоматическом редиректе, ну, при входе например и при входе в админку -- всегда, иногда после отправки сообщения тоже, идет редирект с защищеного соединения на незащищенное, и также при нажатии на ссылку перейти. Если кликать ссылку админка, главная, список форумов, идет защищенный редирект. На вашем движке, с задержкой 0 секунд даже этого нет (не привил). В коде всегда ссылка сайта подставляется как "./" из переменной. Или она где-то переназначается на абсолютную?

Добавлено спустя 1 минуту 15 секунд:
(необходит защищенный редирект без включения принудительного протокола)
prebbex M
Откуда: интерда
Репутация: 12
С нами: 11 лет 10 месяцев

Сообщение #11 Валентин » 12.01.2013, 21:01

prebbex:у вас корень ни для чего не предназначен? -- может просто перенести файлы самого форума?
Предназначен для собственно сайта/портала... в будущем, поэтому переносить не вариант.
Валентин
Репутация: 21
С нами: 11 лет 10 месяцев

Сообщение #12 prebbex » 12.01.2013, 21:05

а смысл тогда? поисковики обидятся ведь

Добавлено спустя 36 секунд:
для них это будет переносом и сменой всех (или многих) ссылок

Добавлено спустя 4 минуты 17 секунд:
htaccess
Код: Выделить всё
Redirect 301 / /forum/
prebbex M
Откуда: интерда
Репутация: 12
С нами: 11 лет 10 месяцев

Сообщение #13 VEG » 12.01.2013, 22:37

prebbex:Redirect 301 / /forum/
Этот вариант по идее не должен работать (цикл).
Для одного из своих форумов я написал такой вариант:
Код: Выделить всё
RewriteRule ^/?(viewtopic.*)$ /forum/$1 [R=301,L]
RewriteRule ^/?(viewforum.*)$ /forum/$1 [R=301,L]
RewriteRule ^/?(faq.*)$ /forum/$1 [R=301,L]
RewriteRule ^/?(search.*)$ /forum/$1 [R=301,L]
Редирект задан не для всех возможных урлов специально — таким образом мы сохраняем возможность загрузить какие-нибудь файлы в корень и открывать их по ссылке.
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #14 prebbex » 12.01.2013, 22:54

ну да, не запустилось, но и ваш не работает, VEG

Добавлено спустя 3 минуты 45 секунд:
нет, глюкнуло, работает
prebbex M
Откуда: интерда
Репутация: 12
С нами: 11 лет 10 месяцев

Сообщение #15 VEG » 12.01.2013, 23:09

prebbex:но и ваш не работает
Скорее всего вы просто забыли добавить инструкции включения mod_rewrite, что описано в первом сообщении:
Код: Выделить всё
RewriteEngine On
RewriteBase /
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #16 prebbex » 12.01.2013, 23:17

нет, без обертки
<IfModule mod_rewrite.c>
# Инструкции для mod_rewrite здесь
</IfModule>
не заработало
prebbex M
Откуда: интерда
Репутация: 12
С нами: 11 лет 10 месяцев

Сообщение #17 madbatman » 25.02.2013, 20:25

:fie:
Не получается.
mod_rewrite на хостинге RU-CENTER есть.
Снимок экрана 2013-02-25 в 21.20.27.png

Новый создавал .htaccess файл в корне сайта .
Понимаю, что руки у меня кривые, а ведь так хотелось WWW убрать.
madbatman M
Аватара
Откуда: Москва
Репутация: 4
С нами: 11 лет 9 месяцев

Сообщение #18 Andrey1990 » 25.02.2013, 21:35

madbatman, проверьте чтобы кодировка файла .htaccess была "utf-8 (без BOM)".
У меня для удаления www на всём сайте исправно работает такой вариант (домен только на свой замените):
Код: Выделить всё
 Options +FollowSymLinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^www.prog-portal\.ru$ [NC]
RewriteRule ^(.*)$ http://prog-portal.ru/$1 [R=301,L]
Andrey1990 M
Откуда: Воронеж
Репутация: 0
С нами: 11 лет 11 месяцев

Сообщение #19 VEG » 25.02.2013, 23:26

madbatman, у меня тоже хостинг на nic.ru :) Вообще эти инструкции универсальны и должны работать на всех хостингах. Скорее всего вы что-то не так сделали.
VEG M
Автор темы, Администратор
Аватара
Откуда: Finland
Репутация: 1668
С нами: 12 лет 7 месяцев

Сообщение #20 madbatman » 26.02.2013, 08:39

Andrey1990:madbatman, проверьте чтобы кодировка файла .htaccess была "utf-8 (без BOM)".

Сделал так как у вас:
Код: Выделить всё
Options +FollowSymLinks
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.fanbusbabas\.ru$ [NC]
RewriteRule ^(.*)$ http://fanbusbabas.ru/$1 [R=301,L]
Снимок экрана 2013-02-26 в 9.32.47.png
Снимок экрана 2013-02-26 в 9.32.47.png (29.49 КБ) Просмотров: 31268

Сам файл сюда кидаю:

Правая колонка папка /forum/ на хостинге, WWW не пропадает. :fie:
Вложения
Снимок экрана 2013-02-26 в 9.29.55.png
madbatman M
Аватара
Откуда: Москва
Репутация: 4
С нами: 11 лет 9 месяцев

След.

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