Question

j'utilise Réécriture ISAPI 3 d'Helicon, qui active essentiellement .htaccess dans IIS.Je dois rediriger une URL non-www vers la version www, c'est-à-direexample.com doit rediriger vers www.example.com.J'ai utilisé la règle suivante tirée des exemples mais elle affecte les sous-domaines :

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, mais redirige également sub.example.com vers www.sub.example.com.Comment puis-je réécrire la règle ci-dessus afin que les sous-domaines ne soient pas redirigés ?

Était-ce utile?

La solution

Ajoutez le RewriteCond suivant :

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

De cette façon, la règle n'appliquera que les nondottedsomething.uptofiveletters, comme vous pouvez le voir, subdomain.domain.com ne correspondra pas à la condition et ne sera donc pas réécrit.

Vous pouvez modifier [a-z]{2,5} pour une expression régulière de correspondance tld plus stricte, ainsi que 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.

MODIFIER:sadie a repéré une faille dans l'expression régulière et en a changé la première partie de [^.] à [^.]+

Autres conseils

J'ai plus de contrôle en utilisant 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>

Zigdon a la bonne idée, sauf que sa regex n'est pas tout à fait correcte.Utiliser

^example\.com$

au lieu de sa suggestion de :

^example\.com(.*)

Sinon, vous ne ferez pas simplement correspondre example.com, vous ferez correspondre des éléments comme example.comcast.net, example.com.au, etc.

@Vinko

Pour votre approche générique, je ne sais pas pourquoi vous avez choisi de limiter la longueur du TLD dans votre regex ?Ce n'est pas très évolutif, et je ne suis pas sûr de l'avantage que cela apporte ?En fait, ce n'est même pas "à l'épreuve du temps" car il existe au moins un TLD à 6 caractères (.museum) qui ne correspondra pas.

Cela me semble inutile de faire cela.Tu ne pourrais pas simplement faire ^[^.]+\.[^.]\+$?(note:le point d'interrogation fait partie de la phrase, pas de l'expression régulière !)

Tout cela mis à part, il y a un problème plus important avec cette approche :cela é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.

Que cela préoccupe ou non le PO, je ne sais pas, mais c'est quelque chose dont il faut être conscient si vous recherchez une réponse « réparer tout ».

Le PO n'a pas encore précisé s'il souhaitait une solution générique ou une solution pour un seul (ou un petit groupe) de domaines connus.Si c'est ce dernier cas, consultez mon autre note sur l'utilisation de l'approche de Zigdon.Si c'est le premier cas, suivez l'approche de Vinko en tenant compte des informations contenues dans cet article.

Modifier:Une chose que j’ai laissée de côté jusqu’à présent, et qui peut ou non être une option pour vous du point de vue commercial, est d’aller dans l’autre sens.Tous nos sites redirigent http://www.domain.com à http://domaine.com.Les gens à http://no-www.org faites de bons arguments (à mon humble avis) pour dire que c'est la "bonne" façon de le faire, mais ce n'est certainement qu'une question de préférence.Une chose est sûre cependant, il est bien plus facile d'écrire une règle générique pour ce type de redirection que celle-ci.

@org 0100h Oui, de nombreuses variables sont exclues de la description du problème, et tous vos points sont valables et doivent être traités en cas de mise en œuvre réelle.Il y a à la fois des avantages et des inconvénients à votre proposition d'expression régulière.D'une part, c'est plus facile et évolutif, d'autre part, voulez-vous vraiment faire correspondre example.foobar s'il est envoyé dans l'en-tête Host ?Il peut y avoir des cas extrêmes où vous finirez par rediriger vers le mauvais domaine.Une troisième alternative consiste à modifier l'expression régulière pour utiliser une liste des domaines réels, s'il y en a plusieurs, comme

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

(Note à Chris, celui-là volonté changer %1)

@chrisofspades Ce n'est pas destiné à le remplacer, votre condition numéro deux garantit qu'il n'a pas de www, alors que le mien n'en a pas.Il ne changera pas les valeurs de %1, %2, %3 car il ne stocke pas les correspondances (iow, il n'utilise pas de parenthèses).

Ne pouvez-vous pas ajuster le RewriteCond pour qu'il fonctionne uniquement sur example.com ?

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

Pourquoi n'avez-vous pas simplement quelque chose comme ça dans votre fichier vhost (de httpd) ?

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

Bien sûr, cela ne redirigera pas, cela continuera comme d'habitude

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top