Потратив достаточно долгое время на поиски готового скрипта, пришлось констатировать тот факт, что либо все это работает не совсем правильно, либо вообще не работает.
Теперь я знаю как это сделать и сейчас покажу на примерах.
Для начала сделаем поддомены на свежем сайте, т.е. готовой структуры пока нет и можно делать все что угодно.
Создайте файл .htaccess в корне сайта и впишите в него следующий код:
RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} !^www\.domain\.(com|ru)$ RewriteCond %{HTTP_HOST} (www\.)?(.*)\.domain\.(com|ru)$ RewriteCond %{REQUEST_URI} !sub/ RewriteRule ^(.*)$ sub/%2/$1
Теперь подробно остановимся на каждом пункте.
Для запуска mod_rewrite используется команда RewriteEngine on, если ее закомментировать, то весь код перестанет работать, часто это бывает очень полезно.
RewriteBase указывает на использование текущей папки.
RewriteCond %{HTTP_HOST} !^www\.domain\.com$
Во втором RewriteCond проверяется наличие в имени адреса поддомена, причем работать будет одинаково с www и без него, т.е. сайты www.forum.domain.com и forum.domain.com будут обрабатываться одинаково.
Третье условие используется для проверки уже исправленного адреса, т.к. mod_rewrite выполняется пока условия перестанут подходить. Итак мы проверяем в строке запроса (URI, то что идет после имени домена, например /info.html) наличие папки куда мы перенаправили запрос, в данном случае это sub, перед ним стоит восклицательный знак, который сообщает, что условие не должно выполняться при наличии такой подстроки.
И наконец само правило преобразования адреса RewriteRule. В нем мы заменяем строку запроса на новый адрес:
sub + второй найденный элемент (условие RewriteCond %{HTTP_HOST} (www\.)?(.*)\.domain\.(com|ru)$, то что находится во вторых скобках) + адрес, который был изначально ( описанный в том же RewriteRule: ^(.*)$)
Лучше воздержаться от использования в качестве метки и основной папки простое слово типа sub, т.к. оно может оказаться в адресе страницы, лучше использовать произвольный набор символов.
Бывают ситуации, когда необходимо использовать два разных адреса для одной и той же папки, например:
domain.com/forum/
и
forum.domain.com
RewriteEngine on RewriteBase / RewriteCond %{HTTP_HOST} ^forum\.domain\.(com|ru)$ RewriteCond %{REQUEST_URI} !/forum/ RewriteRule ^(.*)$ /forum/$1 [L]
Сначала проверяем нужный нам поддомен forum.domain.com (или forum.domain.ru). Потом ищем строку /forum/ в самом запросе, проверяя не изменили ли мы уже этот адрес. И наконец делаем преобразование. Знак [L] обозначает окончание преобразования, если это правило выполнилось, то дальнейшая обработка прекращается.
Таких правил может быть сколько угодно, главное не забывайте о наличии нужных папок на сервере.
В некоторых случаях в панели хостинга нужно прописать алиас для вашего домена. Обычно там описаны два варианта:
domain.com
и
www.domain.com
Вам нужно добавить строку:
*.domain.com
if (!defined('_SAPE_USER'))define('_SAPE_USER', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxx'); require_once($_SERVER['DOCUMENT_ROOT'].'/sub/forum/'._SAPE_USER.'/sape.php'); $o['host']='forum.domain.com'; $sape = new SAPE_client($o); echo $sape->return_links();
Обратите внимание на путь к файлу sape.php в require_once и новое имя домена в $o['host']