2010-11-22 22 views
2

Je sucent les règles de réécriture donc .. aie pitié de moi> _>Combinant deux règles mod_rewrite

Je veux obtenir ces deux règles à travailler ensemble .. fondamentalement, je veux enlever le www chaque fois que son utilisé, puis de l'envoyer tous demande à index.php avec une variable GET si theres choses après le domaine ..

Par exemple: www.example.com et www.example.com/foo irait respectivement à example.com et example.com/foo.

Heres ce que je dois fusionner:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    RewriteCond %{HTTP_HOST} ^www.example.com$ [NC] 
    RewriteRule ^(.*)$ http://example.com/$1 [R=301,L] 
    RewriteCond  %{REQUEST_FILENAME}  !-d 
    RewriteCond  %{REQUEST_FILENAME}  !-f 
    RewriteRule  (.*) index.php?token=$1 [QSA,L] 
</IfModule> 

Je nai testé ce donc je Donno .. mais je doute fort que je l'ai droit. : Juste pour clarifier, je ne veux pas dire que le besoin d'être une règle, mais vont-ils travailler ensemble comme prévu?

+0

Je ne comprends pas. Est-ce que ça ne marche pas très bien? Pourquoi cela doit-il être une règle? –

+0

Pas besoin de fusionner. Le 301 arrivera si la condition n'échoue pas, et alors il sera sauté et la deuxième règle commencera. – Stephen

+0

Et si je voulais joker les domaines? Il y aura plusieurs domaines pointés sur ce serveur et je veux domaine que l'utilisateur a tapé cliqué pour être préservé pour les statistiques, etc. – Gary

Répondre

3

Cela devrait être OK car votre première règle est marquée [L] Dernière et [R] Redirection - les deux règles n'auront donc pas à traiter en même temps. Le premier va traiter, rediriger, effacer le premier, puis le second processus.

Vous pouvez utiliser [C] pour enchaîner les conditions - ce qui signifie que si la première passe, la suivante est essayée, mais si la première échoue, alors tous les subséquents chaînés sont ignorés. Je ne pense pas que ce soit ce que tu veux ici. Si quelque chose, vous voudriez une directive [OR].

Votre rewrite semble décent, sauf peut-être que la dernière, qui - si vous utilisez cela pour un site CodeIgniter - habituellement ressembler à:

RewriteRule ^(.*)$ index.php?/$1 [L] 

En tant que meilleure pratique, vous devriez configurer un site en double sur un site test-subdomain.example.com afin de pouvoir jouer avec des choses comme celle-ci aussi près que possible d'un environnement en direct.

à votre commentaire: si vous voulez wildcard les domaines, il suffit:

RewriteCond %{HTTP_HOST} ^www\.[^.]+\.com$ [NC] 
RewriteRule ^[^.]+.([^.]+).com/(.*)$ http://$1.com/$2 [R=301,L] 
+0

Est-il possible de joker les domaines? – Gary

+0

Désolé de déranger à nouveau, mais si je voulais que le TLD soit aussi générique, ce serait juste quelque chose comme^www \. [^.] + \. [^.] $ Et^[^.] +. ([^. ] +). [^.]/(. *) $ http: //$1.$2/$3 .. ou est-ce que j'ai tort? – Gary

0

Généralement, un site Web complexe peut avoir des centaines de règles dans le fichier .htaccess, chacune avec son propre jeu de RewriteCond. Il n'est pas nécessaire de les fusionner en une règle englobante.