2008-09-08 15 views
6

J'utilise Helicon's ISAPI Rewrite 3, qui active essentiellement .htaccess dans IIS. J'ai besoin de rediriger une URL autre que www vers la version www. Par exemple, example.com doit rediriger vers www.example.com. J'ai utilisé la règle suivante à partir des exemples mais il touche: sous-domainesRediriger l'URL non-www vers www .htaccess

RewriteCond %{HTTPS} (on)? 
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC] 
RewriteCond %{REQUEST_URI} (.+) 
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L] 

Cela fonctionne pour la plupart partie, mais est aussi réoriente sub.example.com à www.sub.example.com. Comment puis-je réécrire la règle ci-dessus afin que les sous-domaines ne soient pas redirigés?

Répondre

3

Ajoutez le RewriteCond suivant:

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC] 

De cette façon, ça ne va appliquer la règle à nondottedsomething.uptofiveletters comme vous pouvez le voir, subdomain.domain.com ne correspondra pas à la condition et va donc ne pas être réécrit.

Vous pouvez modifier [a-z] {2,5} pour une expression régulière plus stricte tld, et placer toutes les contraintes pour les caractères autorisés dans les noms de domaine (car [^.] + Est plus permissif que strictement nécessaire).

Dans l'ensemble je pense que dans ce cas ce ne serait pas nécessaire.

EDIT: Sadie repéré une faille sur l'regex, a changé la première partie de [^.] À [^.] +

+0

dites-vous que je devrais remplacer la ligne 2 avec votre condition, ou ajouter votre condition sur une nouvelle ligne? Est-ce que l'ajouter sur une nouvelle ligne affectera RewriteRule en utilisant les% 1,% 2 et% 3? – chrisofspades

0

Vous ne pouvez pas ajuster le RewriteCond pour fonctionner uniquement sur example.com?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC] 
+0

il devrait être^exemple \ .com $ à la place. En tout cas, j'ai l'impression que chris veut une solution générique, pas une pour un seul domaine. –

1

J'ai obtenu plus de contrôle à l'aide urlrewriter.net, quelque chose comme:

<unless header="Host" match="^www\."> 
    <if url="^(https?://)[^/]*(.*)$"> 
    <redirect to="$1www.domain.tld$2"/> 
    </if> 
    <redirect url="^(.*)$" to="http://www.domain.tld$1"/> 
</unless> 
0

Pourquoi ne pas avoir quelque chose comme ça dans votre fichier vhost (de httpd)?

ServerName: www.example.com 
ServerAlias: example.com 

Bien sûr, qui redirigent l'habitude, qui va tout simplement continuer comme normale

1

Zigdon a la bonne idée, sauf son regex n'est pas tout à fait raison. Utilisez

^example\.com$

au lieu de sa suggestion de:

^example\.com(.*)

Sinon, vous ne serez pas seulement example.com harmoniser à, vous comme une correspondance des choses example.comcast.net, example.com.au, etc.

1

@Vinko

Pour votre approche générique, je ne suis pas sûr wh y avez-vous choisi de limiter la longueur du TLD dans votre regex? Ce n'est pas très à l'épreuve du futur, et je ne sais pas quel avantage cela apporte? Ce n'est même pas "maintenant-preuve" parce qu'il y a au moins un TLD à 6 caractères (.museum) qui ne sera pas égalé.

Il me semble inutile de le faire. Ne pourriez-vous pas simplement faire ^[^.]+\.[^.]\+$? (note: le point d'interrogation fait partie de la phrase, pas la regex!Tout cela mis à part, il y a un plus gros problème avec cette approche qui est: elle échouera pour les domaines qui ne sont pas directement sous le TLD. Il s'agit de domaines en Australie, au Royaume-Uni, au Japon et dans de nombreux autres pays, qui ont des hiérarchies: .co.jp, .co.uk, .com.au, etc.

Si oui ou non c'est de toute préoccupation à l'OP, je ne sais pas, mais il y a quelque chose à être au courant si vous êtes après une réponse « réparer tous ».

L'OP n'a pas encore précisé s'il veut une solution générique ou une solution pour un seul (ou petit groupe) de domaines connus. Si c'est le dernier, voir mon autre remarque sur l'utilisation de l'approche de Zigdon. Si c'est le premier, alors procéder à l'approche de Vinko en tenant compte de l'information dans ce post.

Edit: Une chose que je l'ai laissé de côté jusqu'à présent, ce qui peut ou ne peut pas être une option pour vous est d'aller dans l'autre sens sage affaires,. Tous nos sites redirigent vers http://domain.com. Les gens à http://no-www.org font un assez bon cas (à mon humble avis) pour que ce soit la «bonne» façon de le faire, mais c'est toujours juste une question de préférence. Une chose est sûre cependant, il est beaucoup plus facile d'écrire une règle générique pour ce type de redirection que celle-ci.

1

@org 0100h Oui, il y a de nombreuses variables à gauche de la description du problème, et tous vos points sont ceux valables et devraient être traités en cas d'une mise en œuvre effective. Il y a des avantages et des inconvénients à votre regex proposé. D'une part, c'est plus facile et futur, d'autre part, voulez-vous vraiment faire correspondre le fichier example.foobar s'il est envoyé dans l'entête Host? Il peut y avoir des cas de limites lorsque vous finissez par rediriger vers le mauvais domaine. Une alternative thrid modifie l'expression rationnelle d'utiliser une liste des domaines réels, si plus d'un, comme

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC] 

(Note à chris, que l'on va changement% 1)

@chrisofspades Il est pas destiné à le remplacer, votre condition numéro deux assure qu'il n'a pas www, contrairement à la mienne. Il ne changera pas les valeurs de% 1,% 2,% 3 car il ne stocke pas les correspondances (par exemple, il n'utilise pas de parenthèses).

Questions connexes