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

Board index phpBBex 1.x Мастерская

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

Post #1by VEG » 10.10.2012, 12:27

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

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

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

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

Если ваш сайт работает по HTTPS или на каком-то нестандартном порту, вам пригодится более мощный способ удаления www:
Code: Select all
# В переменную окружения %{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 и стандартного порта):
Code: Select all
RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Для сайтов, доступных по HTTPS или на нестандартных портах также есть возможность принудительного добавления www:
Code: Select all
# В переменную окружения %{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 и стандартного порта):
Code: Select all
RewriteCond %{HTTP_HOST} ^(www\.)+(.*) [NC]
RewriteRule ^(.*)$ http://%2%{REQUEST_URI} [R=301,L]

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

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

То есть в результате, например, для простого способа удаления www из адреса у вас должно получиться что-то вроде:
Code: Select all
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ http://%1%{REQUEST_URI} [R=301,L]
</IfModule>
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 30
Location: Минск, Беларусь
Reputation: 1574
With us: 5 years 7 months

Post #2by pisikot » 10.10.2012, 12:31

Вчера как раз искал инфу по этому поводу)
Коллекционирую бирдекели, меняться будем?)
pisikot M
Мастер
Avatar
Age: 29
Location: Тюмень, Россия
Reputation: 42
With us: 5 years 2 months

Post #3by Dbonz » 10.01.2013, 07:10

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

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

Post #4by VEG » 10.01.2013, 09:45

Dbonz, делать это не обязательно — форум на главной странице указывает Canonical URL без index.php, соответсвенно поисковики должны игнорировать вариант с index.php.
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 30
Location: Минск, Беларусь
Reputation: 1574
With us: 5 years 7 months

Post #5by Dbonz » 10.01.2013, 10:22

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

Post #6by factotum » 10.01.2013, 17:07

VEG wrote:Также проверьте кодировку: она должна быть UTF-8 без BOM или ANSI. Ещё возможны проблемы с неверным типом перевода строки: он должен быть или Win, или Unix, и ни в коем случае не Mac!
Вчера потерял на два часа жизни на детской ошибке.
на локальном сервере (Win) htaccess в UNIX ANSI. Заливаю на сервер через FileZilla - апач не подхватывает большую часть директив. Проверяю строчку за строчкой - все верно. Заливаю снова - не работает. И так по кругу. Вопрос решился случайно - оказалось, FileZilla выкрутила исходные UNIX ANSI на Windows ANSI. Смена фтп-менеджера решила вопрос.
Если "улучшение" стало "граблями" - Вы его переросли
factotum
Гуру
Location: Люксембург
Reputation: 232
With us: 5 years 7 months

Post #7by Валентин » 10.01.2013, 23:36

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

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

Post #8by VEG » 11.01.2013, 09:57

Валентин, вы можете просто в корне создать файл index.php в корне с таким содержанием:
Code: Select all
<?php
define('PHPBB_ROOT_PATH', './forum/');
include('./forum/index.php');
В результате главная страница будет открываться и по адресу без /forum/ и без редиректов. На phpbbex.com сделано именно так.
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 30
Location: Минск, Беларусь
Reputation: 1574
With us: 5 years 7 months

Post #9by Валентин » 11.01.2013, 13:21

Это решение ничем не отличается от конструкции в .htaccess
Code: Select all
Redirect 301 /index.php /forum/
Вопрос касался передачи всего в папку, например, чтобы запрос mysite/sitemap переадресовывался в mysite/forum/sitemap, запрос mysite/allurl на mysite/forum/allurl для всех запросов, а не только index.php
Валентин
Новичок
Reputation: 21
With us: 4 yaers 11 months

Post #10by 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
Бывалый
Location: интерда
Reputation: 12
With us: 4 yaers 11 months

Post #11by Валентин » 12.01.2013, 21:01

prebbex wrote:у вас корень ни для чего не предназначен? -- может просто перенести файлы самого форума?
Предназначен для собственно сайта/портала... в будущем, поэтому переносить не вариант.
Валентин
Новичок
Reputation: 21
With us: 4 yaers 11 months

Post #12by prebbex » 12.01.2013, 21:05

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

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

Добавлено спустя 4 минуты 17 секунд:
htaccess
Code: Select all
Redirect 301 / /forum/
правильно заданный вопрос в себе содержит половину ответа
prebbex M
Бывалый
Location: интерда
Reputation: 12
With us: 4 yaers 11 months

Post #13by VEG » 12.01.2013, 22:37

prebbex wrote:Redirect 301 / /forum/
Этот вариант по идее не должен работать (цикл).
Для одного из своих форумов я написал такой вариант:
Code: Select all
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
Topic author, Администратор
Avatar
Age: 30
Location: Минск, Беларусь
Reputation: 1574
With us: 5 years 7 months

Post #14by prebbex » 12.01.2013, 22:54

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

Добавлено спустя 3 минуты 45 секунд:
нет, глюкнуло, работает
правильно заданный вопрос в себе содержит половину ответа
prebbex M
Бывалый
Location: интерда
Reputation: 12
With us: 4 yaers 11 months

Post #15by VEG » 12.01.2013, 23:09

prebbex wrote:но и ваш не работает
Скорее всего вы просто забыли добавить инструкции включения mod_rewrite, что описано в первом сообщении:
Code: Select all
RewriteEngine On
RewriteBase /
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 30
Location: Минск, Беларусь
Reputation: 1574
With us: 5 years 7 months

Post #16by prebbex » 12.01.2013, 23:17

нет, без обертки
<IfModule mod_rewrite.c>
# Инструкции для mod_rewrite здесь
</IfModule>
не заработало
правильно заданный вопрос в себе содержит половину ответа
prebbex M
Бывалый
Location: интерда
Reputation: 12
With us: 4 yaers 11 months

Post #17by madbatman » 25.02.2013, 20:25

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

Новый создавал .htaccess файл в корне сайта .
Понимаю, что руки у меня кривые, а ведь так хотелось WWW убрать.
madbatman M
Бывалый
Avatar
Age: 48
Location: Москва
Reputation: 4
With us: 4 yaers 10 months

Post #18by Andrey1990 » 25.02.2013, 21:35

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

RewriteCond %{HTTP_HOST} ^www.prog-portal\.ru$ [NC]
RewriteRule ^(.*)$ http://prog-portal.ru/$1 [R=301,L]
Andrey1990 M
Новичок
Age: 27
Location: Воронеж
Reputation: 0
With us: 4 yaers 11 months

Post #19by VEG » 25.02.2013, 23:26

madbatman, у меня тоже хостинг на nic.ru :) Вообще эти инструкции универсальны и должны работать на всех хостингах. Скорее всего вы что-то не так сделали.
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 30
Location: Минск, Беларусь
Reputation: 1574
With us: 5 years 7 months

Post #20by madbatman » 26.02.2013, 08:39

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

Сделал так как у вас:
Code: Select all
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 KiB) Viewed 13420 times

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

Правая колонка папка /forum/ на хостинге, WWW не пропадает. :fie:
Attachments
Снимок экрана 2013-02-26 в 9.29.55.png
madbatman M
Бывалый
Avatar
Age: 48
Location: Москва
Reputation: 4
With us: 4 yaers 10 months

Next

Return to Мастерская



Who is online (over the past 10 minutes)

Users browsing this forum: 1 guest

cron