Створюйте субдомени на ходу за допомогою .htaccess (PHP)


122

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

наприклад, johndoe.website.com

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

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

Відповіді:


125

Швидкий пробіг

  1. Потрібно створити домен підстановки на сервері DNS * .website.com
  2. Потім у вашому контейнері vhost вам також потрібно вказати підстановку * .website.com - Це робиться в документах ServerAlias DOC
  3. Потім витягніть та підтвердьте субдомен у PHP та виведіть відповідні дані

Довга версія

1. Створіть заголовок DNS для підстановки

В налаштуваннях DNS необхідно створити запис підстановлювальний домену , наприклад , як *.example.org. Запис підказки виглядає приблизно так:

*.example.org.   3600  A  127.0.0.1

2. Включіть підстановку в vhost

Далі в конфігурації Apache вам потрібно встановити контейнер vhost, який визначає підстановку в директиві ServerAlias DOC . Приклад контейнера 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 .


Якщо ви можете використовувати wildcard subdomains, перегляньте моє рішення для цього .htaccess.
Dan Bray

Я не вірю, що віртуальний хост можна додати з .htaccess, це також змушує мене нервувати щодо безпеки. З 2.4 має бути можливість вибрати базовий каталог залежно від імені хоста (Але у методу Дана також є деякі проблеми). Поміркуйте:RewriteRule "^/?(.*)" "http://%{HTTP_HOST}/%{HTTP_HOST}/$1" [L,R,NE]
symcbean

Зауважте, що код PHP, що реалізує цей ПОНЯТЬ, не повинен працювати як uid веб-сервера (повинен бути як виділений користувач через sudo)
symcbean

12

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

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-сервер вирішив кожне ім'я субдомену.
хаос

1
Я бачив це на інших веб-сайтах, напевно їм не потрібно вирішувати кожен піддомен щоразу?
Бен Макрі

1
Ну, це залежить від того, що ви розумієте під цим. Якщо ви маєте на увазі, кожен раз, коли хтось в Інтернеті шукає foo.somedomain.com, і він не кешований, їх DNS-сервер повинен це вирішити, то так.
хаос

Якщо ви хочете сказати, чи повинні вони встановлювати записи DNS спеціально для кожного домену, дивіться відповідь Треффіннона.
хаос

добре, дякую за це. я не розумію, що означає Treffynnon, вказуючи підстановку в vhost?
Бен Макрі


6

Мені було легше робити це з 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";

}

Перевірте, чи він був успішно створений на cPanel, і перевірте за допомогою FTP (або файлового менеджера), що знаходиться всередині папки public_html / субдомен. Якщо у вас є налаштування cPanel, який додає матеріал під час створення субдомену, це не пов’язано зі створенням субдоменів на льоту.
Адріан П.

У cPanel не створено
Ruchi

Тоді вам не вистачає дозволу на cPanel. Це спільний хостинг VPS або виділений сервер?
Адріан П.

Причин не створення субдомена може бути декілька. Не пов'язано зі сценарієм вище, але з вашою конфігурацією DNS. Прочитайте це і попросіть допомоги на форумах cPanel. forums.cpanel.net/threads/subdomains-not-working.228132
Адріан П.

5

Найпростіший спосіб - перенаправити всі субдомени (за допомогою підстановки *), щоб вказати на ваш / 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

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


4

Mod_vhost_alias - це правильний модуль для цього.

За допомогою одного рядка ви можете сказати Apache подивитися в потрібному місці, з хешированием каталогу тощо. Наприклад, рядок:

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

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


0

Я думаю, що DNS-картка з підказкою з віртуальним хостингом Apache Dynamic Mass також є розумним рішенням. Хоча, я ніколи цього не пробував.

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


0

Методи створення піддоменних підстановок

По-перше, вам доведеться створити параметри DNS за допомогою сервера-редактора DNS.

  1. Створіть Aзапис у налаштуваннях DNS за допомогою *wild card хосту в ip-адресі сервера.

    * 1400 IN A ip_address

  2. Створіть ще раз Aзапис у налаштуваннях DNS за допомогою хост- адреси @або domain_name.tldip-адреси сервера. 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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.