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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top