Question

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?

Était-ce utile?

La solution

En utilisant le 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 alors vous aurez une autre section <VirtualHost> avec ServerName www.example.com pour votre serveur réel configuration. Apache conserve automatiquement quoi que ce soit après la / lorsque vous utilisez le Redirect directive , qui est une idée fausse commune au sujet de pourquoi cette méthode ne fonctionnera pas (quand il fait en fait).

Autres conseils

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

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

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

Pour forcer www dans votre site URL utiliser 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]

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

    <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>

Voici ce qui se passe avec le code ci-dessus. Les premiers contrôles de bloc d'hôte virtuel si la demande est www.example.com et exécute votre site dans ce répertoire.

A défaut, il vient à la deuxième section d'hôte virtuel. Ici, autre chose que www.example.com est redirigé vers www.example.com.

L'ordre est important ici. Si vous ajoutez la deuxième directive VirtualHost premier, il fera une boucle de redirection.

Cette solution redirigera toute demande de votre domaine, à www.yourdomain.com.

Vive!

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

  • Pas besoin de coder en dur le domaine (fonctionne avec des serveurs virtuels qui acceptent plusieurs domaines ou entre les environnements)
  • Préserve le schéma (http / https) et ne tient pas compte des effets des règles de %{REQUEST_URI} précédentes.
  • La partie du chemin non affectée par RewriteRules précédentes 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 ne contient que la partie du nom de domaine de l'URL entrant (example.com). En supposant que le nom de domaine ne contient pas de www. et correspond à votre nom de domaine exactement, le RewriteRule entre en jeu. Le modèle ^(.*)$ va correspondre à tout dans le 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 arrière, qui est ensuite utilisé pour réécrire l'URL avec le nouveau nom de domaine (celui qui commence par www).

[NC] indique correspondance de motif insensible à la casse, [R=301] indique une redirection externe en utilisant le code 301 (ressource déplacé de façon permanente) et arrête [L] tout en outre la réécriture, et redirige immédiatement.

J'ai couru cette ...

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

Je en ai besoin d'être universelle pour 25+ domaines sur notre nouveau serveur, cette directive est dans mon fichier virtual.conf dans un balise. (Dir est parent à tous les docroots)

Je devais faire un peu un hack sur la règle de réécriture cependant, comme la pleine docroot était en cours par le match de modèle, malgré ce que http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html dit à ce sujet étant seulement des choses après que l'hôte et le port.

code de redirection pour les non-www => www www et en face => non-www. Aucun domaine de hardcoding et systèmes dans le fichier .htaccess. Donc, domaine d'origine et http / https la version sera conservée.

APACHE 2.4 ET RÉCENTS

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} ne sont pas disponibles. Pour la compatibilité avec le code d'utilisation ci-dessous Apache 2.2 ou remplacer% {} REQUEST_SCHEME avec fixe http / https.


APACHE 2.2 ET RÉCENTS

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 une 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]

... version plus courte pas possible car% N est disponible uniquement de la dernière RewriteCond ...

Si vous utilisez Apache 2.4, sans qu'il soit nécessaire d'activer le module apache rewrite vous pouvez utiliser quelque chose comme ceci:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

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

Ne pas oublier d'appliquer les modifications apache si vous modifiez le vhost.

(sur la base .htaccess par défaut drupal7 mais devrait fonctionner dans de nombreux cas)

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

Cela va rediriger non seulement le nom de domaine, mais aussi l'intérieur  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

Essayez ceci:

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

est simple!

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

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

vérifier ce travail parfait

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

S'il y a une chance que vous allez ajouter des sous-domaines plus tard, ne pas utiliser redirect permanent.

Parce que si un client a utilisé un sous-domaine qui n'a pas été déposée comme VirtualHost il peut aussi ne jamais atteindre ce sous-domaine, même si elle est postérieure registred.

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

voir les Combien de temps les navigateurs en 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 - Canonical noms d'hôtes

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

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

Cette règle redirection non www www.

Et cette règle pour rediriger www non-www

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

Reportez-vous à partir de 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'anticipation (?!www.domain.com) pour exclure le sous-domaine www lors de la redirection de tous les domaines de la 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 de <VirtualHost *:80> avec différents ServerNames ...

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

... alors vous doit mettre NameVirtualHost On et .

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

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

... et non pas la redirection se produit, ou si vous avez une boucle de redirection infinie, selon le bloc que vous mettez d'abord.

J'ai eu une tâche similaire sur un WP multisite, où la règle de redirection devait être générique (pour un domaine donné, je rajouterais au réseau). Je résolus ajoutant d'abord un caractère générique pour le nom de domaine (domaine en stationnement). 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 ça fonctionne pour tout site.

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

Espérons que cela vous aidera.

ps. Si vous souhaitez rediriger de ne pas www www, changer la dernière ligne dans

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.

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

Cela fonctionne également avec les vhosts https.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top