Я ищу создать систему, которая при регистрации создаст субдомен на моем веб-сайте для области учетных записей пользователей.
например, johndoe.website.com
Я думаю, что это будет связано с файлом .htaccess и, возможно, перенаправлением на другое место на веб-сайте? На самом деле я не знаю. Но любая информация, чтобы начать меня, будет очень признательна.
Создание зоны регистрации не проблема – я сделал это много раз. Я просто не знаю, с чего начать с субдомена.
ServerAlias
В настройках DNS вам необходимо создать запись в виде подстановочного домена, например *.example.org
. Подстановочный знак выглядит следующим образом:
*.example.org. 3600 A 127.0.0.1
Затем в конфигурации Apache вам нужно настроить контейнер ServerAlias
который задает шаблон в директиве ServerAlias
. Пример контейнера vhost:
<VirtualHost *:80> ServerName server.example.org ServerAlias *.example.org UseCanonicalName Off </VirtualHost>
Затем в ваших 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-редактора сервера.
Создайте запись в настройках DNS с помощью хоста *
wild card в IP-адресе сервера.
* 1400 IN A ip_address
Создайте еще раз запись 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
Создайте запись CNAME
например:
www 1400 IN A domainname.tld
*
подстановочным знаком, таким как *.domain.tld
Создайте 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
(примечание: поддомены подстановочных знаков не переопределяют существующие субдомены. Поскольку первый приоритет всегда для ваших существующих субдоменов)