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]
Où 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:
%{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
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.
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.
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 …
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]
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.