Поддомены и автоподдомены средствами .htaccess

Мой уже почти бывший хостинг, снова выкинул "подлянку" с поддоменами - любой запрос стал редиректится на основной домен.

Т.к. Тех.поддержка по выходным у них не работает, пришлось в срочном порядке делать RTFM. Конечно доступа к конфигам Апача у меня не было, но проблему удалось решить на голом .htaccess.

Подробности под катом, как говорится.

Итак, приведу фрагмент файла

#Обязательное условие - включаем RewriteEngine
RewriteEngine On
#Не всегда обязательная директива, попробуйте с ней и без неё
#RewriteBase /
#1 Склейка www и домена без
#1.1. Склейка www.домен.ру с домен.ру
RewriteCond %{HTTP_HOST}  ^www\.(.+)$  [NC]
RewriteRule ^(.*)         http://%1/$1 [L,R=301]
#1.2. Склейка домен.ру с www.домен.ру
RewriteCond %{HTTP_HOST}  !^www\.(.+)$  [NC]
RewriteRule ^(.*)         http://%1/$1 [L,R=301]

#2. Создаём поддомены
# Склейка хттп://папка.сайт.ру с физической хттп://сайт.ру/папка без изменения строки браузера
#2.1. Вариант условий для любой папки кроме www
RewriteCond %{HTTP_HOST} !^www\.site\.ru$
RewriteCond %{HTTP_HOST} ^(.+)\.site\.ru$
RewriteCond %{REQUEST_URI} !/%1/
RewriteRule ^(.*)$ /%1/sub/$1 [L,QSA]
#2.2. Вариант для определённых поддоменов
RewriteCond %{HTTP_HOST} ^(sub1|sub2|sub3)\.site\.ru$
RewriteCond %{REQUEST_URI} !/%1/
RewriteRule ^(.*)$ /%1/$1 [L,QSA]

#3. Перенаправление хттп://сайт.ру/папка на хттп://папка.ру.сайт в строке браузера
#3.1. Вариант условий для любой папки кроме www
#3.2. Вариант для определённых поддоменов
RewriteCond %{HTTP_HOST} ^site\.ru$ 
RewriteRule ^(sub1|sub2|sub3)/(.*)$ http://$1.site.ru/$2 [L,R=301]

Первым (#1) пунктом идёт "классическая" склейка. Это универсальный вариант, идеальный для копипаста на любые сайты.

Использовать только 1 из вариантов, что логично.

Создание поддоменов происходит в #2. Имейте ввиду что для успеха этой акции, в ДНС необходимо присутствие 2х строк:

* A IP
site.ru. A IP

IP должны быть одинаковыми. Вторая строчка будет присутствовать по умолчанию.

В первом (#2.1) варианте поддоменами становятся все папки в папке sub, если вы хотите другой путь то измените фрагмент строки "sub/" на нужный вам, для корня сайта, просто сотрите "sub/", но имейте ввиду что все папки станут субдоменами. Этот вариант можно назвать автоподдоменами или димамическими поддоменами.

Если вы не дорвейщик, то предпочтителен второй (#2.2) вариант - определённые папки (в примере это sub1|sub2|sub3) становятся поддоменами, остальные папки работают как и должны. Путь к физическому расположению поддоменов тоже можно изменить, см #2.1

В третьем (#3) пункте создаётся запрет на доступ к папке кроме как через поддомен, это нужно чтобы избежать дублирование контента. Как вы могли заметить пункта #3.1 нет, т.к. мне он был не нужен, доработайте сами или напишите мне, если будет время сделаю. Пункт #3.2 у меня не заработал, но тестирование было в ситуации проблемы в конфигурации Апача, но работать должен.

Оба варианта смогу проверить уже на новом хостинге, буквально через пару дней.

Комментарии.

символ # означает что строка после него - комментарий.

site это имя вашего сайта

sub1..sub3 имя вашего поддомена

флаги.. есть в спецификации апача ;)

Comments

Генадий
Генадий said: 20-09-’13 15:39

Нужна ваша помощь, в программировании я 0.

Что мне нужно:

для каждого отдельного юзера создать поддомен с его ником, как на блог платформах, т.е.

У меня есть сайт на дле, назовем его site.ru. На этом сайте регистрируются пользователь например: gordon. В данный момент ссылка на его профиль выглядит так: http://site.ru/user/gordon/
А необходимо сделать так: http://gordon.site.ru/user/.. При этом для каждого нового пользователя необходимо создавать отдельный поддомен вида username.site.ru

Очень надеюсь на ваш ответ, буду признателен, в ответ могу проставить с моего сайта ссылку на ваше решение вопроса.

wakh
wakh said: 25-09-’13 16:04

Вообще создание поддоменов обычно организовывается в панели хостера.
А пробовали решение из этого поста? вариант 2.1/ 3.1 для всех папок (автоматический режим) или 2.2/3.2 для ручного создания.
скопируйте мой код и замените
site.ru – ваш сайт
sub – папка, в вашем случае это user.
Странно что ЦМС не делает этого сама, ДЛЕ вроде серьёзная вещь.

wlad
wlad said: 09-03-’15 18:29

как запретить домен третьего уровня в роботс ?

wakh
wakh said: 10-03-’15 12:09

Что значит запретить? в роботс.тхт можно только закрыть от индексации поисковиками, например так
User-agent: *
Disallow: 3rd.domain.com

Xstroy
Xstroy said: 24-04-’15 13:33

Привет!
Понадобилось на региональных поддоменах показывать основной сайт.
Только у тебя нашёл вменяемый хелпик, но вот не могу понять как составить htaccess если папки поддоменов у моего хостера находятся на том же уровне, что и основной домен.
Т.е. в основной поддиректории domains располагаются папки:
сайт.ру
поддомен1.сайт.ру
поддомен2.сайт.ру и т.д.

htaccess ведь размещается в директории поддомена?

Также в дорвейном духе … как менять url на местные поддоменные?
Встречал когда-то пример кода на своём взломанном сайте, когда к моему сайту добавлялся целый хвост страниц чугого, но url на нём все корректно работали как местные. К сожалению сие чудо погибло вместе со старым винтом, а вот аналога найти не могу.

wakh
wakh said: 25-04-’15 00:26

Если я правильно тебя понял, то .htaccess надо класть в каждую папку, т.к. по сути это независимые сайты (и это здорово).

“Также в дорвейном духе … как менять url на местные поддоменные?”
тут я совсем не понял задачи.

Но с любого сайта, не важно домен или поддомен можно делать редиректы на любые друге сайты. Хоть всего домена, хоть отдельных ЮРЛ или маски ЮРЛ.
Если редирект происходит в рамка (под-)домена, то “маскировка” возможна любая – так работает ЧПУ и многое другое, а вот маскировку сторонних доменов я не изучал никогда.

ЗЫ тот геморойный хостинг, я забыл как страшный сон, на любом нормаьном, для поддержки субдоменов ничего делать не нужно. В моём случае можно в панели выбрать место поддоменов отдельная папка или внутри, я выбрал первое, т.к. это гораздо удобней, но если у вас 100 доменов и 1000 поддоменов возможно второй вариант лучше.

I.CaR Soft
I.CaR Soft said: 02-03-’16 19:37

#3 – Что-то не сработало…

yaumamyprogrammist
yaumamyprogrammist said: 10-12-’16 22:37

Здравствуйте!
Помогите с #3, пожалуйста.
Нужен как раз тот вариант с универсальным редиректом всего подряд на домены третьего уровня.
Т.е. с http://site.ru/user/sub1 хочется редиректа на http://sub1.site.ru

Это возможно?

wakh
wakh said: 05-04-’17 13:36

Друзья, это всё костыли и они могут зависеть от настроек хостинга, организации поддоменов и т.п. Поэтому и тестировать лучше на конкретном сервере. Для начала пробуйте обратиться в саппорт, если уж пошлют, то читайте http://webdev.wakh.ru/2017-04-05/-htacce...
Вариант 3 предложенный в посте должен работать при условии расположения файла .htaccess в корне сайта. Вот рабочий вариант 3.1 снимающий это ограничение:
RewriteCond %{HTTP_HOST} ^site\.ru
RewriteCond %{REQUEST_URI} ^(.+)\/(.*)
RewriteRule ^ http://%1.site.ru/%2 [L,R=301]

Юрий
Юрий said: 21-06-’17 22:14

Не могу никак разобраться. Подскажите.
Форум находиться в папке сайт.ру/forum
Сейчас возникла необходимость перенести на поддомен forum/сайт.ру
Так что все-таки прописать в htaccess для редиректа?
Поддомен создан и работает

<span class='registered'>wakh</span>
wakh said: 22-06-’17 13:37

Вообще зависит от настроек хостинга, но попробуйте так,
в корне сайт.ру в .htaccess пишем

RewriteEngine On (если такой строки нет)
RewriteCond %{HTTP_HOST} ^сайт\.ру\/forum$ [NC]
RewriteRule ^(.*)$ http:// forum.сайт.ру/$1 [R=301,L]

или
в папке сайт.ру/forum в .htaccess пишем

RewriteEngine On (если такой строки нет)
RewriteCond %{REQUEST_URI} (.*)
RewriteRule ^(.*)$ http:// forum.сайт.ру/$1 [L,R=301]

Блин, тупорылая ЦМС-ка портит текст, я добавил пробел после http:// – он (пробел) не нужен

Leave a comment


Comment moderation is enabled on this site. This means that your comment will not be visible until it has been approved by an editor.