Utilizzo di mod_rewrite per i sottodomini
-
06-07-2019 - |
Domanda
Non voglio che le persone siano in grado di registrare le proprie sezioni all'interno del mio sito e che tali sezioni siano il proprio sottodominio del mio sito. così qualcuno può registrare 'test' e fare in modo che 'test.example.com' faccia riferimento al proprio sito che sarebbe su /site.php?id=1 Quindi come potrei fare per scrivere una regola mod_rewrite per questo?
Soluzione
mod_rewrite
potrebbe non essere lo strumento migliore per questo. RewriteRules è ottimo per mappare un file su qualcos'altro, ma non è stato pensato per la corrispondenza del dominio.
Il meglio che puoi fare usando mod_rewrite
è il seguente:
RewriteEngine On
# Skip www.domain.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L]
Che non è davvero utile. Cosa consiglierei di fare invece se controlli a livello di codice il valore di HTTP_HOST
come tale:
function get_subdomain() {
if(preg_match('/^([^.]+)\.domain\.com/i', mod_rewrite
potrebbe non essere lo strumento migliore per questo. RewriteRules è ottimo per mappare un file su qualcos'altro, ma non è stato pensato per la corrispondenza del dominio.
Il meglio che puoi fare usando mod_rewrite
è il seguente:
RewriteEngine On
# Skip www.domain.com
RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L]
Che non è davvero utile. Cosa consiglierei di fare invece se controlli a livello di codice il valore di HTTP_HOST
come tale:
<*>SERVER['HTTP_HOST'], $matches))
return $matches[1];
}
Altri suggerimenti
Puoi configurare apache per rivendicare la " speciale " domini nella configurazione di Apache (ad es. www.mydomain.com, ecc.), nei contenitori dell'host virtuale e avere gli altri predefiniti nel primo host virtuale. Puoi quindi riscrivere l'URL di base in un'applicazione di invio che controlla l'URL e invia l'utente nell'area corretta.
Dai documenti Apache 2.0:
Quasi ogni direttiva Apache può andare in un contenitore VirtualHost. Il viene utilizzata la prima sezione VirtualHost richieste senza un nome server noto.
Metti il ??codice per gestire * .mydomain.com nel primo host virtuale:
<VirtualHost *:80>
Servername custom.mydomain.com
DocumentRoot /var/www/html/custom
RewriteEngine on
RewriteRule ^/$ /var/www/cgi-bin/dispatch.cgi [R]
# more configs here
</VirtualHost>
<VirtualHost *:80>
Servername www.mydomain.com
DocumentRoot /var/www/html/homepage
# more configs here
</VirtualHost>
In dispatch.cgi, controlla l'URL di chiamata per determinare dove l'utente dovrebbe andare. Assicurati di aver impostato il tuo DNS per accettare tutti i sottodomini.
Spero che ti aiuti!
In realtà, abbiamo usato questa tecnica senza molti problemi per l'anno scorso. La nostra configurazione mod_rewrite è simile a:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} !www.mydomain.com
RewriteCond %{HTTP_HOST} ^([^.]+)\.mydomain\.com
RewriteCond %{REQUEST_URI} !admin
RewriteRule (.*) /admin/ [R=301,L]
RewriteRule ^admin(.*)$ hosted/admin/$1 [QSA,L]
Quello che succede è che gli utenti sono indirizzati al loro account.mydomain.com/admin.
Usiamo quindi PHP per identificare la parte dell'account del nome di dominio. Usare qualcosa come $ _SERVER ['SERVER_NAME'] o un metodo per ottenere il nome di dominio e analizzarlo funziona molto bene.
Conserva queste configurazioni nel httpd.conf, questo diventerà un problema della cpu nei siti a traffico più elevato se viene mantenuto come .htaccess.