Come consentire a PHP di creare automaticamente un sottodominio per ciascun utente?


162

Come faccio a creare un sottodominio come http://user.mywebsite.com ? Devo accedere a htaccess in qualche modo? In realtà è semplicemente possibile crearlo tramite puro codice php o ho bisogno di usare un linguaggio lato script-server esterno?

A coloro che hanno risposto: Bene, allora, dovrei chiedere al mio hosting se forniscono una sorta di accesso DNS ??


Forse non è necessario chiedere al tuo provider l'accesso DNS, poiché il routing del sottodominio (risposta di Mark) è già attivato! Prova nel tuo browser se i sottodomini ti danno un risultato. E poi instradali con il file .htaccess.
powtac,

Se è possibile utilizzare wildcard subdomainsquesto può essere ottenuto in .htaccess. Vedi la mia soluzione
Dan Bray,

Risposte:


135

Stai cercando di creare un record A personalizzato .

Sono abbastanza sicuro che puoi usare i caratteri jolly quando specifichi i record A che ti permetterebbero di fare qualcosa del genere:

*.mywebsite.com       IN  A       127.0.0.1

127.0.0.1 sarebbe l'indirizzo IP del tuo server web. Il metodo per aggiungere effettivamente il record dipenderà dal tuo host.


Farlo come http://mywebsite.com/user sarebbe molto più facile da impostare se è un'opzione.

Quindi potresti semplicemente aggiungere un file .htaccess simile al seguente:

Options +FollowSymLinks

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

In quanto sopra, i nomi utente sono limitati ai caratteri az


La regola di riscrittura per afferrare il sottodominio sarebbe simile a questa:

RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*)  dostuff.php?username=%1

1
A meno che ogni sottodominio non venga servito da un server diverso, la cosa migliore sarebbe creare un record Nome canonico (CNAME). it.wikipedia.org/wiki/List_of_DNS_record_types
theraccoonbear

Il sottodominio sembra carino. Ci vorrà molto più lavoro da configurare perché dovrai assicurarti che tutte le richieste di sottodominio vengano gestite correttamente. Questo non è terribile con Apache ma potrebbe essere complicato in un ambiente ospitato.
Mark Biek,

@theraccoonbear Supponendo che tu possa usare anche i caratteri jolly con CNAME, questo è un pensiero.
Mark Biek,

3
Avrei dovuto essere più specifico. .htaccess è per Apache, non per IIS. Non sono sicuro di come la riscrittura degli URL venga gestita con IIS, ma credo che ci siano state alcune domande in merito su SO.
Mark Biek,

1
ciao mark, ho seguito i passaggi che hai indicato sopra, ma quando eseguo xyz.mydomain.com reindirizza a xyz.mydomain.com/cgi-sys/defaultwebpage.cgi ... Devo fare qualcos'altro rispetto ai passaggi sopra menzionati ?
Ashish Rajan,

30

La funzione che stai cercando si chiama Sottodomini jolly . Ti consente di non dover impostare il DNS per ciascun sottodominio e di utilizzare invece le riscritture di Apache per il reindirizzamento. Puoi trovare un bel tutorial qui , ma ci sono migliaia di tutorial là fuori. Ecco il codice necessario da quel tutorial:

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

Tuttavia, poiché richiedeva l'uso di VirtualHosts, deve essere impostato nel file httpd.conf del server, anziché in un .htaccess locale.


non riesco a raggiungere il file httpd.conf poiché sono su hosting condiviso. cosa posso fare?
Webber Depor,

23

Lo faccio un po 'diverso da Mark. Passo l'intero dominio e afferro il sottodominio in php.

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

Questo ignora le immagini e mappa tutto il resto sul mio file index.php. Quindi se vado a

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

torno

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

Quindi nel mio codice index.php ho appena fatto esplodere il mio nome utente da hostName. Questo mi dà dei simpatici URL SEO.


14

Configuriamo DNS con caratteri jolly come spiegato sopra. Quindi il record è * .yourname.com

Quindi tutti i sottodomini stanno andando nello stesso posto, ma PHP tratta ogni sottodominio come un account diverso.

Usiamo il seguente codice:

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

Questo codice imposta semplicemente la $accountvariabile come il sottodominio. È quindi possibile recuperare i loro file e altre informazioni in base al loro account.

Questo probabilmente non è efficiente come i modi sopra elencati, ma se non hai accesso a BIND e / o .htaccess limitato questo metodo dovrebbe funzionare (purché il tuo host configuri il carattere jolly per te).

In realtà utilizziamo questo metodo per connetterci al database dei clienti per un'applicazione di e-commerce multi-azienda, ma potrebbe funzionare anche per te.


2
Penso che questa potrebbe essere una risposta corretta, in quanto chiedi come PHP gestisca i sottomarini NON come i server Web o DNS gestiscono i sottodomini.
Salem,

8

Non preoccuparti dei file .htaccess quando puoi usare l'hosting di massa di Apache .

Dalla documentazione:

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

In un certo senso è il contrario della tua domanda: ogni "sottodominio" è un utente. Se l'utente non esiste, ottieni un 404.

L'unico inconveniente è che la variabile di ambiente DOCUMENT_ROOTnon è impostata correttamente sulla sottodirectory utilizzata , ma il root_documento predefinito in de htconfig.


1
Non sono davvero sicuro di come usarlo .. e alla fine, perché non sbagliare con htaccess?
Skuta,

6

Semplice soluzione PHP per sottodomini e app Web multi-dominio

Passaggio 1. Fornisci DNS A record come "*" per i domini (o domini) che servirai "esempio.org"

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

Passaggio 2. Verificare l'unicità degli accessi quando l'utente si registra o modifica l'accesso. Inoltre, evita i punti in questi accessi.

Passaggio 3. Quindi controllare la query

        // 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
        }

?>

Questa soluzione può servire domini diversi

qwerty.example.org
qwerty.example.net 

johnsmith.somecompany.com
paulsmith.somecompany.com

Se hai bisogno degli stessi nick su domini diversi offerti in modo diverso, potrebbe essere necessario memorizzare la scelta dell'utente per il dominio quando registri l'accesso.

smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith 

4

Potresti [potenzialmente] riscrivere l'URL, ma sì: devi avere il controllo delle tue impostazioni DNS in modo che quando un utente viene aggiunto ottenga il proprio sottodominio.


4

Oltre alle modifiche di configurazione sul tuo server WWW per gestire il nuovo sottodominio, il tuo codice dovrebbe apportare modifiche ai tuoi record DNS. Quindi, a meno che tu non stia eseguendo il tuo BIND (o simile), dovrai capire come accedere alla configurazione del provider del tuo server dei nomi. Se non offrono una sorta di API, questo potrebbe diventare complicato.

Aggiornamento: sì, vorrei verificare con il vostro registrar se stanno fornendo anche il servizio del server dei nomi (come spesso accade). Non ho mai esplorato questa opzione prima, ma sospetto che la maggior parte dei registrar dei consumatori non lo faccia. Ho cercato su Google le API di GoDaddy e le API DNS di GoDaddy ma non sono stato in grado di alzare nulla, quindi immagino che l'opzione migliore sarebbe quella di consultare la guida in linea con il tuo provider e, se ciò non risponde alla domanda, ottenere una sospensione del loro staff di supporto.


3

Innanzitutto, è necessario assicurarsi che il server sia configurato per consentire i sottodomini con caratteri jolly. L'ho raggiunto in JustHost creando un sottodominio chiamato manualmente *. Ho anche specificato una cartella chiamata subdomainscome radice del documento per i sottodomini jolly. Aggiungi questo a un .htaccessfile nella cartella dei sottodomini:

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

Infine, tutto ciò che devi fare è creare una cartella nella cartella dei sottodomini, quindi posizionare i file del sottodominio in quella directory.


3

Ciò può essere ottenuto a .htaccesscondizione che il server sia configurato per consentire i sottodomini con caratteri jolly. L'ho raggiunto in JustHost creando un sottodominio chiamato manualmente *e specificando una cartella chiamata sottodomini come radice del documento per i sottodomini jolly. Aggiungi questo al tuo .htaccessfile:

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

Infine, crea una cartella per il tuo sottodominio e posiziona i file dei sottodomini.


1

Volevo solo aggiungere che se usi CloudFlare (gratuito), puoi usare la loro API per gestire facilmente i tuoi DNS.


0

Crea sottodomini dinamici usando PHP e Htaccess

(1) Root .htaccess

Questo file è il reindirizzamento http://www.yourwebsite.com a http://yourwebsite.com per l'uso della home page. Tutto il reindirizzamento del sottodominio su yourwebsite_folder

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) Inside Folder .htaccess

Questo file sta riscrivendo gli URL del sottodominio.

http://yourwebsite.com/index.php?siteName=9lessons su 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

Altri suggerimenti .htaccess: Tutorial e suggerimenti per i file Htaccess.

index.php

Questo file contiene un semplice codice PHP, usando espressioni regolari che convalidano il valore del sottodominio.

<?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>

Nessuna cartella sottodominio

Se si utilizza la directory principale (htdocs / public_html) come directory del progetto, utilizzare questo seguente file .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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.