Создавайте поддомены "на лету" с помощью .htaccess (PHP)
-
06-09-2019 - |
Вопрос
Я хочу создать систему, которая при регистрации создаст поддомен на моем веб-сайте для области учетной записи пользователя.
например ,джондо.website.com
Я думаю, это было бы как-то связано с файлом .htaccess и, возможно, перенаправлением в другое место на веб-сайте?На самом деле я не знаю.Но я был бы очень признателен за любую информацию, которая помогла бы мне начать.
Создание зоны регистрации - это не проблема - я делал это много раз.Я просто не уверен, с чего начать с поддомена.
Решение
Краткое изложение
- Вам необходимо создать домен с подстановочным знаком на вашем DNS-сервере *.website.com
- Затем в вашем контейнере vhost вам также нужно будет указать подстановочный знак *.website.com - Это делается в
ServerAlias
Документы - Затем извлеките и проверьте поддомен на PHP и отобразите соответствующие данные
Длинная версия
1.Создайте DNS-запись с подстановочным знаком
В настройках вашего DNS вам необходимо создать запись в домене с подстановочным знаком такие , как *.example.org
.Запись с подстановочным знаком выглядит следующим образом:
*.example.org. 3600 A 127.0.0.1
2.Включите подстановочный знак в vhost
Далее в конфигурации Apache вам нужно настроить контейнер vhost, который задает подстановочный знак в 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];
}
Я использовал регулярное выражение здесь, чтобы разрешить людям заходить на ваш сайт через 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 Страница руководства по динамически настраиваемому массовому виртуальному хостингу.
Другие советы
Вы могли бы разрешить каждый поддомен в первую очередь, а затем проверить, является ли поддомен допустимым.Например:
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-записи и виртуальный хостинг для поддоменов.
Мод_вхост_алиас является подходящим модулем для этого.
С помощью одной строки вы можете сказать Apache, чтобы он посмотрел в нужном месте, с помощью хеширования каталога и т.д.Например, строка:
VirtualDocumentRoot /http/users/%3.1/%3.2/%3
сказал бы Apache установить корень документа в /http/users/s / u /subdomain при запросе поддомена.yourdomain.com
Я думаю, что DNS-система wild card с динамическим массовым виртуальным хостингом Apache также является разумным решением.Хотя я никогда этого не пробовал.
Если вам необходимо масштабироваться до нескольких серверов или другие решения просто не подходят для вас, я рекомендую использовать DNS-сервер, управляемый базой данных.Я успешно использовал Мои друзья в прошлом.Поскольку он использует MySQL (или PostgreSQL), вы можете обновлять свой DNS "на лету" с помощью PHP или практически чего-либо еще.Код не выглядит так, как будто он обновлялся какое-то время, но это DNS и, следовательно, не совсем ультрасовременный.
Методы создания поддоменов с подстановочными знаками
Сначала вы должны создать настройки DNS с помощью редактора DNS вашего сервера.
Создать
A
запись в настройках DNS с хостом*
подстановочный знак в IP-адресе сервера.* 1400 IN A ip_address
Создайте еще раз
A
запись в настройках DNS с хостом@
или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'
Итак, мое предложение состоит в том, чтобы использовать $_SERVER['http_host']
для получения точных значений вместо использования $_SERVER['query_string']
или передал параметры htaccess на вашей индексной странице)
6.Ускорьте выполнение этого подстановочного знака поддоменов, используя N секунд в НАСТРОЙКАХ TTL - DNS.
7.Проверьте поддомен по истечении заданного вами времени ttl (600-10 минут) следующим образом => http://abc.domain.tld
(примечание:поддомены с подстановочными знаками не переопределяют существующие поддомены.Потому что первый приоритет всегда для ваших существующих поддоменов)