redirection apache de non www vers www

J’ai un site Web qui ne semble pas redirect 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?

Utiliser le moteur de réécriture est un moyen assez lourd de résoudre ce problème. Voici une solution plus simple:

  ServerName example.com Redirect permanent / http://www.example.com/   ServerName www.example.com # real server configuration  

Et puis vous aurez une autre section avec ServerName www.example.com pour votre configuration de serveur réel. Apache conserve automatiquement tout ce qui suit la / lors de l’utilisation de la directive Redirect , ce qui est une idée fausse commune sur la raison pour laquelle cette méthode ne fonctionnera pas (alors qu’en fait elle le fait).

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

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

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

Pour forcer l’ URL votre site Web, 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 .

   DocumentRoot "what/ever/root/to/source" ServerName www.example.com  Options FollowSymLinks MultiViews Includes ExecCGI AllowOverride All Order allow,deny allow from all     ServerName example.com ServerAlias *.example.com Redirect permanent / http://www.example.com/  

C’est ce qui se passe avec le code ci-dessus. Le premier bloc d’hôte virtuel vérifie si la demande est http://www.exemple.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 http://www.example.com est redirigé vers http://www.example.com.

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

Cette solution redirecta toute demande vers votre domaine vers http://www.yourdomain.com.

À votre santé!

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

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

     RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L] 
 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 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 le RewriteRule entre en jeu. Le pattern ^(.*)$ REQUEST_URI à tout ce qui est dans le REQUEST_URI , qui est la ressource demandée dans la requête HTTP ( foo/blah/index.html ). Il stocke ceci 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 utilisant le code 301 (ressource déplacée de manière permanente) et [L] arrête toute réécriture et redirige immédiatement.

J’ai couru ce …

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

J’ai besoin de ceci pour être universel pour plus de 25 domaines sur notre nouveau serveur, donc cette directive est dans mon fichier virtual.conf dans une balise . (dir est le parent de tous les docroots)

J’ai dû faire un peu de piratage sur la règle de réécriture, car le docroot complet était exécuté lors de la correspondance du modèle, malgré ce que dit http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html à ce sujet seulement être des trucs après l’hôte et le port.

Code de redirection pour non-www => www et opposé www => non-www. Aucun domaine et schéma de codage en dur dans un fichier .htaccess. Le domaine d’origine et la version http / https seront donc préservés.

APACHE 2.4 ET NOUVEAU

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] 

Note: ne pas travailler 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 NOUVEAU

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 courte n’est pas possible car% N n’est disponible qu’à partir de la dernière version de RewriteCond …

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] 
  • Les autres domaines fonctionnent toujours.
  • 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)

  ServerAlias example.com RedirectMatch permanent ^/(.*) http://www.example.com/$1  

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

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

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  Redirect 301 "/" "http://www.domain.com/"  

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

vérifier ce travail parfait

Ne pas toujours utiliser Redirect permanent (ou pourquoi cela peut causer des problèmes)

S’il y a une chance que vous ajoutiez des sous-domaines plus tard, n’utilisez pas de redirect permanent .

Parce que 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é plus tard.

redirect permanent envoie un HTTP 301 Moved Permanently au client (navigateur) et beaucoup d’entre eux mettent cette réponse en cache pour toujours (jusqu’à ce que le cache soit effacé [manuellement]). Donc, utiliser ce sous-domaine sera toujours direct vers www. *** sans demander à nouveau le serveur.

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

Alors, utilisez simplement la Redirect

  ServerName example.com Redirect / http://www.example.com/  

Apache.org – Quand ne pas utiliser mod_rewrite

Apache.org – Noms d’hôtes canoniques

Essaye ça:

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

J’ai juste le 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 non-www vers www.

Et cette règle pour redirect 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/

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’ (?!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.

Le code que j’utilise est:

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

Si vous utilisez la solution ci-dessus de deux blocs avec un nom de ServerName différent …

  ServerName example.com Redirect permanent / http://www.example.com/   ServerName www.example.com  

… alors vous devez également définir NameVirtualHost On .

Si vous ne le faites pas, Apache ne se permet pas d’utiliser les différents ServerName s 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 avez placé en premier.

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é, j’appendais au réseau). J’ai d’abord résolu d’append 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 aidera.

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

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

J’ai trouvé plus facile (et plus utile) d’utiliser ServerAlias ​​lors de l’utilisation de plusieurs hôtes virtuels.

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

Cela fonctionne également avec https vhosts.