Вопрос

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

например ,джондо.website.com

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

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

Это было полезно?

Решение

Краткое изложение

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

  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.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top