Jak pozwolić PHP na automatyczne tworzenie subdomen dla każdego użytkownika?

162

Jak utworzyć subdomenę, taką jak http://user.mywebsite.com ? Czy muszę jakoś uzyskać dostęp do htaccess? Czy rzeczywiście można go po prostu utworzyć za pomocą czystego kodu php, czy też muszę użyć zewnętrznego języka po stronie serwera skryptów?

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

Skuta
źródło
Być może nie jest wymagane proszenie dostawcy o dostęp do DNS, ponieważ routing subdomeny (odpowiedź Marka) jest już aktywowany! Po prostu spróbuj w przeglądarce, jeśli subdomeny dają wynik. Następnie przekieruj je za pomocą pliku .htaccess.
powtac
Jeśli możesz to wykorzystać, wildcard subdomainsmożesz to osiągnąć w .htaccess. Zobacz moje rozwiązanie.
Dan Bray

Odpowiedzi:

135

Szukasz stworzyć niestandardowy rekord A .

Jestem prawie pewien, że podczas określania rekordów A możesz używać symboli wieloznacznych, które pozwolą ci zrobić coś takiego:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 byłby adresem IP twojego serwera WWW. Metoda faktycznego dodania rekordu będzie zależeć od twojego hosta.


Zrobienie tego jak http://mywebsite.com/user byłoby o wiele łatwiejsze do skonfigurowania, gdyby była taka opcja.

Następnie możesz po prostu dodać plik .htaccess, który wygląda następująco:

Options +FollowSymLinks

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

W powyższym przypadku nazwy użytkowników są ograniczone do znaków az


Reguła przepisywania dotycząca przechwytywania subdomeny wyglądałaby następująco:

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1
Mark Biek
źródło
1
O ile każda subdomena nie jest obsługiwana z innego serwera, lepszym planem byłoby utworzenie rekordów nazw kanonicznych (CNAME). en.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear
Subdomena wygląda ładnie. Konfiguracja będzie wymagała dużo więcej pracy, ponieważ będziesz musiał upewnić się, że wszystkie żądania dotyczące subdomen są prawidłowo obsługiwane. Nie jest to straszne w przypadku Apache, ale może być trudne w środowisku hostowanym.
Mark Biek
@theraccoonbear Zakładając, że możesz używać symboli wieloznacznych również z CNAME, to jest myśl.
Mark Biek
3
Powinienem był być bardziej szczegółowy. .htaccess jest przeznaczony dla Apache, a nie dla IIS. Nie jestem pewien, jak przepisywanie adresów URL jest obsługiwane w usługach IIS, ale wydaje mi się, że pojawiło się kilka pytań na ten temat w SO.
Mark Biek
1
Cześć marku , wykonałem kroki, które podałeś powyżej, ale kiedy robię xyz.mydomain.com , przekierowuje do xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Czy muszę zrobić coś innego niż kroki wymienione powyżej ?
Ashish Rajan
30

Funkcja, której szukasz, nazywa się Subdomeny wieloznaczne . Pozwala nie konfigurować DNS dla każdej subdomeny i zamiast tego używać przepisywania apache do przekierowania. Możesz znaleźć fajny samouczek tutaj , ale są tam tysiące tutoriali. 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 VirtualHosts, musi być ustawione w pliku httpd.conf serwera, zamiast w lokalnym .htaccess.

balupton
źródło
nie mogę uzyskać dostępu do pliku httpd.conf, ponieważ korzystam z hostingu współdzielonego. co mogę zrobić?
Webber Depor
23

Robię to trochę inaczej niż Mark. Mijam całą domenę i pobieram 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 pliku index.php. Więc jeśli pójdę do

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

Wracam

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

Następnie w moim kodzie index.php po prostu eksploduję moją nazwę użytkownika z nazwy hosta. To daje mi ładne, ładne adresy URL SEO.

gradbot
źródło
14

Ustawiamy DNS z symbolami wieloznacznymi, jak wyjaśniono powyżej. A więc rekord to * .yourname.com

Wtedy wszystkie subdomeny trafiają w to samo miejsce, 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 po prostu ustawia $accountzmienną taką samą, jak subdomena. Możesz wtedy odzyskać ich pliki i inne informacje na podstawie ich konta.

Prawdopodobnie nie jest to tak wydajne, jak sposoby wymienione powyżej, ale jeśli nie masz dostępu do BIND i / lub ograniczonego .htaccess, ta metoda powinna działać (o ile Twój host skonfiguruje dla ciebie symbol wieloznaczny).

W rzeczywistości używamy tej metody do łączenia się z bazą danych klientów w przypadku aplikacji e-commerce obejmującej wiele firm, ale może ona również działać dla Ciebie.

Volomike
źródło
2
Myślę, że to powinna być poprawna odpowiedź. Jako op zapytaj o to, jak PHP obsługuje subdmoins. NIE Jak serwery WWW lub DNS handel subdomenami.
Salem
8

Nie przejmuj się plikami .htaccess, gdy możesz korzystać z masowego wirtualnego hostingu Apache .

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” to użytkownik. Jeśli użytkownik nie istnieje, otrzymasz 404.

Jedyną wadą jest to, że zmienna środowiskowa DOCUMENT_ROOTnie jest poprawnie ustawiona na używany podkatalog, ale domyślny katalog_główny_dokumentu w de htconfig.

Willem
źródło
1
Naprawdę nie jestem pewien, jak tego użyć ... i na koniec, dlaczego nie zepsuć htaccess?
Skuta
6

Proste rozwiązanie PHP dla subdomen i aplikacji internetowych obsługujących wiele domen

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

A record => *.example.org
A record => *.example.net

Krok 2. Sprawdź unikalność logowań podczas rejestracji użytkownika lub zmiany loginu. Unikaj też kropek w tych 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 obsługiwać różne domeny

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Jeśli potrzebujesz tych samych nicków w różnych domenach obsługiwanych w różny sposób, może być konieczne zapisanie wyboru użytkownika dla domeny podczas rejestracji loginu.

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 
Alex Khimich
źródło
4

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

królikarnia
źródło
4

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

Aktualizacja: tak, zapytałbym twojego rejestratora, czy zapewnia on również usługę serwera nazw (jak to często bywa). Nigdy wcześniej nie korzystałem z tej opcji, ale podejrzewam, że większość rejestratorów konsumenckich tego nie robi. Wyszukałem w Google GoDaddy API i GoDaddy DNS API, ale nie byłem w stanie niczego włączyć, więc myślę, że najlepszą opcją byłoby sprawdzenie pomocy online u twojego dostawcy, a jeśli to nie odpowiada na pytanie, zaczekaj personelu pomocniczego.

theraccoonbear
źródło
3

Najpierw musisz upewnić się, że Twój serwer jest skonfigurowany tak, aby zezwalać na subdomeny z symbolami wieloznacznymi. Osiągnąłem to w JustHost, tworząc ręcznie poddomeny *. Określiłem również folder o nazwie subdomainsjako katalog główny dla subdomen z symbolami wieloznacznymi. Dodaj to do .htaccesspliku 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]

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

Dan Bray
źródło
3

Można to osiągnąć pod .htaccesswarunkiem, że serwer jest skonfigurowany tak, aby zezwalać na subdomeny z symbolami wieloznacznymi. Osiągnąłem to w JustHost, tworząc ręcznie nazwę *poddomeny i określając folder o nazwie subdomeny jako katalog główny dokumentu dla subdomen z symbolami wieloznacznymi. Dodaj to do swojego .htaccesspliku:

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.

Dan Bray
źródło
1

Chciałem tylko dodać, że jeśli używasz CloudFlare (darmowego), możesz użyć ich API do łatwego zarządzania swoimi dns.

kiwixz
źródło
0

Twórz dynamiczne subdomeny za pomocą PHP i Htaccess

(1) Root .htaccess

Ten plik jest przekierowywany z http://www.yourwebsite.com do http://yourwebsite.com w celu użycia strony głównej. Wszystkie przekierowania subdomeny do twojego_folderu_witryny

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteCond %{HTTP_HOST} ^yourwebsite\.com $
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteCond %{REQUEST_URI} !^/yourwebsite_folder/
RewriteRule (.*) /yourwebsite_folder/$1

(2) Folder wewnętrzny .htaccess

Ten plik przepisuje adresy URL subdomen.

http://yourwebsite.com/index.php?siteName=9lessons to http://9lessons.yourwebsite.com

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1

Więcej wskazówek dotyczących .htaccess: Samouczek i wskazówki dotyczące pliku Htaccess.

index.php

Ten plik zawiera prosty kod PHP, wykorzystujący wyrażenia regularne weryfikujące wartość subdomeny.

<?php
$siteName='';
if($_GET['siteName'] )
{
$sitePostName=$_GET['siteName'];
$siteNameCheck = preg_match('~^[A-Za-z0-9_]{3,20}$~i', $sitePostName);
   if($siteNameCheck)
   {
     //Do something. Eg: Connect database and validate the siteName.
   }
   else
  {
    header("Location: http://yourwebsite.com/404.php");
   }
}
?>
//HTML Code
<!DOCTYPE html>
<html>
<head>
<title>Project Title</title>
</head>
<body>
<?php if($siteNameCheck) { ?>
//Home Page
<?php } else { ?>
//Redirect to Subdomain Page.
<?php } ?>
</body>
</html>

Brak folderu poddomeny

Jeśli używasz katalogu głównego (htdocs / public_html) jako katalogu projektu, użyj następującego pliku .htaccess.

Options +FollowSymLinks
RewriteEngine On

RewriteBase /

RewriteCond %{HTTP_HOST} ^www.yourwebsite.com
RewriteRule (.*) http://yourwebsite.com/$1 [R=301,L]

RewriteRule ^([aA-zZ])$ index.php?siteName=$1
RewriteCond %{HTTP_HOST} ^(^.*)\.yourwebsite.com
RewriteRule (.*) index.php?siteName=%1
Abdo-Host
źródło