web-dev-qa-db-fra.com

htaccess 301 pour rediriger les .com vers .co.uk, http vers https et les sous-domaines non www vers www

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]
3
coldstatetech

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 en https://example.com ou https://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é .

1
MrWhite