web-dev-qa-db-fra.com

apache redirige de non www à www

J'ai un site Web qui ne semble pas rediriger de non-www à 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?

185
user121196

Utiliser le moteur de réécriture est un moyen assez lourd de 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 section <VirtualHost> avec ServerName www.example.com pour votre configuration de serveur réel. Apache conserve automatiquement tout ce qui se trouve après le / lors de l’utilisation de la directive Redirect , qui est une idée fausse commune sur la raison pour laquelle cette méthode ne fonctionnera pas (alors qu’elle fonctionne).

472
Greg Hewgill

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]
74
burzumko
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
43
cherouvim

Pour supprimer www de votre site Web URL, utilisez ce code dans votre fichier .htaccess:

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

Pour forcer www sur votre site Web URL, utilisez 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.com doit être remplacé par votre URL

30
Sergio Martins
    <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 de l'hôte virtuel. Ici, tout ce qui n’est pas www.example.com est redirigé vers www.example.com.

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

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

À votre santé!

21
Dishan Philips

Ceci est similaire à beaucoup d'autres suggestions avec quelques améliorations:

  • Pas besoin de coder en dur le domaine (fonctionne avec des hôtes virtuels qui acceptent plusieurs domaines ou entre des environnements)
  • Conserve le schéma (http/https) et ignore les effets des règles %{REQUEST_URI} précédentes.
  • La portion de chemin non affectée par la précédente RewriteRules comme %{REQUEST_URI} est.

    RewriteCond %{HTTP_Host} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_Host}/$1 [R=301,L]
    
15
weotch
RewriteCond %{HTTP_Host} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Cela commence par la variable HTTP_Host, 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 qu'il corresponde exactement à votre nom de domaine, la règle RewriteRule entre en jeu. Le modèle ^(.*)$ correspond à tout ce qui se trouve dans REQUEST_URI, qui est la ressource demandée dans la requête HTTP (foo/blah/index.html). Il stocke cela dans une référence en 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 ne respectant pas la casse, [R=301] indique une redirection externe utilisant le code 301 (ressource déplacée de façon permanente) et [L] arrête toute réécriture ultérieure et redirige immédiatement.

10
Curtis Tasker

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. Cette directive est donc dans mon fichier virtual.conf dans une balise <Directory>. (dir est le parent de tous les docroots)

Cependant, je devais modifier un peu la règle de réécriture, car la docroot complète était exécutée dans la correspondance de motif, malgré ce que http://httpd.Apache.org/docs/2.2/mod/mod_rewrite. html dit qu'il ne s'agit que de choses après l'hôte et le port. 

5
Andrew Deal

Code de redirection pour les non-www => www et en face de www => non-www. Aucun domaine et système de codage en dur dans le fichier .htaccess. Ainsi, le domaine d’origine et la version http/https seront préservés.

Apache 2.4 AND NEWER

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 assurer la compatibilité avec Apache 2.2, utilisez le code ci-dessous ou remplacez% {REQUEST_SCHEME} par http/https corrigé.


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]

... la version abrégée n'est pas possible car% N n'est disponible qu'à partir du dernier RewriteCond ...

5
mikep

Rediriger 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 domaines fonctionnent encore.
  • Pas besoin d'ajuster les lignes. il suffit de les copier/coller au bon endroit.

N'oubliez pas d'appliquer les modifications Apache si vous modifiez le vhost.

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

3
xaa

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

# non-www to www
<If "%{HTTP_Host} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>
3
sys0dm1n
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Cela redirigera non seulement le nom de domaine, mais également le .__n. pages.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

2
Aneesh R S

Essaye ça:

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

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

vérifier ce travail parfait

1
Tejinder singh

C'est simple!

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

N'utilisez pas toujours Redirect permanent (ou pourquoi cela peut causer des problèmes)

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

En effet, si un client a utilisé un sous-domaine qui n'a pas été enregistré en tant que VirtualHost, il peut également ne jamais atteindre ce sous-domaine, même s'il est enregistré ultérieurement.

redirect permanent envoie un HTTP 301 Moved Permanently au client (navigateur) et beaucoup d'entre eux cachent cette réponse pour toujours (jusqu'à ce que le cache soit effacé [manuellement]). Par conséquent, l’utilisation de ce sous-domaine autorisera toujours directement l’adresse www. *** sans demander de nouveau au serveur.

voir Combien de temps les navigateurs cachent-ils HTTP 301?

Donc utilisez simplement 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ôtes canoniques

1
MA-Maddin

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 d'anticipation (?!www.domain.com) pour exclure le sous-domaine www lors de la redirection de tous les domaines vers le sous-domaine www afin d'éviter une boucle de redirection infinie dans Apache.

0

Le code que j'utilise est:

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

J'ai juste le même problème. Mais résolu avec ceci

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]

Voir à partir de http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/

0