Jak umożliwić PHP automatyczne tworzenie subdomeny dla każdego użytkownika?

Jak utworzyć subdomenę jak http://user.mywebsite.com ? Czy muszę jakoś uzyskać dostęp do htaccess? Czy jest to po prostu możliwe, aby utworzyć go za pomocą czystego kodu php lub muszę użyć jakiegoś zewnętrznego języka skryptowo-serwerowego?

Do tych, którzy odpowiedzieli: No to czy powinienem zapytać mojego hostingu, czy zapewniają jakiś dostęp do DNS??

 150
Author: Skuta, 2008-10-08

11 answers

Chcesz utworzyć własny rekord.

Jestem prawie pewien, że możesz używać symboli wieloznacznych przy określaniu rekordu, który pozwoli Ci zrobić coś takiego:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 będzie to adres IP Twojego serwera www. Sposób rzeczywistego dodania rekordu zależy od Twojego hosta.


Robi to jak http://mywebsite.com/user byłoby o wiele łatwiej skonfigurować, jeśli jest taka opcja.

Wtedy możesz po prostu dodać .plik htaccess, który wygląda tak:

Options +FollowSymLinks

RewriteEngine On
RewriteRule ^([aA-zZ])$  dostuff.php?username=$1

w powyższym przypadku nazwy użytkowników są ograniczone do znaków a-z


Reguła przepisywania dla Przechwytywania subdomeny wyglądałaby następująco:

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1
 126
Author: Mark Biek,
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
2008-10-08 17:59:56

Funkcja, której szukasz, nazywa się subdomeny wieloznaczne . Pozwala to nie trzeba konfigurować DNS dla każdej subdomeny, a zamiast tego używać Apache przepisuje przekierowania. Możesz znaleźć fajny samouczek tutaj, ale istnieją tysiące samouczków. Oto niezbędny kod z tego samouczka:

<VirtualHost 111.22.33.55>
    DocumentRoot /www/subdomain
    ServerName www.domain.tld
    ServerAlias *.domain.tld
</VirtualHost>

Jednak ponieważ wymagało to użycia Virtualhostów, musi być ustawione w httpd serwera.plik conf, zamiast lokalnego .htaccess.

 28
Author: balupton,
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-08-20 12:42:56

Robię to trochę inaczej niż Mark. Przekazuję całą domenę i chwytam subdomenę w php.

RewriteCond {REQUEST_URI} !\.(png|gif|jpg)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /index.php?uri=$1&hostName=%{HTTP_HOST}

To ignoruje obrazy i mapuje Wszystko inne do mojego indeksu.plik php. Więc jeśli pójdę do

http://fred.mywebsite.com/album/Dance/now

I get back

http://fred.mywebsite.com/index.php?uri=album/Dance/now&hostName=fred.mywebsite.com

Potem w moim indeksie.kod php po prostu eksploduję swoją nazwę użytkownika poza nazwą hosta. To daje mi ładne adresy URL SEO.

 21
Author: gradbot,
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
2008-10-08 18:39:01

Ustawiamy wildcard DNS tak, jak wyjaśniono powyżej. Więc rekord a to *.yourname.com

Wtedy wszystkie subdomeny rzeczywiście idą do tego samego miejsca, ale PHP traktuje każdą subdomenę jako inne konto.

Używamy następującego kodu:

$url=$_SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);

Ten kod ustawia zmienną $account taką samą jak subdomena. Następnie można pobrać ich pliki i inne informacje na podstawie ich konta.

To prawdopodobnie nie jest tak skuteczne, jak sposoby, które wymieniają powyżej, ale jeśli nie masz dostępu do BIND i / lub ograniczone .htaccess ta metoda powinna działać (o ile twój host skonfiguruje dla Ciebie symbol wieloznaczny).

W rzeczywistości używamy tej metody, aby połączyć się z bazą klientów dla aplikacji e-commerce dla wielu firm, ale może ona również działać dla Ciebie.

 12
Author: Volomike,
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
2016-08-11 05:31:05

Nie zawracaj sobie głowy .pliki htaccess, gdy można użyć Apache mass virtual hosting .

Z dokumentacji:

#include part of the server name in the filenames VirtualDocumentRoot /www/hosts/%2/docs

W pewnym sensie jest to odwrotność twojego pytania: każda "subdomena" jest użytkownikiem. Jeśli użytkownik nie istnieje, otrzymasz 404.

Jedyną wadą jest to, że zmienna środowiskowa DOCUMENT_ROOT nie jest poprawnie ustawiona na używany podkatalog, ale domyślny document_root w de htconfig.

 6
Author: Willem,
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
2008-10-08 23:02:46

Proste rozwiązanie PHP dla subdomen i aplikacji internetowych wielodomenowych

Krok 1. Podaj rekord DNS jako " * " dla domen (lub domen), które będziesz obsługiwać "example.org"

A record => *.example.org
A record => *.example.net
Krok 2. Sprawdź unikalność loginów podczas rejestracji użytkownika lub zmiany loginu. Unikaj również kropek w loginach. Krok 3. Następnie sprawdź zapytanie
        // Request was http://qwerty.example.org
        $q = explode('.', $_SERVER['HTTP_HOST']);
        /*
            We get following array
            Array
            (
                [0] => qwerty
                [1] => example
                [2] => org
            )
        */

        // Step 4.
        // If second piece of array exists, request was for 
        // SUBDOMAIN which is stored in zero-piece $q[0]
        // otherwise it was for DOMAIN

        if(isset($q[2])) {
            // Find stuff in database for login $q[0] or here it is "qwerty"
            // Use $q[1] to check which domain is asked if u serve multiple domains
        }

?>

To rozwiązanie może służyć różnym domenom

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Jeśli potrzebujesz tych samych nicków na różnych domenach serwowanych inaczej, możesz potrzebować aby zapisać wybór użytkownika dla domeny podczas rejestracji logowania.

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 
 5
Author: Alex Khimich,
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
2016-02-20 17:09:17

Możesz [potencjalnie] przepisać adres URL, ale tak: musisz mieć kontrolę nad ustawieniami DNS, aby po dodaniu użytkownika otrzymał własną subdomenę.

 3
Author: warren,
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
2008-10-08 17:40:48

Oprócz zmian konfiguracyjnych na serwerze WWW w celu obsługi nowej subdomeny, Twój kod musiałby wprowadzać zmiany w rekordach DNS. Jeśli więc nie używasz własnego Binda (lub podobnego), musisz dowiedzieć się, jak uzyskać dostęp do konfiguracji dostawcy serwera nazw. Jeśli nie oferują jakiegoś rodzaju API, może to być trudne.

Aktualizacja: Tak, sprawdziłbym u Twojego rejestratora, czy również świadczy usługę serwera nazw(jak to często bywa). Nigdy nie zbadałem tę opcję wcześniej, ale podejrzewam, że większość rejestratorów konsumenckich nie. Wyszukałem w Googlach interfejsy API GoDaddy i interfejsy DNS GoDaddy, ale nie byłem w stanie niczego podkręcić, więc myślę, że najlepszą opcją byłoby sprawdzenie Pomocy online u dostawcy, a jeśli to nie odpowiada na pytanie, skontaktuj się z ich personelem pomocy technicznej.

 3
Author: theraccoonbear,
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
2008-10-08 17:49:27

Najpierw musisz się upewnić, że twój serwer jest skonfigurowany tak, aby zezwalał na subdomeny wieloznaczne. Osiągnąłem to w JustHost, tworząc ręcznie podomenę o nazwie *. Podałem również folder o nazwie subdomains jako główny dokument subdomen wieloznacznych. Dodaj to do pliku .htaccess w folderze subdomen:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Wreszcie, wszystko, co musisz zrobić, to utworzyć folder w folderze subdomeny, a następnie umieścić pliki subdomeny w tym katalogu.

 1
Author: Dan Bray,
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
2016-04-06 18:42:03

Można to osiągnąć w .htaccess pod warunkiem, że serwer jest skonfigurowany tak, aby zezwalał na subdomeny wieloznaczne. Osiągnąłem to w JustHost, tworząc podomenę ręcznie o nazwie * i określając folder o nazwie subdomeny jako główny dokument dla subdomen wieloznacznych. Dodaj to do pliku .htaccess:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.website\.com$
RewriteCond %{HTTP_HOST} ^(\w+)\.website\.com$
RewriteCond %{REQUEST_URI}:%1 !^/([^/]+)/([^:]*):\1
RewriteRule ^(.*)$ /%1/$1 [QSA]

Na koniec utwórz folder dla swojej subdomeny i umieść pliki subdomen.

 1
Author: Dan Bray,
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
2016-04-06 18:51:11

Chciałem tylko dodać, że jeśli używasz CloudFlare (free), możesz używać ich API do zarządzania dns z łatwością.

 0
Author: kiwixz,
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
2014-08-13 10:40:31