Создание субдоменов «на лету» с помощью .htaccess (PHP)

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

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

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

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

Быстрое сокращение

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

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

1. Создайте подменю DNS-записи

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

 *.example.org. 3600 A 127.0.0.1 

2. Включите шаблон в vhost

Затем в конфигурации Apache вам нужно настроить контейнер ServerAlias который задает шаблон в директиве ServerAlias . Пример контейнера vhost:

 <VirtualHost *:80> ServerName server.example.org ServerAlias *.example.org UseCanonicalName Off </VirtualHost> 

3. Разработайте, какой субдомен вы используете в PHP

Затем в ваших PHP-скриптах вы можете узнать домен, просмотрев супер-глобальную переменную $_SERVER . Вот пример захвата субдомена в PHP:

 preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches); if(isset($matches[1])) { $subdomain = $matches[1]; } 

Я использовал regex здесь, чтобы позволить людям попасть на ваш сайт через http://www.subdomain.example.org или subdomain.example.org.

Если вы никогда не ожидаете иметь дело с www. (или других поддоменов), то вы можете просто использовать подстроку следующим образом:

 $subdomain = substr( $_SERVER['SERVER_NAME'], 0, strpos($_SERVER['SERVER_NAME'], '.') ); 

Массовый виртуальный хостинг

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

Я зарегистрировал свою массовую виртуальную хостинговую среду на основе mod_rewrite до того, как разместил сообщение в своем блоге , на котором вы могли бы посмотреть, является ли это маршрут, который вы хотите принять. Существует также, конечно, соответствующая страница руководства Apache .

Apache также имеет внутренний способ работы с массовым виртуальным хостингом, который немного менее гибок, чем метод mod_rewrite, который я использовал. Все это описано на странице руководства по виртуальному виртуальному хостингу Apache Dynamic Configured Mass Virtual Hosting .

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

 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/$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"; } 

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

Mod_vhost_alias – это правильный модуль для этого.

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

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

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

Я думаю, что разумный вариант – это дикий DNS-сервер с динамическим массовым виртуальным хостингом Apache. Хотя, я никогда не пробовал.

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

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

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

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

    * 1400 IN A ip_address

  2. Создайте еще раз запись A в настройках DNS с domain_name.tld хоста @ или domain_name.tld в IP-адресе сервера. tld означает домены верхнего уровня или расширение доменов, таких как .com, .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=$1 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 

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

6. Завершив выполнение поддоменов подстановочных знаков, используйте N секунд в TTL – НАСТРОЙКИ DNS.

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

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