2010-12-09 17 views
9

Je ne suis pas trop familier avec les fichiers .htaccess, et je suis en train d'exclure un sous-domaine (quelque chose comme dev.example.com) de la règle de réécriture suivante qui est déjà en place:L'exclusion d'un sous-domaine des règles mod_rewrite .htaccess?

RewriteEngine On 
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301] 

Cette règle interdit à quiconque de pénétrer tout example.com ou http://example.com et force la présentation souhaitée de l'URL, http://www.example.com.

J'ai essayé quelques options d'exclure un sous-domaine de cette règle de réécriture, mais en vain. Chacun des répertoires sur le site ont leur propre. Fichier htaccess, mais il semble que celui-ci prenne encore la préséance Toutes les idées? Merci!

Répondre

12

La règle existante exclut déjà un sous-domaine. Vous avez juste besoin d'ajouter une nouvelle condition:

RewriteEngine On 
RewriteCond %{HTTP_HOST} !^www\.example\.com$ [NC] 
RewriteCond %{HTTP_HOST} !^dev\.example\.com$ [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301] 

Vous pouvez également vous débarrasser des expressions régulières:

RewriteEngine On 
RewriteCond %{HTTP_HOST} !=www.example.com [NC] 
RewriteCond %{HTTP_HOST} !=dev.example.com [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301] 

La syntaxe se trouve à http://httpd.apache.org/docs/2.2/en/mod/mod_rewrite.html#rewritecond

+0

Cette syntaxe semble fonctionner, mais provoque des erreurs de récursivité. Des idées? – MindSculpt

+0

Cependant, votre premier exemple semble effectivement fonctionner, en utilisant des expressions régulières ... – MindSculpt

+0

Les deux extraits doivent être équivalents et fonctionner pour moi. Je vous suggère de nettoyer le cache de votre navigateur et d'essayer à nouveau. –

2

Je ne sais pas si cela pourrait convenir à vous, mais il est recommandé d'utiliser la configuration apache virtualhosts au lieu des fichiers .htaccess. Dans ce cas, pour le non-www - redirect> www, je l'habitude d'utiliser quelque chose comme:

<VirtualHost *:80> 
    ServerName example.com 
    RedirectMatch permanent ^(.*) http://www.example.com$1 
</VirtualHost> 

qui est généralement plus sûr qu'une règle mod_rewrite.

+0

Puisque vous ne correspondez à rien, 'Redirect' ou' RedirectPermanent' devrait suffire. –

+0

J'ai écrit ce morceau de configuration il y a longtemps et je l'ai réutilisé à plusieurs endroits, donc je ne me souviens pas exactement pourquoi j'ai utilisé 'RedirectMatch' au lieu de' Redirect', mais je suppose que c'était la seule façon pour préserver le chemin complet de la requête, au lieu de simplement rediriger vers la nouvelle URL fixe. IE: 'http: // exemple.com/chemin/vers/page.html' redirigerait vers' http: // www.example.com/chemin/vers/page.html'. – redShadow

+0

Toutes les directives 'Redirect *' fonctionnent de cette façon ;-) –

2
RewriteEngine On 
RewriteCond %{HTTP_HOST} !^(dev|www)\.example\.com$ [NC] 
RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301]