J'ai example.co.uk
et example.com
noms de domaine. Le site Web principal est example.co.uk
. J'ai un certificat SSL sur le domaine example.co.uk
.
Je veux que le fichier .htaccess
vers 301 redirige tout ce qui est vu dans un navigateur vers https:
sans affecter le référencement.
Cela signifie des entrées de:
example.co.uk
example.com
www.example.com
www.example.co.uk
http://example.co.uk
http://example.com
http://www.example.co.uk
http://www.example.com
https://example.co.uk
https://example.com
https://www.example.com
serait tous transmettre à https://www.example.co.uk
.
Il s’agit d’un site d’une page unique, donc une solution de type "fourre-tout" fonctionnera. Idéalement, j'aimerais que cela fonctionne pour un site de plusieurs pages. Je pourrais donc utiliser le code .htaccess
à nouveau dans différents projets.
Je suis arrivé avec ce qui suit, mais il convertit les entrées .com
en https://example.com
ou https://www.example.com
puis s'arrête:
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R]
RewriteCond %{HTTP_Host} ^(www\.)?example\.com$ [NC,OR]
RewriteCond %{HTTP_Host} ^example\.co.uk$ [NC]
RewriteRule ^ https://www.example.co.uk%{REQUEST_URI} [L,NE,R]
J'ai un certificat SSL sur le domaine
example.co.uk
.
Vraisemblablement, cela couvre également le sous-domaine www
? (Il faudrait.)
https://example.com https://www.example.com
Comme mentionné par Simon dans les commentaires, pour pouvoir rediriger https://example.com
, vous aurez besoin d'un certificat SSL couvrant le domaine example.com
. Sinon, le navigateur s’arrêtera à l’avertissement de certificat invalide. (La négociation SSL se produit avant votre serveur puisse traiter la demande.)
Je suis arrivé avec ce qui suit, mais il convertit les entrées
.com
enhttps://example.com
ouhttps://www.example.com
puis s'arrête:
Probablement parce que vous recevez un avertissement de certificat invalide?
Puisque vous avez plusieurs domaines, il est peut-être plus facile de construire une règle qui redirige tout ce qui est et non l'hôte canonique, plutôt que d'essayer de faire correspondre positivement tout il pourrait être. Par exemple:
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_Host} !=www.example.co.uk
RewriteRule ^ https://www.example.co.uk%{REQUEST_URI} [R,L]
Cela combine la canonisation de HTTPS et www dans une seule règle.
Le préfixe !
sur le CondPattern annule l'expression. Ainsi, il réussit s'il ne correspond pas à la chaîne/regex donnée. Dans ce cas, l'opération réussit lorsque l'hôte n'est pas la chaîne www.example.co.uk
. Le préfixe =
est l'opérateur de correspondance exacte (comparaison lexicographique). Le reste CondPattern est vu comme une chaîne ordinaire, pas une regex.
Avez-vous besoin du drapeau NE
(noescape
)? Vous l'avez omise dans la première règle, vous perdriez donc naturellement tous les caractères spéciaux ayant traversé cette directive.
RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R] RewriteCond %{HTTP_Host} ^(www\.)?example\.com$ [NC,OR] RewriteCond %{HTTP_Host} ^example\.co.uk$ [NC] RewriteRule ^ https://www.example.co.uk%{REQUEST_URI} [L,NE,R]
De côté: Puisque vous utilisez HTTP_Host
dans la substitution dans la première RewriteRule
, si vous inversez l'ordre de ces règles, vous éviterez une seconde redirection inutile lors de l'accès à http://example.co.uk
etc. Etant donné que vous savez que l'hôte est canonisé .