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
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];
}
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!
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.