Создание поддоменов на лету с помощью .htaccess (PHP) - PullRequest
121 голосов
/ 25 февраля 2009

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

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

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

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

Ответы [ 9 ]

122 голосов
/ 25 февраля 2009

Быстрое краткое изложение

  1. Вам необходимо создать подстановочный домен на вашем DNS-сервере * .website.com
  2. Тогда в вашем vhost-контейнере вам также потребуется указать подстановочный знак * .website.com - Это делается в ServerAlias DOCs
  3. Затем извлеките и проверьте поддомен в 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];
}

Я использовал здесь регулярное выражение, чтобы позволить людям заходить на ваш сайт через 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 Динамически настраиваемый массовый виртуальный хостинг .

12 голосов
/ 25 февраля 2009

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

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]);
}

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

7 голосов
/ 25 февраля 2009

В дополнение к настройке подстановочного знака DNS, вы можете взглянуть на Динамический массовый виртуальный хостинг для Apache , как я решил эту проблему в прошлом

5 голосов
/ 13 февраля 2013

Мне было проще делать это с помощью 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";

}
5 голосов
/ 25 февраля 2009

Самый простой способ - перенаправить все субдомены (с подстановочным знаком *), чтобы они указывали на ваш / 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

4 голосов
/ 14 апреля 2009

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

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

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

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

4 голосов
/ 25 февраля 2009

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

0 голосов
/ 02 июня 2017

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

Сначала необходимо создать настройки DNS с помощью редактора DNS вашего сервера.

  1. Создать A запись в настройках DNS с хостом * подстановочный знак в IP-адресе сервера.

    * 1400 IN A ip_address

  2. Создайте еще раз A запись в настройках DNS с хостом @ или 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' Поэтому я предлагаю использовать $_SERVER['http_host'] для получения точных значений вместо использования $_SERVER['query_string'] или переданных параметров htaccess на странице индекса)

6. Ускорение выполнения этого поддомена с использованием подстановочных знаков в N TTL - DNS SETTINGS с использованием N секунд.

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

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

0 голосов
/ 25 февраля 2009

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

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

...