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?
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').
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/
</VirtualHost>
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]
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 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é!
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]
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.
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
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.
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 ...
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)
<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
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>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/ [L,R=301]
vérifier cette œuvre parfaite
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>
Essayez ce qui suit:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com [R=301]
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/
ç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.
le code que j'utilise est:
"RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/ [R=301,L]
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.
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]
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.