apache redirection de non www www

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/ [r=301,nc] 

Qu'est-ce que je rate?

177
demandé sur Simon Hayter 2009-07-09 00:22:23

21 réponses

en utilisant le moteur de réécriture est une façon assez lourde 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 ensuite vous aurez une autre section <VirtualHost> avec ServerName www.example.com pour votre configuration de serveur réelle. Apache préserve automatiquement tout ce qui suit le / en utilisant la Redirect directive , ce qui est une idée fausse commune sur les raisons pour lesquelles cette méthode ne fonctionnera pas (quand fait, il n').

453
répondu Greg Hewgill 2018-07-07 15:09:34

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]
66
répondu burzumko 2018-02-24 16:18:46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/
</VirtualHost>
42
répondu cherouvim 2009-07-08 20:32:05

pour supprimer www de votre site URL utilisez ce code dans votre fichier .htaccess :

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

De force www dans votre site web URL utiliser ce code sur les .htaccess

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

YourSite.com doit être remplacé par votre URL .

30
répondu kloddant 2017-03-30 20:42:07
    <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 de l'hôte virtuel vérifie si la requête est www.example.com et gère votre site web dans ce répertoire.

faute de quoi, il vient à la deuxième section d'hôte virtuel. Ici, rien d'autre que www.example.com est redirigé vers www.example.com.

l'ordre ici compte. Si vous ajoutez la deuxième directive virtualhost en premier, elle provoquera une boucle de redirection.

cette solution redirigera toute demande vers votre domaine, à www.yourdomain.com.

santé!

20
répondu Dishan Philips 2014-01-16 16:11:12

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

  • pas besoin de hardcode le domaine (fonctionne avec des serveurs virtuels qui acceptent plusieurs domaines ou entre environnements)
  • préserve le schéma (http/https) et ignore les effets des anciennes règles %{REQUEST_URI} .
  • la partie du chemin non affectée par le précédent RewriteRule s comme %{REQUEST_URI} est.

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/ [R=301,L]
    
12
répondu weotch 2015-07-17 18:21:01
RewriteCond %{HTTP_HOST} ^!example.com$ [NC]
RewriteRule ^(.*)$ http://www.example.com/ [R=301,L]

commence par la variable HTTP_HOST , qui ne contient que la partie nom de domaine de L'URL entrante ( example.com ). Si le nom de domaine ne contient pas de www. et correspond exactement à votre nom de domaine, alors la règle de réécriture 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 les enregistre dans une référence arrière, qui est ensuite utilisé pour réécrire l'URL avec le nouveau nom de domaine (celui qui commence par www ).

[NC] indique une correspondance de motifs non sensible à la casse, [R=301] indique une redirection externe utilisant le code 301 (ressource déplacée en permanence), et [L] arrête toute réécriture ultérieure, et redirige immédiatement.

10
répondu Curtis Tasker 2017-03-22 21:20:17

j'ai fait ça...

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

j'ai besoin que ce soit universel pour 25+ domaines sur notre nouveau serveur, donc cette directive est dans mon virtuel.fichier 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 cependant, comme le docroot complet a été porté à travers sur le match de modèle, malgré ce que http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html dit à ce sujet seulement étant trucs après l'hôte et le port.

5
répondu Andrew Deal 2010-06-15 23:39:10

Redirection de code pour les non-www => www et en face de www => non www. Pas de domaines et de schémas de codage dur .fichier htaccess. Ainsi, le domaine d'origine et la version http/https seront 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]

Note: ne fonctionne pas sur Apache 2.2 où %{REQUEST_SCHEME} n'est pas disponible. Pour compatibilité avec Apache 2.2 utiliser le code ci-dessous ou remplacer %{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]

... la version plus courte n'est pas possible car %N n'est disponible qu'à partir de la dernière réécriture ...

4
répondu mikep 2017-01-20 19:13:12

Redirection de domaine.tld pour www.

Les lignes suivantes peuvent être ajoutées dans les directives Apache ou dans .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 soudomains fonctionnent toujours.
  • pas besoin d'ajuster les lignes. il suffit de copier/coller au bon endroit.

n'oubliez pas d'appliquer les modifications apache si vous modifiez le serveur virtuel.

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

3
répondu xaa 2015-03-28 15:04:44
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/
</VirtualHost>

cela redirigera non seulement le nom de domaine, mais aussi l'intérieur page.comme...



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
répondu Aneesh R S 2016-01-15 07:00:39

si vous utilisez Apache 2.4 ,sans devoir activer le module de réécriture apache, vous pouvez utiliser quelque chose comme ceci:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>
2
répondu sys0dm1n 2016-04-15 09:41:57

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

vérifier cette œuvre parfaite

1
répondu Tejinder singh 2016-09-28 07:17:44

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

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

parce que si un client a utilisé un sous-domaine qui n'a pas été enregistré comme VirtualHost il peut aussi Ne jamais atteindre ce sous-domaine même quand il est enregistré plus tard.

redirect permanent envoie un HTTP 301 Moved Permanently au client (navigateur) et beaucoup de leur cache cette réponse pour toujours (jusqu'à ce que le cache est effacé [manuellement]). Ainsi, l'utilisation de ce sous-domaine permettra toujours d'aller directement sur www.*** sans demander de nouveau le serveur.

voir combien de temps les navigateurs cache HTTP 301s?

donc il suffit d'utiliser Redirect

<VirtualHost *:80>
  ServerName example.com

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

Apache.org -quand ne pas utiliser mod_rewrite

Apache.org - Nom D'Hôte Canonique

1
répondu MA-Maddin 2017-05-23 10:31:13

Essayez ce qui suit:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com [R=301]
1
répondu Mark Ursino 2017-03-22 21:21:28

j'ai juste le même problème. Mais résolu avec ce

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

cette règle redirige non-www vers www.

et cette règle pour rediriger www À non-www

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

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

0
répondu Santo Doni Romadhoni 2014-05-14 11:33:59

ça marche pour moi:

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

j'utilise le schéma (?!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
répondu Mauricio Sánchez 2016-11-05 21:03:09

le code que j'utilise est:

"
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/ [R=301,L]
0
répondu user3597887 2017-03-22 21:22:14

si on utilise la solution ci-dessus de deux <VirtualHost *:80> blocs avec des ServerName différents...

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

... ensuite, vous doit définir NameVirtualHost On ainsi .

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

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

...et soit il n'y a pas de redirection, soit vous avez un infini boucle de redirection, selon le bloc que vous mettez en premier.

-1
répondu Stuart Caie 2014-02-25 11:07:48

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'ajouterais au réseau). J'ai résolu en ajoutant d'abord un joker au domaine (Gared domain). Note le . après .com.

CNAME * domain.com.

Et puis j'ai ajouté les lignes suivantes à la .fichier htaccess à la racine de mon multisite. Je pense qu'il faudrait travailler pour n'importe quel site.

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

espérons que cela aidera.

ps. Si vous souhaitez rediriger De not www vers www, changer la dernière ligne en

RewriteRule ^(.*)$ http://www.%1/ [R=301,L]
-1
répondu Carlo Rizzante 2015-09-22 20:44:58

j'ai trouvé plus facile (et plus utile) D'utiliser ServerAlias lors de l'utilisation de plusieurs serveurs virtuels.

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

cela fonctionne aussi avec les serveurs virtuels https.

-2
répondu Fabian76 2014-09-18 12:11:52