Создание субдоменов "на лету" с помощью .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]);
}

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

Ответ 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

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