2009-07-31 7 views
2

Je ne voulais pas que les personnes puissent enregistrer leurs propres sections sur mon site et que ces sections soient leur propre sous-domaine. donc quelqu'un peut enregistrer 'test' et avoir 'test.example.com' se référer à leur site qui serait à dire /site.php?id=1 Alors, comment pourrais-je écrire une règle mod_rewrite pour cela?Utilisation de mod_rewrite pour les sous-domaines

Répondre

2

mod_rewrite n'est peut-être pas le meilleur outil pour cela. RewriteRules sont parfaits pour mapper un fichier sur autre chose, mais ce n'était pas vraiment destiné à la recherche de domaine.

Le mieux que vous pouvez faire en utilisant mod_rewrite est la suivante:

RewriteEngine On 
# Skip www.domain.com 
RewriteCond %{HTTP_HOST} !^www\. 
RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.com 
RewriteRule ^/(.*)$ site.php?domain=%1&file=$1 [L] 

Ce qui est pas vraiment utile. Ce que je recommande de le faire au lieu de vérifier si la valeur de programme HTTP_HOST en tant que telle:

function get_subdomain() { 
    if(preg_match('/^([^.]+)\.domain\.com/i', $_SERVER['HTTP_HOST'], $matches)) 
    return $matches[1]; 
} 
0

Vous pouvez configurer apache pour revendiquer les domaines « spéciaux » dans la configuration apache (par exemple www.mydomain.com, etc.), dans vos conteneurs hôtes virtuels et les autres par défaut à votre premier hôte virtuel. Vous pouvez ensuite réécrire l'URL de base à une application de répartition qui inspecte l'URL et envoie l'utilisateur à la bonne zone.

De Apache 2.0 docs:

Presque toute directive Apache peut aller dans un récipient VirtualHost. La première section VirtualHost est utilisée pour les demandes sans nom de serveur connu.

Mettre le code pour gérer * .mydomain.com dans le premier hôte virtuel:

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

En dispatch.cgi, vérifiez l'URL appelant pour déterminer où l'utilisateur doit aller. Assurez-vous de configurer votre DNS pour accepter tous les sous-domaines.

Espérons que ça aide!

0

En fait, nous avons utilisé cette technique sans trop de problème pour l'année écoulée. Notre config mod_rewrite ressemble:

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] 

Qu'est-ce qui se passe, est que les utilisateurs sont dirigés vers theiraccount.mydomain.com/admin. Nous utilisons ensuite PHP pour identifier la partie compte du nom de domaine. Utiliser quelque chose comme $ _SERVER ['SERVER_NAME'] ou une méthode pour obtenir le nom de domaine et l'analyser fonctionne très bien. Conservez ces configs dans le fichier httpd.conf, cela deviendra un problème de processeur dans les sites à fort trafic s'il est conservé en tant que .htaccess.

Questions connexes