Rediriger non-www vers www dans .htaccess

191

J'ai ceci dans mon fichier .htaccess:

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

mais chaque fois que j'accède à un fichier sur ma racine comme http://example.com/robots.txtil sera redirigé vers http://www.example.comrobots.txt/.

Comment puis-je corriger cela pour qu'il redirige correctement vers http://www.example.com/robots.txt?

Paul Sanchez
la source

Réponses:

394

Changez votre configuration pour ceci (ajoutez une barre oblique):

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

Ou la solution décrite ci-dessous (proposée par @absiddiqueLive ) fonctionnera pour n'importe quel domaine:

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

Si vous devez prendre en charge http et https et conserver le choix de protocole, essayez ce qui suit:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Où vous remplacez loginpar checkout.phpou quelle que soit l'URL dont vous avez besoin pour prendre en charge HTTPS.

Je dirais cependant que c'est une mauvaise idée. Pour le raisonnement, veuillez lire cette réponse .

Randall Hunt
la source
Cette solution ne fonctionne pas lorsque certaines pages (comme la connexion ou l'inscription) utilisent le protocole https.
Alexey Kosov
J'ai légèrement mis à jour le message pour inclure des informations. Il est difficile de choisir à la fois génériquement et correctement le protocole à utiliser.
Randall Hunt
3
La première solution ne redirige pas assez, la 2ème semble trop rediriger. Par exemple blog.example.comdevientwww.blog.example.com
gman
Pourriez-vous s'il vous plaît également ajouter comment éviter la redirection lors du développement sur localhost?
Bugs Bunny
J'ai tout suivi ici mais rien ne fonctionne. J'utilise une configuration laravel. Quelqu'un at-il une idée de pourquoi cela ne fonctionne pas pour moi? www.domain.com et domain.com se chargent tous les deux correctement, mais domain.com ne redirige pas vers www.domain.com. Cela pourrait-il être un problème avec mon DNS?
bonjour le monde le
94

Voici la bonne solution qui prend en charge https et http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Alexey Kosov
la source
7
C'est parfait, cela ne redirige pas non plus les sous-domaines wwwcomme le font les autres solutions génériques.
Fabian Schmengler
4
C'est une meilleure solution, fonctionne beaucoup mieux que la réponse acceptée et prend en charge le HTTPS correctement
Tamik Soziev
3
Fonctionne parfaitement! Et en si peu de lignes!
zeckdude
8
CECI EST LA MEILLEURE RÉPONSE
Andrew
9
Si je ne me trompe pas, cela ne fonctionnerait pas pour plus d'un point. Exemples:yoursite.co.uk
TrashyMcTrash
83
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

Pour Https

RewriteCond %{HTTPS}s ^on(s)|

RewriteRule ^(.*)$ http%1://www.%{HTTP_HOST}/$1 [R=301,L]
absiddiqueLive
la source
8
Cette solution est préférée à @ ranman car elle fonctionnera pour tous les domaines, minimisant ainsi les erreurs humaines lorsque vous implémentez du code pour un nouveau projet ou lorsque vous implémentez des domaines supplémentaires dans un projet existant.
Frankie
Je préfère cette solution, mais pourquoi ^(.*)$au lieu de (.*)?
Popnoodles
cette solution est meilleure mais j'ai édité la mienne pour contenir la vôtre également.
Randall Hunt
1
Cela fonctionne pour tous les domaines, c'est simple et efficace! Merci
eirenaios
vous pouvez suivre RewriteCond% {HTTPS} s ^ sur (s) | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive
24

L'exemple suivant fonctionne à la fois sur ssl et non-ssl et est beaucoup plus rapide car vous n'utilisez qu'une seule règle pour gérer http et https

RewriteEngine on


RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s on(s)|offs()
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

[Testé]

Cela redirigera

http

à

https

à

Amit Verma
la source
1
Très proche de ce que j'ai imaginé. Prend également en charge plus d'un point dans l'hôte HTTP, par exemple "mysite.co.uk".
Adambean
2
Juste par curiosité, pourquoi n'utilisez-vous pas R = 301 ici? Il utilisera 302 (température déplacée) par défaut si aucun code n'est spécifié.
Marc
1
Fonctionne parfaitement. Cela devrait être la réponse acceptée.
James Nisbet
8

Essayez ceci, je l'ai utilisé dans de nombreux sites Web, cela fonctionne parfaitement

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]
Ali Aboussebaba
la source
4

J'ai testé toutes les solutions ci-dessus mais ne fonctionne pas pour moi, j'ai essayé de supprimer le http: // et je ne redirige pas également supprimé le www il redirige bien, donc je suis confus, en particulier je lance tous mes sites sous https : //

J'ai donc combiné certains codes et j'ai trouvé une solution parfaite pour http: // et https: // et www et non-www.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

J'espère que cela peut aider quelqu'un :)

Jeux Mizo
la source
3

Cette configuration a fonctionné pour moi dans bitnami wordpress avec SSL configuré:

Ajout de ce qui suit sous "RewriteEngine On" dans le fichier /opt/bitnami/apps/wordpress/conf/httpd-app.conf

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Abhilash Mishra
la source
2
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteRule (.*) http://www.domain.com/$1 [L,R=301]

Cela redirigera votre domaine qui n'est pas démarré avec WWW. Cela ne redirigera pas tout votre sous-domaine.

C'est utile.

Ashish Gondaliya
la source
2

Je pense que la meilleure réponse redirige avec succès non-www vers www (ex: mysite.com -> www.monsite.com ), mais ne prend pas en compte les sous-domaines génériques, ce qui entraîne:

random.mysite.com -> www.random.mysite.com

Voici une solution avec / sans HTTPS

HTTP

RewriteEngine On

RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
RewriteRule ^(.*)$ http%{ENV:protossl}://www.mysite.com/$1 [L,R=301] 

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

* Remarque: je n'ai pas testé https car je n'ai actuellement pas de certificat à tester, mais si quelqu'un peut vérifier ou optimiser ce que j'ai, ce serait génial.

Chasseur Frazier
la source
Que fait le premier $ ici: '^ (. *) $'
Vaishal Patel
0

Si possible, ajoutez-le au fichier de configuration principal d'Apache. C'est une solution plus légère, moins de traitement requis.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin [email protected]
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Ainsi, le séparé VirtualHostpour "example.com" capture ces demandes et les redirige en permanence vers votre main VirtualHost. Il n'y a donc pas d'analyse REGEX à chaque requête, et vos navigateurs clients mettront en cache la redirection pour ne plus jamais (ou rarement) demander la "mauvaise" URL, vous épargnant ainsi la charge du serveur.

Remarquez, la barre oblique de fin Redirect permanent / http://www.example.com/. Sans cela, une redirection de example.com/asdfredirigerait vers http://www.example.comasdfau lieu de http://www.example.com/asdf.

Buttle Butkus
la source
0

Deux avertissements

Évitez 301 et préférez les codes de statut de réponse 303 ou 307 modernes.

Éviter 301

Réfléchissez bien si vous avez vraiment besoin de la redirection permanente indiquée, [R=301]car si vous décidez de la modifier plus tard, les visiteurs précédents de la page continueront à voir la page de la redirection d'origine.

Les informations de redirection permanente sont fréquemment stockées dans le cache du navigateur et, en général, elles sont difficiles à éliminer (recharger la page ne résout pas le problème). Les visiteurs de votre site Web seront bloqués dans la redirection précédente "pour toujours".

Évitez 302 aussi

La nouvelle version du protocole HTTP (v1.1) a ajouté deux nouveaux codes d'état de réponse qui peuvent être utilisés au lieu de 302.

  • 303 Redirection d'URL mais exigeant de changer le type de requête en GET.
  • 307 Redirection d'URL mais exigeant de conserver le type de requête comme initialement envoyé.

Vous pouvez toujours utiliser le code 302(redirection non permanente) bien qu'il soit considéré comme ambigu. Dans tous les cas, la plupart des navigateurs implémentent 302de la même manière que le nouveau 303code l'indique.

ePi272314
la source
concernant votre avertissement sur 301, cela s'appliquera même si nous parlons du même nom de domaine? pas si sûr de savoir comment cela s'appliquera dans ce cas ... redirigeant toutes les URL de http://example.com/testingvers http://www.example.com/testing. Cela pourrait-il être une mauvaise approche à long terme? Merci,
Sara_
-1

Écrivez en .htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Piseth Sok
la source
1
Identique aux autres réponses
Ankit