Создание субдоменов "на лету" с помощью .htaccess(PHP)
Я ищу создать систему, которая при регистрации создаст субдомен на моем веб-сайте для области учетной записи пользователя.
например. johndoe.website.com
Я думаю, что это будет связано с файлом .htaccess и, возможно, перенаправлением в другое место на веб-сайте? На самом деле я не знаю. Но любая информация, чтобы начать меня, будет с благодарностью.
Создание области регистрации не является проблемой - я сделал это много раз. Я просто не знаю, с чего начать с субдомена.
Ответы
Ответ 1
Быстрое сокращение
- Вам необходимо создать подстановочный домен на вашем DNS-сервере *.website.com
- Затем в вашем контейнере vhost вам также нужно указать шаблон. *.website.com - это делается в
ServerAlias
DOCs
- Затем извлеките и проверьте субдомен в PHP и отобразите соответствующие данные
Длинная версия
1. Создание подстановочной записи DNS
В настройках DNS вам нужно создать запись в виде подстановочных знаков, например *.example.org
. Подстановочная запись выглядит следующим образом:
*.example.org. 3600 A 127.0.0.1
2. Включить шаблон в vhost
Затем в конфигурации Apache вам нужно настроить контейнер vhost, который задает шаблон в ServerAlias
DOCs. Пример контейнера 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 здесь, чтобы позволить людям попасть на ваш сайт через 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 "Динамически настроенный массовый виртуальный хостинг" .
Ответ 2
Вы можете разрешить все субдомены в первую очередь, а затем проверить, действительно ли субдомен. Например:
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]);
}
Но все это требует, чтобы ваш веб-сервер принимал каждое имя поддомена.
Ответ 3
В дополнение к настройке шаблона DNS вы можете взглянуть на Динамический массовый виртуальный хостинг для Apache, вы решили это в прошлом
Ответ 4
Самый простой способ - перенаправить все поддомены (с подстановочным знаком *), чтобы указать на ваш /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
Ответ 5
Мне стало проще делать это с 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";
}
Ответ 6
Это не имеет никакого отношения к .htaccess. Вам нужно будет настроить DNS-записи и виртуальный хостинг для субдоменов.
Ответ 7
Mod_vhost_alias является правильным модулем для этого.
С одной строкой вы можете сказать Apache, чтобы посмотреть на нужное место, с хешированием каталогов и т.д.
Например, строка:
VirtualDocumentRoot /http/users/%3.1/%3.2/%3
сообщит Apache, чтобы установить корень документа в /http/users/s/u/subdomain при запросе для subdomain.yourdomain.com
Ответ 8
Я думаю, что разумным решением также является DNS-сервер с динамическим массовым виртуальным хостингом Apache. Хотя, я никогда не пробовал.
Если вам нужно масштабировать до нескольких серверов или другие решения просто не работают для вас, я рекомендую использовать DNS-сервер, управляемый базами данных. Я успешно использовал MyDNS в прошлом. Так как он использует MySQL (или PostgreSQL), вы можете обновлять свой DNS "на лету" с помощью PHP или всего остального. Код не похож, что он был обновлен через некоторое время, но он DNS и, следовательно, не совсем режет.
Ответ 9
Спасибо за ваши ответы.
Я использую все вышеупомянутое решение, но я не получил фактического результата.
www.mystore.com/category = > category.mystore.com
1) www.mystore.com - это моя домашняя страница.
2) теперь я нажимаю на одну категорию из строки меню, это даст мне список всех продуктов в выбранной категории, а URL-адрес перенаправляется как www.mystore.com/category.
3) Но я хочу, чтобы URL-адрес перенаправлялся на category.mystore.com и отображал весь список продуктов в выбранной категории так же, как этот URL-адрес дает www.mystore.com/category.
Я использую Magento 2 x, PHP 7, MySQL 6
Итак, какие изменения должны быть .htaccess? какими будут точные RewriteCond и RewriteRule.
Ответ 10
Способы создания поддомена подстановочных знаков
FIrst вам нужно создать настройки DNS с помощью DNS-сервера сервера.
-
Создайте A
запись в настройках DNS с помощью хоста *
wild card в 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
(обратите внимание: поддомены подстановочных знаков не переопределяют существующие субдомены. Поскольку первый приоритет всегда для ваших существующих поддоменов)