.htaccess - comment forcer "www." de manière générique?

102

Cela changera domain.comen www.domain.com:

# Force the "www."
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

Comment remplacer la partie "domaine" pour que cela fonctionne sur n'importe quel domaine?

StackOverflowNewbie
la source

Réponses:

249

J'utiliserais cette règle:

RewriteEngine On
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

La première condition vérifie si la valeur de l' hôte n'est pas vide (dans le cas de HTTP / 1.0); le second vérifie si la valeur Host ne commence pas par www.; les troisièmes vérifications pour HTTPS ( %{HTTPS}est soit onou off, si %{HTTPS}sest soit onsou offs, en cas de onsl' sest adaptée). La partie de substitution de RewriteRulepuis fusionne simplement les parties d'informations en une URL complète.

Gombo
la source
31
Cette solution ne fonctionne que si vous souhaitez que tous les sous-domaines soient redirigés vers www.votredomaine.com. Si vous ne voulez forcer que www, vous devez mettre à jour la deuxième ligne comme RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
suit
2
Je ne reçois aucun de mes sous-domaines transférés vers www.mondomaine.com en utilisant la règle publiée dans la question ...
lol
3
très intelligent! J'aime que vous ayez forcé le contrôle HTTPS pour renvoyer un "S" dans le groupe de capture, que vous avez utilisé sur la ligne suivante. very elegant
code_monk
Semble comme une réponse universelle, couvre les protocoles HTTP et normaux, fonctionne comme un charme.
Clain Dsilva
1
Merci! J'ajouterais RewriteEngine Oncomme première ligne pour le compléter, car cela pourrait conduire à une erreur de serveur 500 s'il était copié tel quel.
Ryan Casas
44

Cela le fera:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Martin Drapeau
la source
5

Si vous souhaitez rediriger toutes les requêtes non-www vers votre site vers la version www, il vous suffit d'ajouter le code suivant à votre fichier .htaccess:

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

Cela ne fonctionnera pas avec les sous-domaines.

domain.com est correctement redirigé vers www.domain.com

mais

images.domain.com est redirigé vers www.images.domain.com

Au lieu de vérifier si le sous-domaine n'est "pas www", vérifiez s'il y a deux points:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ HTTP%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
john mccarthy
la source
J'aime cette solution. Quoi qu'il en soit, pour accomplir la même chose avec des TLD comme .co.uk?
TylersSN
1
@iUseMagentoNow augmentez simplement les points, par exemple: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](Strictement parlant, votre TLD est toujours .uket votre domaine l'est something.co.)
mirabilos
Dans ce cas, .co est un domaine de deuxième niveau et ne fait pas partie de votre domaine alors que .uk est un TLD de code de pays. Pour être honnête, après avoir travaillé dans l'industrie de l'hébergement et vu les nouveaux formats de noms de domaine, je ne peux pas voir les formats TLD actuels durer pour autre chose que des utilisations officielles. gouvernements, organisations, etc. Dans un proche avenir, lorsque vous pourrez enregistrer fqdn comme, fred.bloggs pour un prix similaire aux normes actuelles, le site Web personnel sera très différent d'un point de vue DNS.
Chris le
1

Ce qui suit doit préfixer «www» à toute demande qui n'en a pas, et rediriger la demande modifiée vers le nouvel URI.

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

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

Cela redirige example.comvers l' www.example.comexclusion des sous-domaines.

Amit Verma
la source
Pour moi, cela semble envoyer www.example.com à www.www.example.com haha
Albert Renshaw
@Albert C'est peut-être à cause du cache de votre navigateur. Videz votre cache et réessayez.
Amit Verma
Vous avez raison! Je viens de courir en mode incognito (chrome) et cela a bien fonctionné, merci!
Albert Renshaw
1
J'aime beaucoup cette règle générique. Mais cela ne fonctionne pas pour domain.co.uk car il contient déjà deux points. Comment cette règle pourrait-elle être modifiée pour qu'elle fonctionne également pour .co.uk?
Sacha Vorbeck
1
Pour .co.uk et autres sous cctlds cela fonctionne: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $ Mais malheureusement il y en a des mixtes tlds tapés ( wiki.mozilla.org/TLD_List ) comme es qui autorisent domain.es ainsi que domain.com.es. Ajouter | es à l'expression régulière correspondrait à domain.es ainsi qu'à www.domain.es, ce qui n'est pas souhaité ici. Je dois trouver un moyen de gérer ces sous-cctld typés mixtes
Sacha Vorbeck
-1

cela a fonctionné comme par magie pour moi

RewriteCond% {HTTP_HOST} ^ sitename.com [NC] RewriteRule ^ (. *) $ Https://www.sitename.com/ $ 1 [L, R = 301, NC]

SamYah
la source