Создавайте поддомены на лету.htaccess (PHP)

Я ищу, чтобы создать систему, которая при регистрации будет создать поддомен на моем сайте для пользователей учетной записи.

например, johndoe.website.com

Я думаю, что это будет что-то делать с этим .файл htaccess и, возможно, перенаправить в другое место на сайте? На самом деле я не знаю. Но любая информация, чтобы начать меня, была бы очень признательна.

создание области регистрации не проблема - я делал это много раз. Я просто не знаю, с чего начать с поддомена.

9 ответов


краткое изложение

  1. необходимо создать подстановочный домен на DNS-сервере *.website.com
  2. затем в вашем контейнере vhost вам также нужно будет указать подстановочный знак *.website.com -это делается в ServerAlias DOCs
  3. затем извлеките и проверьте поддомен в PHP и отобразите соответствующие данные

длинная версия

1. Создание шаблона DNS запись

в настройках DNS вам необходимо создать запись домена подстановочного знака например *.example.org. Подстановочный знак выглядит следующим образом:

*.example.org.   3600  A  127.0.0.1

2. Шаблоны в файл vhost

далее в конфигурации Apache вам нужно настроить контейнер vhost, который указывает подстановочный знак в ServerAlias DOCs


вы можете разрешить каждый поддомен в первую очередь, а затем проверить, является ли поддомен допустимым. Например:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]

внутри index.php вы можете извлечь поддомен, используя:

if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_HOST'], $match)) {
    var_dump($match[1]);
}

но все это требует, чтобы ваш веб-сервер принимает каждое имя поддомен.


в дополнение к настройке подстановочного знака DNS, Вы можете взглянуть на динамический массовый виртуальный хостинг для Apache именно так я решил это в прошлом


самый простой способ-перенаправить все поддомены (с подстановочным знаком*), чтобы указать на ваш /wwwroot. Потом положить. htaccess в эту папку со следующим кодом:

RewriteCond %{ENV:REDIRECT_SUBDOMAIN} ="" 
RewriteCond %{HTTP_HOST} ^([a-z0-9][-a-z0-9]+)\.domain\.com\.?(:80)?$ [NC] 
RewriteCond %{DOCUMENT_ROOT}/%1 -d 
RewriteRule ^(.*) %1/ [E=SUBDOMAIN:%1,L] 
RewriteRule ^ - [E=SUBDOMAIN:%{ENV:REDIRECT_SUBDOMAIN},L]

это приведет к тому, что каждая подпапка папки / wwwroot будет приемлемой через поддомен (foldername.domain.com).

нашел это много лет назад на http://www.webmasterworld.com/apache/3163397.htm


мне было проще сделать это с PHP. На самом деле это создание поддомена внутри cPanel и создание папки под нужным доменным именем. Как вы сделаете это вручную в cPanel, но все это делается в миллисекундах с помощью простой функции PHP. Нет необходимости нажимать:)

function create_subdomain($subDomain,$cPanelUser,$cPanelPass,$rootDomain) {

    //  $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain;

    $buildRequest = "/frontend/x3/subdomain/doadddomain.html?rootdomain=" . $rootDomain . "&domain=" . $subDomain . "&dir=public_html/subdomains/" . $subDomain;

    $openSocket = fsockopen('localhost',2082);
    if(!$openSocket) {
        return "Socket error";
        exit();
    }

    $authString = $cPanelUser . ":" . $cPanelPass;
    $authPass = base64_encode($authString);
    $buildHeaders  = "GET " . $buildRequest ."\r\n";
    $buildHeaders .= "HTTP/1.0\r\n";
    $buildHeaders .= "Host:localhost\r\n";
    $buildHeaders .= "Authorization: Basic " . $authPass . "\r\n";
    $buildHeaders .= "\r\n";

    fputs($openSocket, $buildHeaders);
        while(!feof($openSocket)) {
           fgets($openSocket,128);
        }
    fclose($openSocket);

    $newDomain = "http://" . $subDomain . "." . $rootDomain . "/";

   //  return "Created subdomain $newDomain";

}

это не имеет никакого отношения .реврайт. Вам нужно будет настроить DNS-записи и виртуальный хостинг для поддоменов.


к модулю mod_vhost_alias является правильным модулем для этого.

С одной строкой вы можете сказать Apache, чтобы посмотреть в нужном месте, с хешированием каталога и т. д. Например, строка:

VirtualDocumentRoot /http/users/%3.1/%3.2/%3

сказал бы Apache установить корень документа в /http / users/s/u / subdomain при запросе subdomain.yourdomain.com


Я думаю, что DNS wild card с динамическим массовым виртуальным хостингом Apache также является разумным решением. Хотя я никогда не пробовал.

Если вам нужно масштабироваться до нескольких серверов или другие решения просто не работают для вас, я рекомендую использовать DNS-сервер, управляемый базой данных. Я успешно использовал MyDNS в прошлом. Поскольку он использует MySQL (или PostgreSQL), вы можете обновить свой DNS на лету с помощью PHP или что-нибудь еще. Код не похоже, что он был обновлен через некоторое время, но это DNS и, следовательно, не совсем передний край.


методы создания поддоменов подстановочных знаков

сначала вам нужно создать настройки DNS с помощью редактора DNS сервера.

  1. создать A запись в настройках DNS с хостом * wild card в ip-адресе сервера.

    * 1400 IN A ip_address

  2. создайте еще раз A запись в настройках DNS с хостом @ или domain_name.tld in ip-адрес сервера. tld означает домены верхнего уровня или расширение доменов такие как .ком, .org и т. п....

    @ 1400 IN A ip_address или domain_name.tld 1400 IN A ip_address

  3. создать CNAME запись:

    www 1400 IN A domainname.tld

  4. создайте поддомен с помощью * подстановочный знак, как *.domain.tld
  5. создайте htaccess в каталоге поддоменов *.domain.tld и ставим этот код :

    Options +FollowSymLinks 
    RewriteEngine On 
    RewriteBase /
    RewriteRule ^([aA-zZ0-9]+)$ index.php?data=
    RewriteCond %{HTTP_HOST} ^([aA-zZ0-9]+)\.([aA-zZ0-9-]+)\.([aA-zZ]+)
    RewriteRule ([aA-zZ0-9]+) index.php?data=%1
    

    проверьте свой первый поддомен подстановочных знаков, как example.domainname.tld

если вы не интерес для передачи данных в качестве параметра с помощью htaccess, вы также можете получить данные с помощью следующего кода:

define("SUBDOMAIN_PARENT","domainname.tld");   
class getData
    {
         function __construct()
        {
            $this->data="";
            $http_host=$_SERVER['HTTP_HOST'];
         $subdom_data= str_replace(SUBDOMAIN_PARENT,"",$http_host);
         $expl_subdom_data=explode(".",$subdom_data);
      $expl_subdom_data=array_filter($expl_subdom_data);

            if($expl_subdom_data!=NULL)
            {
           $this->data=end($expl_subdom_data);
            }
       }
    }
$GLOBALS['get_data']=new getData();

и используйте глобальную переменную в любом месте, например global $get_data.

echo $get_data->data; //example

(Примечание: этот класс в основном используется для получения точного subdomainname от http_host. потому что некоторые дополнительные имена, объединенные перед вашим поддоменом, также применимы, как www.example.domainname.tld. Это возвращение $_GET['data']='wwww' поэтому мое предложение-использовать $_SERVER['http_host'] для получения точных значений вместо использования $_SERVER['query_string'] или переданные параметры htaccess на вашей индексной странице)

6.Ускорить выполнение этого подстановочного знака поддомены используют N секунд в настройках TTL - DNS.

7.Проверьте поддомен после заданного времени ttl (600 - 10 минут), например => http://abc.domain.tld

(Примечание: поддомены подстановочных знаков не переопределяют существующие поддомены. Потому что первый приоритет всегда для ваших существующих поддоменов)