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?
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).
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
, 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]
Où 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>
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é!
Ceci est similaire à beaucoup d'autres suggestions avec quelques améliorations:
%{REQUEST_URI}
précédentes.La portion de chemin non affectée par la précédente RewriteRule
s 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 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.
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.
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.
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é.
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 ...
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)
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>
<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
Essaye ça:
RewriteEngine on
RewriteCond %{HTTP_Host} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]
RewriteEngine On
RewriteCond %{HTTP_Host} ^yourdomain.com [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [L,R=301]
vérifier ce travail parfait
C'est simple!
RewriteEngine On
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_Host}%{REQUEST_URI} [R=301,L]
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>
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.
Le code que j'utilise est:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
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/