Come consentire a PHP di creare automaticamente un sottodominio per ciascun utente?
Domanda
Come posso 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 devo usare un linguaggio esterno di script-server esterno?
A chi ha risposto: Beh, allora dovrei chiedere al mio hosting se forniscono una sorta di accesso DNS ??
Soluzione
Stai cercando di creare un A record .
personalizzatoSono 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ù semplice da impostare se è un'opzione.
Quindi potresti semplicemente aggiungere un file .htaccess che assomiglia a questo:
Options +FollowSymLinks
RewriteEngine On
RewriteRule ^([aA-zZ])$ dostuff.php?username=$1
In quanto sopra, i nomi utente sono limitati ai caratteri a-z
La regola di riscrittura per afferrare il sottodominio sarebbe simile a questa:
RewriteCond %{HTTP_HOST} ^(^.*)\.mywebsite.com
RewriteRule (.*) dostuff.php?username=%1
Altri suggerimenti
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.
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.
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.
Utilizziamo il seguente codice:
$url= 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.
Utilizziamo il seguente codice:
<*>
Questo codice imposta semplicemente la variabile $ account
sullo stesso 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.
SERVER["REQUEST_URI"];
$account=str_replace(".yourdomain.com","",$url);
Questo codice imposta semplicemente la variabile $ account
sullo stesso 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.
Non scherzare con i file .htaccess quando è possibile utilizzare Apache mass virtual che ospita .
Dalla documentazione:
#include parte del nome del server nei nomi dei file 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_ROOT
non è impostata correttamente sulla sottodirectory utilizzata , ma la root_documento predefinita in de htconfig.
Soluzione PHP semplice per sottodomini e app Web multi-dominio
Passaggio 1. Fornisci il record DNS A come " * " per i domini (o domini) servirai " example.org "
A record => *.example.org
A record => *.example.net
Passaggio 2. Verificare l'unicità degli accessi quando l'utente 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('.', Soluzione PHP semplice per sottodomini e app Web multi-dominio
Passaggio 1. Fornisci il record DNS A come " * " per i domini (o domini) servirai " example.org "
A record => *.example.org
A record => *.example.net
Passaggio 2. Verificare l'unicità degli accessi quando l'utente registra o modifica l'accesso.
Inoltre, evita i punti in questi accessi.
Passaggio 3. Quindi controllare la query
qwerty.example.org
qwerty.example.net
johnsmith.somecompany.com
paulsmith.somecompany.com
Questa soluzione può servire domini diversi
smith.example.org // Show info about John Smith
smith.example.net // Show info about Paul Smith
Se hai bisogno degli stessi nick su domini diversi offerti in modo diverso,
potrebbe essere necessario memorizzare la scelta dell'utente per il dominio durante la registrazione dell'accesso.
<*>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
<*>Se hai bisogno degli stessi nick su domini diversi offerti in modo diverso, potrebbe essere necessario memorizzare la scelta dell'utente per il dominio durante la registrazione dell'accesso.
<*>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 suo sottodominio.
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 tuo 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 credo 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 personale di supporto.
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 denominata sottodomini
come radice del documento per i sottodomini con caratteri jolly. Aggiungi questo a un file .htaccess
nella tua 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.
Ciò può essere ottenuto in .htaccess
purché il server sia configurato per consentire i sottodomini jolly. L'ho raggiunto in JustHost creando un sottodominio manualmente chiamato *
e specificando una cartella denominata sottodomini come radice del documento per i sottodomini jolly. Aggiungi questo al tuo file .htaccess
:
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.
Volevo solo aggiungere che se usi CloudFlare (gratuito), puoi usare la loro API per gestire facilmente i tuoi dns.