Twórz subdomeny w locie z.htaccess (PHP)

Szukam systemu, który przy rejestracji utworzy subdomenę na mojej stronie dla obszaru konta użytkowników.

Np. johndoe.website.com

Myślę, że byłoby to coś wspólnego zplik htaccess i ewentualnie przekierowanie do innej lokalizacji na stronie? Nie wiem. Ale wszelkie informacje na początek będą bardzo mile widziane.

Tworzenie obszaru rejestracji nie jest problemem - robiłem to wiele razy. Nie wiem tylko od czego zacząć z subdomeną.

Author: codeforester, 2009-02-25

9 answers

The quick rundown

  1. musisz utworzyć domenę wieloznaczną na serwerze DNS*. website.com
  2. Następnie w kontenerze vhost musisz również podać symbol wieloznaczny *.website.com - odbywa się to w ServerAlias DOCs
  3. następnie wyodrębnij i zweryfikuj subdomenę w PHP i wyświetl odpowiednie dane

Wersja długa

1. Tworzenie wpisu DNS z symbolami wieloznacznymi

W ustawieniach DNS musisz utworzyć wpis domeny wildcard np. *.example.org. Wpis wildcard wygląda tak:

*.example.org.   3600  A  127.0.0.1

2. Dołącz wildcard w vhost

Następnie w konfiguracji Apache musisz skonfigurować kontener vhost, który określa symbol wieloznaczny w ServerAlias DOCs dyrektywa. Przykładowy kontener vhost:

<VirtualHost *:80>
  ServerName server.example.org
  ServerAlias *.example.org
  UseCanonicalName Off
</VirtualHost>

3. Sprawdź, na której subdomenie się znajdujesz w PHP

Następnie w skryptach PHP można znaleźć domenę patrząc w $_SERVER super zmienna globalna. Oto przykład przechwytywania subdomeny w PHP:

preg_match('/([^.]+)\.example\.org/', $_SERVER['SERVER_NAME'], $matches);
if(isset($matches[1])) {
    $subdomain = $matches[1];
}

Użyłem regex tutaj, aby umożliwić osobom odwiedzającym Twoją stronę poprzez www.subdomain.example.org lub subdomain.example.org.

Jeśli nigdy nie spodziewasz się, że będziesz miał do czynienia z www. (lub inne subdomeny) wtedy możesz po prostu użyć fragmentu w ten sposób:

$subdomain = substr(
                 $_SERVER['SERVER_NAME'], 0,
                 strpos($_SERVER['SERVER_NAME'], '.')
             );

Masowy Hosting Wirtualny

Masowy hosting wirtualny jest nieco innym schematem niż powyższy, ponieważ zwykle używasz go do hostowania wiele odrębnych stron internetowych zamiast próbować go używać, zasila aplikację zgodnie z pytaniem.

Udokumentowałem moje masowe środowisko wirtualnego hostingu oparte na mod_rewrite w poście na moim blogu , na które możesz spojrzeć, jeśli chcesz iść tą drogą. Istnieje również, oczywiście, odpowiednia strona podręcznika Apache .

Apache ma również wewnętrzny sposób radzenia sobie z masowym hostingiem wirtualnym, który jest nieco mniej elastyczny niż mod_rewrite metoda, którą zastosowałem. Wszystko to jest opisane na stronie podręcznika Apache dynamicznie konfigurowanej masowej wirtualnej hostingu .

 120
Author: Treffynnon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 05:53:18

Możesz zezwolić na każdą subdomenę, a następnie sprawdzić, czy subdomena jest poprawna. Na przykład:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+\.example\.com$
RewriteRule !^index\.php$ index.php [L]

Wewnątrz {[2] } możesz rozpakować subdomenę używając:

if (preg_match('/^([^.]+)\.example\.com$/', $_SERVER['HTTP_HOST'], $match)) {
    var_dump($match[1]);
}

Ale wszystko to wymaga, aby twój serwer WWW akceptował każdą nazwę subdomeny.

 12
Author: Gumbo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-25 14:18:16

Oprócz konfigurowania DNS wildcard, możesz rzucić okiem na Dynamiczny masowy Hosting wirtualny dla Apache który jest jak rozwiązałem to w przeszłości

 7
Author: Rowland Shaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-25 14:38:43

Najprostszym sposobem jest przekierowanie wszystkich subdomen (z symbolami wieloznacznymi *), aby wskazywały na Twój /wwwroot. Więc postaw .htaccess do tego folderu z następującym kodem:

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]

Spowoduje to, że każdy podfolder folderu / wwwroot w subdomenie (foldername.domain.com).

Znalezione lata temu na http://www.webmasterworld.com/apache/3163397.htm

 5
Author: Glavić,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-25 15:55:47

Łatwiej było zrobić to z PHP. W rzeczywistości tworzy subdomenę w cPanel i utwórz folder pod żądaną nazwą domeny. Tak jak zrobisz to ręcznie w cPanel, ale wszystko to jest zrobione w milisekundach przez prostą funkcję PHP. Nie trzeba klikać:)

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
Author: Adrian P.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-31 16:27:28

To nie ma z tym nic wspólnego .htaccess. Musisz skonfigurować rekordy DNS i hosting wirtualny dla subdomen.

 4
Author: chaos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-25 14:17:23

Mod_vhost_alias {[3] } jest właściwym modułem do tego celu.

W jednej linii możesz powiedzieć Apache ' owi, aby spojrzał na właściwe miejsce, z hashowaniem katalogów itp. Na przykład linia:

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

Powiedziałby Apache, aby ustawić root dokumentu na/http/users/S/u / subdomena, gdy jest to wymagane dla subdomain.yourdomain.com

 4
Author: Julien Tartarin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-14 11:20:22

Myślę, że dzika karta DNS z dynamicznym masowym hostingiem wirtualnym Apache jest również rozsądnym rozwiązaniem. Chociaż nigdy nie próbowałem.

Jeśli masz potrzebę skalowania się do wielu serwerów lub inne rozwiązania po prostu nie działają dla Ciebie, polecam korzystanie z serwera DNS opartego na bazie danych. W przeszłości z powodzeniem używałem MyDNS. Ponieważ używa MySQL (lub PostgreSQL), możesz aktualizować DNS w locie za pomocą PHP lub czegokolwiek innego. Kod na to nie wygląda został zaktualizowany w jakiś czas, ale to DNS i dlatego nie do końca najnowocześniejsze.

 0
Author: Barrett Conrad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-25 15:13:18

Metody tworzenia subdomen wieloznacznych

Najpierw musisz utworzyć ustawienia DNS za pomocą edytora DNS serwera.

  1. Utwórz A rekord w Ustawieniach DNS z hostem * dziką kartą w adresie IP serwera.

    * 1400 IN A ip_address

  2. Utwórz ponownie rekord A w Ustawieniach DNS z hostem @ lub domain_name.tld w adresie IP serwera. tld oznacza domeny najwyższego poziomu lub rozszerzenie domen, takich jak. com,. org itp....

    @ 1400 IN A ip_address lub domain_name.tld 1400 IN A ip_address

  3. Create CNAME record like:

    www 1400 IN A domainname.tld

  4. Utwórz subdomenę za pomocą * wildcard jak *.domain.tld
  5. Utwórz htaccess w katalogu subdomeny *.domain.tld i umieść ten kod:

    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
    

    Przetestuj swoją pierwszą subdomenę typu wildcard jak example.domainname.tld

Jeśli nie jesteś zainteresowany, aby przekazać dane jako parametr za pomocą htaccess, można również uzyskać dane za pomocą następującego kodowania:

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();

I użyj zmiennej globalnej w dowolnym miejscu, jak global $get_data.

echo $get_data->data; //example

(Uwaga: Ta klasa służy głównie do uzyskania dokładnej nazwy subdomeny z http_host. ponieważ niektóre dodatkowe nazwy połączone przed subdomeną są również stosowane, jak www.example.domainname.tld. Aby uzyskać dokładne wartości, zamiast używać $_SERVER['query_string'] lub przekazać parametry htaccess na stronie indeksu)

6.Przyspiesz wykonanie tej subdomeny wieloznacznej użyj N sekund w TTL-DNS Ustawienia.

7.Sprawdź subdomenę po podanym czasie ttl (600 - 10 minut) jak => http://abc.domain.tld

(Uwaga: subdomeny wieloznaczne nie nadpisują istniejących subdomen. Ponieważ pierwszy priorytet zawsze dla istniejących subdomen)

 0
Author: karthikeyan ganesan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-02 10:29:32