Вопрос Как на shared-хостинге можно выделять поддомены через php-скрипты?

Discussion in 'Для Администратора' started by Sun2017, 1 Jan 2018.

  1. Sun2017

    Sun2017 Member

    Joined:
    5 May 2017
    Messages:
    337
    Likes Received:
    85
    Reputations:
    0
    Как на shared-хостинге можно выделять поддомены через php-скрипты?
     
  2. xen_

    xen_ New Member

    Joined:
    12 Sep 2018
    Messages:
    1
    Likes Received:
    1
    Reputations:
    0
    mail156 likes this.
  3. xlamerz

    xlamerz Active Member

    Joined:
    1 May 2020
    Messages:
    116
    Likes Received:
    263
    Reputations:
    0
    Создайте файл .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 устанавливает правила, в зависимости от которых будет или не будет произведена замена адреса. В первом случае проверяется является ли поддомен с названием www, естественно его перенаправлять не нужно, поэтому перед строкой стоит восклицательный знак, обозначая отрицание. В скобках указано com|ru, используется только если вы имеете два одинаковых домена в разных зонах и они являются псевдонимами (алиасам) другу друга. Если вы используете один сайт, то запись будет такой:

    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 необходимые вам папки поддоменов.

    Лучше воздержаться от использования в качестве метки и основной папки простое слово типа sub, т.к. оно может оказаться в адресе страницы, лучше использовать произвольный набор символов.

    Бывают ситуации, когда необходимо использовать два разных адреса для одной и той же папки, например:
    domain.com/forum/
    и
    forum.domain.com

    В данном случае у нас на сервере уже есть папка forum, и полностью копировать ее еще и в папку sub не очень удобно и не совсем правильно. Найденный вариант использования mod_rewrite не совсем универсальный, но все позволяет обслужить конечное число поддоменов:

    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

    Теперь, когда все настроено и работает, возникает проблема со ссылками Sape. Они не будут нормально отображаться, потому что фактически адрес ссылки изменился, был http://forum.domain.com, а стал, например, http://domain.com/sub/forum/, поэтому в коде Sape нужно прописать новый хост и путь к папке с базой. Выглядит это примерно так:

    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']