Принудительное добавление или удаление 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: 29
Location: Минск, Беларусь
Reputation: 1573
With us: 5 years 1 month


Post #21by VEG » 26.02.2013, 11:46

madbatman, написано же
VEG wrote:Для начала открываете (или создаёте новый) .htaccess файл в корне сайта
Корень — это /, а не /forum/. Впрочем, странно всё равно, что никакого эффекта нет (по идее должно затрагивать каталог форума для редиректов).
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 29
Location: Минск, Беларусь
Reputation: 1573
With us: 5 years 1 month

Post #22by madbatman » 26.02.2013, 15:28

И туда и туда уже кидал - толку ноль.
Писал же ранее - у меня руки кривые!
madbatman M
Бывалый
Avatar
Age: 47
Location: Москва
Reputation: 4
With us: 4 yaers 3 months

Post #23by madbatman » 06.03.2013, 12:39

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

Code: Select all
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www.fanbusbabas.ru\.(.*) [NC]
RewriteRule ^(.*)$ http://fanbusbabas.ru/%1%{REQUEST_URI} [R=301,L]

Какие права у .htaccess должны быть?
Attachments
Снимок экрана 2013-03-06 в 13.38.42.png
madbatman M
Бывалый
Avatar
Age: 47
Location: Москва
Reputation: 4
With us: 4 yaers 3 months

Post #24by madbatman » 12.03.2013, 15:36

Сработало! Теперь форум в корне лежит, а не /forum/ моментом WWW отцепилось!
madbatman M
Бывалый
Avatar
Age: 47
Location: Москва
Reputation: 4
With us: 4 yaers 3 months

Post #25by gcib » 27.07.2013, 09:29

Ещё одна статья на эту тему: Перенаправление домена с www на без www
Там предложен только такой способ:
Code: Select all
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.site\.org\.ua$ [NC]
RewriteRule ^(.*)$ http://site.org.ua/$1 [R=301,L]
Но у меня всё классно работает.
gcib M
Новичок
Avatar
Age: 34
Location: Киев, УССР
Reputation: 0
With us: 4 yaers 1 month

Post #26by VEG » 28.07.2013, 13:12

gcib, недостаток этого способа в том, что вы указываете конкретное название домена в .htaccess. Такой файл нельзя без изменений перенести на другой домен, например.
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 29
Location: Минск, Беларусь
Reputation: 1573
With us: 5 years 1 month

Post #27by Valerka » 12.09.2013, 14:03

Вопрос чуть-чуть не по теме, но близко.
Как известно, многие темы и посты имеют формат "<сайт>/viewtopic.php?f=6&t=11". Как можно сделать, что бы в адресной строке было такое отображение: "<сайт>/6/11" Или так: <сайт>/6&11
И можно ли вообще?
Valerka
Новичок
Reputation: 9
With us: 3 yaers 8 months

Post #28by Sumanai » 12.09.2013, 15:36

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

Можно сделать что- то похожее, есть СЕО моды, но глюков с ними очень много. Оставьте как есть. Никто давно полностью адрес до страницы не набирает.
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1564
With us: 4 yaers 4 months

Post #29by Valerka » 12.09.2013, 16:20

никаких модов. Меня больше интересует, хотя бы надпись viwetopic.php выпилить возможно из адресной строки?
Valerka
Новичок
Reputation: 9
With us: 3 yaers 8 months

Post #30by Sumanai » 12.09.2013, 16:29

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

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

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

Нет, без серьёзного переписывания движка.
Забейте, никто не обращает на это внимание.
Использование поиска продлевает жизнь.
Это форум поддержки форка phpBBex. Поддержка по phpBB осуществляется в других местах.
Sumanai M
Гуру
Avatar
Reputation: 1564
With us: 4 yaers 4 months

Post #31by hobot-bobot » 12.09.2013, 17:39

Спасибо, очень помогло
ОАО "РЖД" - Редко Живу Дома
hobot-bobot M
Бывалый
Avatar
Location: Череповец
Reputation: 23
With us: 4 yaers 1 month

Post #32by Xisp » 13.09.2013, 01:54

Вот такой вопрос- как грамотно организовать перенаправление с http на https версию, сохранив удаление www из имени?
Xisp
Бывалый
Reputation: 9
With us: 4 yaers 1 month

Post #33by VEG » 15.09.2013, 00:03

Xisp, набросал такой код, но не тестировал:
Code: Select all
RewriteCond %{HTTPS} !^on$ [NC,OR]
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 29
Location: Минск, Беларусь
Reputation: 1573
With us: 5 years 1 month

Post #34by Xisp » 15.09.2013, 00:07

Скушала домен :smile:
Xisp
Бывалый
Reputation: 9
With us: 4 yaers 1 month

Post #35by VEG » 15.09.2013, 00:14

Xisp, в смысле? Что было на вход и что получилось?
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 29
Location: Минск, Беларусь
Reputation: 1573
With us: 5 years 1 month

Post #36by 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
Бывалый
Reputation: 9
With us: 4 yaers 1 month

Post #37by VEG » 15.09.2013, 00:29

Странно. А так? :) Если не сработает, можно просто вместо %1 в третьей строке указать ваш домен как есть.
Code: Select all
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC,OR]
RewriteCond %{HTTPS} !^on$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 29
Location: Минск, Беларусь
Reputation: 1573
With us: 5 years 1 month

Post #38by Xisp » 15.09.2013, 00:39

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

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

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

Так сработало, но выглядит слегка некрасиво. Хотелось бы идеального решения, на все времена, чтобы последующим админам не пришлось долго думать, что не так. Перфекционизм :smile:
Информация для размышления: если записать вот так:
Code: Select all
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
Бывалый
Reputation: 9
With us: 4 yaers 1 month

Post #39by VEG » 15.09.2013, 00:58

Xisp, тогда напишите:
Code: Select all
RewriteCond %{HTTP_HOST} ^www\.(.*) [NC,OR]
RewriteCond %{HTTPS} ^off$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
:)
С наилучшими пожеланиями, Евгений
VEG M
Topic author, Администратор
Avatar
Age: 29
Location: Минск, Беларусь
Reputation: 1573
With us: 5 years 1 month

Post #40by Xisp » 15.09.2013, 01:14

Ничего не понимаю- не хочет.
Понял, в чём проблема. В рекомендованной для всех случаев строке
Code: Select all
RewriteEngine On
RewriteBase /
Точнее, во второй строке. Последний вариант заработал
Ага, рано радоваться. Варианты http://www.мой_домен.ru и https://www.мой_домен.ru работают как положено, а вот http://мой_домен.ru не пашет :insane: :spy:
Xisp
Бывалый
Reputation: 9
With us: 4 yaers 1 month

PreviousNext

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