redirection apache de non www vers www

206

J'ai un site Web qui ne semble pas rediriger de non-www vers www.

Ma configuration Apache est la suivante:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

Qu'est-ce que je rate?

user121196
la source
1
Pour une .htaccesssolution basée, je suggère une réponse qui a été posée sur la question diamétrale: stackoverflow.com/a/5262044/367456
hakre
c'est bien, cela ajoute une barre oblique à l'url, alors perdez la barre oblique avant le dollar.
wuxmedia
Copie

Réponses:

510

L'utilisation du moteur de réécriture est un moyen assez lourd pour résoudre ce problème. Voici une solution plus simple:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

Et puis vous aurez une autre <VirtualHost>section avec ServerName www.example.compour votre configuration de serveur réelle. Apache conserve automatiquement quoi que ce soit après l' /utilisation de la Redirectdirective , ce qui est une idée fausse commune sur les raisons pour lesquelles cette méthode ne fonctionnera pas (alors qu'en fait elle le fait).

Greg Hewgill
la source
20
Comment le faites-vous pour un site qui a également un hôte virtuel SSL?
Shabbyrobe
28
J'obtiens l'erreur "La page Web sur example.com a entraîné trop de redirections" lors de l'utilisation de cette suggestion. D'autres ont-ils ce problème?
Jonathan Berger
4
@BlackDivine: Il n'y a rien de magique à le faire dans l'autre sens. Échangez simplement www.exampleet examplepartout où ils apparaissent dans l'échantillon.
Greg Hewgill
11
@JonathanBerger Si vous avez trop de redirections, alors vous n'avez probablement pas bien configuré le fichier. Assurez-vous d'avoir 2 VirtualHosts: un avec non-www qui est le ci-dessus et l'autre avec ServerName www.example.com qui a la vraie configuration. Assurez-vous également de ne pas avoir de redirection dans la configuration de www.example.com (à la fois mod_alias et mod_rewrite).
Savas Vedova
3
Pour un serveur hôte virtuel, par exemple example.com, je l'ai, Redirect 301 / http://example2.com/extra/mais lorsqu'il redirige, il manque la barre oblique de fin, ce qui signifie que cela example.com/blahva example2.com/extrablah. Des idées? (Apache 2.2.22)
Peter Howe
88

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
burzumko
la source
3
réponse très courte ... mais aux points ...
je
2
Oh c'est bien, cela peut être inclus dans la configuration du serveur au niveau supérieur (et si c'est le cas) s'appliquera à chaque hôte virtuel!
thenickdude
Bonjour @burzumko comment y parvenir, ce qui est vrai pour tous sans www, mais alors, disons example.com/subdi1/ws/* passer sans www?
black sensei
1
J'ai également utilisé cette solution pour les hôtes virtuels HTTPS. Ajoutez simplement un sà http dans la troisième ligne.
rodrigoap
46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
cherouvim
la source
Cela n'a pas fonctionné pour moi; il a provoqué une boucle de redirection infinie vers le même site
dmiller309
1
@ dmiller309: Vous arrive-t-il d'avoir inclus www.dans le ServerAlias?
cherouvim
2
Vous avez raison, j'ai accidentellement mis www. dans le ServerAlias ​​en utilisant le *. caractère générique. Parce que j'ai foiré l'ordre des entrées VirtualHost, le *. le caractère générique a eu l'occasion de correspondre alors que je ne le pensais pas.
dmiller309
7
C'est la meilleure réponse, car elle est propre, conserve le chemin (contrairement à la réponse n ° 1) et n'utilise pas de réécriture.
schieferstapel
30

Pour supprimer wwwde votre URLsite Web, utilisez ce code dans votre .htaccessfichier:

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

Pour forcer wwwdans votre site Web à URLutiliser ce code sur.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

YourSite.comdoit être remplacé par votre URL.

kloddant
la source
Meilleure réponse ici, car cela fonctionne pour un site Web avec plusieurs noms de domaine <3
Clement Herreman
2
Quelle est la deuxième partie avec le .html pour ??
Nathan H
6
Supprimer la barre oblique avant 1 $ pour ne pas avoir de double barre oblique (//) après la redirection => RewriteRule ^ (. *) $ YourSite.com $ 1 [R = 301]
Kevin Campion
22
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

C'est ce qui se passe avec le code ci-dessus. Le premier bloc d'hôte virtuel vérifie si la demande est www.example.com et exécute votre site Web dans ce répertoire.

A défaut, il s'agit de la deuxième section d'hôte virtuel. Ici, tout autre élément que www.example.com est redirigé vers www.example.com.

L'ordre ici est important. Si vous ajoutez d'abord la deuxième directive virtualhost, cela provoquera une boucle de redirection.

Cette solution redirige toute demande vers votre domaine vers www.votredomaine.com.

À votre santé!

Dishan Philips
la source
16

Ceci est similaire à la plupart des autres suggestions avec quelques améliorations:

  • Pas besoin de coder en dur le domaine (fonctionne avec des vhosts qui acceptent plusieurs domaines ou entre des environnements)
  • Préserve le schéma (http / https) et ignore les effets des précédents %{REQUEST_URI} règles .
  • La portion de chemin non affectée par les RewriteRules précédents %{REQUEST_URI}est.

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
    
weotch
la source
4
Presque parfait. Ce doit être% {HTTP_HOST} $ 1, pas% {HTTP_HOST} / $ 1 (sinon il doublera la barre oblique)
Michael Wyraz
@Michael Wyraz: Ne double-t-il pas la barre oblique ici?!
not2savvy
10
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Cela commence par la HTTP_HOSTvariable, qui contient uniquement la partie du nom de domaine de l'URL entrante ( example.com). En supposant que le nom de domaine ne contient pas de www.et correspond exactement à votre nom de domaine, alors la RewriteRule entre en jeu. Le modèle ^(.*)$correspondra à tout dans le REQUEST_URI, qui est la ressource demandée dans la requête HTTP ( foo/blah/index.html). Il le stocke dans une référence arrière, qui est ensuite utilisée pour réécrire l'URL avec le nouveau nom de domaine (celui qui commence par www).

[NC]indique une correspondance de modèle insensible à la casse, [R=301]indique une redirection externe à l'aide du code 301 (ressource déplacée de façon permanente), [L]arrête toute réécriture et redirige immédiatement.

Curtis Tasker
la source
6

Code de redirection pour non-www => www et opposé www => non-www. Pas de domaines et de schémas de codage en dur dans le fichier .htaccess. Le domaine d'origine et la version http / https seront donc préservés.

APACHE 2.4 ET PLUS RÉCENT

NON-WWW => WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => NON-WWW:

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

Remarque: ne fonctionne pas sur Apache 2.2 où% {REQUEST_SCHEME} n'est pas disponible. Pour la compatibilité avec Apache 2.2, utilisez le code ci-dessous ou remplacez% {REQUEST_SCHEME} par http / https fixe.


APACHE 2.2 ET PLUS RÉCENT

NON-WWW => WWW:

RewriteEngine On

RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

... ou version plus courte ...

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

WWW => NON-WWW:

RewriteEngine On

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [R=301,L]

... une version plus courte n'est pas possible car% N est disponible uniquement depuis le dernier RewriteCond ...

mikep
la source
La configuration d'Apache 2.4 a résolu le problème, merci pour la réponse claire .. !!
KimchiMan
5

J'ai couru ça ...

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

J'ai besoin que cela soit universel pour plus de 25 domaines sur notre nouveau serveur, donc cette directive est dans mon fichier virtual.conf dans une balise <Directory>. (dir est le parent de tous les docroots)

J'ai dû faire un peu de piratage sur la règle de réécriture, car la docroot complète était en cours d'exécution sur la correspondance de modèle, malgré ce que http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html dit à propos qu'il ne s'agit que de trucs après l'hôte et le port.

Andrew Deal
la source
5

Si vous utilisez Apache 2.4, sans avoir besoin d'activer le module de réécriture d'apache, vous pouvez utiliser quelque chose comme ceci:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>
sys0dm1n
la source
1
Réponse sous-estimée. En utilisant cela, des vhosts supplémentaires peuvent être évités, ce qui est bon pour les scripts automatisés de Let'sEncrypt.
Paul
De plus, si vous utilisez ANSIBLE, depuis ANSIBLE 2.0, vous pouvez désormais facilement insérer un bloc dans un fichier en une seule tâche, plus de détails ici docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n
3

Redirigez domain.tld vers www.

Les lignes suivantes peuvent être ajoutées dans les directives Apache ou dans le fichier .htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • D'autres sous-domaines fonctionnent toujours.
  • Pas besoin d'ajuster les lignes. il suffit de les copier / coller au bon endroit.

N'oubliez pas d'appliquer les changements d'apache si vous modifiez le vhost.

(basé sur le Drupal7 .htaccess par défaut mais devrait fonctionner dans de nombreux cas)

xaa
la source
3

C'est simple!

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
kk4You
la source
2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Cela redirigera non seulement le nom de domaine mais aussi les pages internes.like ...

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh

Aneesh RS
la source
Merci pour cela. Très utile.
Anthony
2

Essaye ça:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]
Mark Ursino
la source
2

N'utilisez pas toujours Redirect permanent (ou pourquoi cela pourrait causer des problèmes à l'avenir)

S'il est possible que vous ajoutiez des sous-domaines ultérieurement, n'utilisez pas redirect permanent .

Parce que si un client a utilisé un sous-domaine qui n'était pas enregistré en tant que VirtualHost il peut également ne jamais atteindre ce sous-domaine même s'il est enregistré plus tard.

redirect permanent envoie un HTTP 301 Moved Permanently au client (navigateur) et beaucoup d'entre eux mettent en cache cette réponse pour toujours (jusqu'à ce que le cache soit vidé [manuellement]). Ainsi, l'utilisation de ce sous-domaine sera toujours redirigée automatiquement vers www. *** sans demander à nouveau le serveur.

voir Combien de temps les navigateurs mettent-ils en cache HTTP 301?

Il suffit donc d'utiliser Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - Quand ne pas utiliser mod_rewrite

Apache.org - Noms d'hôte canoniques

Martin Schneider
la source
1

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

vérifier ce travail parfait

Tejinder singh
la source
1

-Si vous hébergez plusieurs noms de domaine (facultatif)

-Si tous ces noms de domaine utilisent https (comme ils le devraient)

-si vous voulez que tous ces noms de domaine utilisent www dot domainName

Cela évitera une redirection double (http: // non www vers http: // www puis vers https: // www)

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

Et

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

Vous devez changer le code de redirection 301 pour le plus pratique

YOGO
la source
0

J'ai juste un même problème. Mais résolu avec ça

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

Cette règle redirige les non-www vers www.

Et cette règle pour rediriger www vers non-www

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

Reportez-vous à http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/

Santo Doni Romadhoni
la source
0

Cela fonctionne pour moi:

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

J'utilise le modèle (?!www.domain.com)d'anticipation pour exclure le wwwsous - domaine lors de la redirection de tous les domaines vers le wwwsous - domaine afin d'éviter une boucle de redirection infinie dans Apache.

Mauricio Sánchez
la source
0

Le code que j'utilise est:

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

Si vous utilisez la solution ci-dessus de deux <VirtualHost *:80>blocs avec des ServerNames différents ...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... alors vous devez définir NameVirtualHost Onainsi .

Si vous ne le faites pas, Apache ne se permet pas d'utiliser les différents ServerNames pour distinguer les blocs, vous obtenez donc ce message d'erreur:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... et soit aucune redirection ne se produit, soit vous avez une boucle de redirection infinie, selon le bloc que vous placez en premier.

Stuart Caie
la source
-1

J'ai eu une tâche similaire sur un WP Multisite, où la règle de redirection devait être générique (pour tout domaine donné que j'ajouterais au réseau). J'ai résolu tout d'abord l'ajout d'un caractère générique au domaine (domaine parqué). Noter la . après .com.

CNAME * domain.com.

Et puis j'ai ajouté les lignes suivantes au fichier .htaccess à la racine de mon multisite. Je suppose que cela fonctionnerait pour n'importe quel site.

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

J'espère que cela vous aidera.

ps. Si vous souhaitez rediriger de non www vers www, changez la dernière ligne en

RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
Carlo Rizzante
la source
-2

J'ai trouvé plus facile (et plus utile) d'utiliser ServerAlias ​​lors de l'utilisation de plusieurs vhosts.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

Cela fonctionne également avec les vhosts https.

Fabian76
la source
Un autre downvote drive-by. Prenez soin d'expliquer, oh puissant dieu de httpd qui ne pourrait pas être dérangé pour expliquer le downvote?
Anthony
1
Cela vous permet d'avoir plusieurs domaines hébergeant le même site. Selon vos situations et ce que votre serveur Web sous-jacent exécute, vous allez avoir des problèmes avec les cookies qui ne sont pas transférés, les gens confus et les problèmes des moteurs de recherche (qui verront cela comme 2 sites différents).
Jeffrey Van Alstine du