HSTS et double redirection

9

Je gère un petit site Web dans un environnement LAMP d'hébergement mutualisé: cela signifie essentiellement que la seule chose que je peux modifier est un fichier htaccess.

Je voulais ajouter le support HSTS (et je l'ai fait), mais, lorsque j'ai testé mon site Web ici pour l'éligibilité de la précharge HSTS, j'ai eu l'erreur suivante:

Erreur: HTTP redirige vers www en premier

http://example(HTTP) devrait immédiatement rediriger vers https://example(HTTPS) avant d'ajouter le sous-domaine www. À l'heure actuelle, la première redirection est vers https://www.example.La redirection supplémentaire est requise pour garantir que tout navigateur prenant en charge HSTS enregistrera l'entrée HSTS pour le domaine de niveau supérieur, pas seulement le sous-domaine.

Donc, je suppose que je devrais rediriger les utilisateurs de cette façon:

  1. http://example (c'est ce que l'utilisateur entre dans la barre d'adresse de son navigateur)
  2. https://example (nous le redirigeons vers la version HTTPS du site)
  3. https://www.example (nous le redirigeons à nouveau vers le sous-domaine www)

Ma redirection actuelle se fait de cette façon:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

J'ai essayé d'ajouter une redirection avant la dernière ligne, de cette façon:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

mais j'ai reçu une erreur "la page ne redirige pas correctement" du navigateur.

Alors, quelle est la bonne façon de rediriger un utilisateur de la version http du site Web vers le https et enfin vers le https avec www? Et: y a-t-il des risques?

HBruijn
la source

Réponses:

10

Comme indiqué dans les exigences de soumission de la liste de préchargement HSTS :

  1. Redirigez de HTTP vers HTTPS sur le même hôte, si vous écoutez sur le port 80.

Vous devez rediriger vers le même hôte (c.-à-d. HTTP_HOST), Pas simplement vers le example.compremier. Vous n'avez pas besoin de rediriger vers example.comsi l'utilisateur demande www.example.comdirectement. (Le test impliquera une demande à example.com.) Après cela, vous pouvez rediriger vers le sous-domaine www canonique si nécessaire.

J'ai essayé d'ajouter une redirection avant la dernière ligne, de cette façon:

RewriteRule ^(.*)$ https://example.com/$1 [R,L]

Cela créerait une boucle de redirection, car la RewriteConddirective précédente ne s'applique qu'à la première RewriteRule, donc la seconde RewriteRules'exécuterait sans condition.

Essayez plutôt ce qui suit:

# HTTP to HTTPS redirect
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

# Canonical www redirect
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule (.*) https://www.%{HTTP_HOST}/$1 [R,L]

La HTTP_HOSTvariable serveur contient la valeur de l' Hosten-tête de requête HTTP (c'est-à-dire, quel que soit l'hôte demandé).

La 2e redirection indique ... pour toutes les demandes où l'hôte demandé ne démarre pas, www.puis préfixez www.l'hôte. Cependant, cela peut ne pas être acceptable si vous avez plusieurs sous-domaines (qui se résolvent au même endroit) que vous souhaitez conserver séparés, car ils seront naturellement redirigés vers le sous-domaine www.

Notez qu'il s'agit de 302 redirections (temporaires). Passez à 301 uniquement lorsque vous êtes sûr que cela fonctionne correctement.

Et: y a-t-il des risques?

Aucun risque. Oui, il y a potentiellement deux redirections alors qu'auparavant il ne pouvait y en avoir qu'une (ce qui est sans doute moins efficace). Mais il n'y a toujours que deux redirections, ce qui est parfaitement correct pour le référencement. De plus, avec HSTS, l'agent utilisateur ne connaîtra la redirection double qu'au plus une fois.


RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.example.com/$1 [R,L]

En plus: (Ignorant HSTS pour le moment ...) Cela n'aurait pas été complet par lui-même, car il ne canonise pas une demande https://example.com/...(c'est-à-dire HTTPS et l'apex du domaine).


Lectures complémentaires:

MrWhite
la source
Merci beaucoup, je vais le tester bientôt. Une réponse rapide au dernier Aside: celui-ci fonctionne quand même mais il semble que ce soit quelque chose que je ne peux pas contrôler directement (pas dans le fichier htaccess, au moins: il y a un panneau de redirection dans le gestionnaire de site Web du fournisseur d'hébergement)
1
Btw, votre solution fonctionne PARFAITEMENT! :-)
1
"panneau de redirection dans le gestionnaire de site Web du fournisseur d'hébergement" - je me méfierais toujours de ces outils. Par exemple, la section des redirections dans cPanel est très limitée et plutôt notoire.
MrWhite
1
Cela dépend de la façon dont vous définissez l'en- Strict-Transport-Securitytête de réponse. Par exemple, pour définir cela sur la redirection, vous devrez utiliser l' alwaysargument de la Headerdirective. J'ai répondu à une question connexe sur la pile Pro Webmasters (ignorer la première partie de ma réponse à propos de on/ off) qui va plus en détail sur l'implémentation de la " précharge HSTS " dans .htaccess.
MrWhite
1
Je vous en prie. Pour être honnête, la pile Pro Webmasters est probablement plus adaptée aux .htaccessseules questions liées (ServerFault suppose que vous avez le contrôle total du serveur, auquel cas vous ne le feriez pas .htaccess). Il est sans doute plus facile de l'implémenter dans la configuration du serveur en utilisant des <VirtualHost>conteneurs séparés (car vous n'avez pas besoin de jouer avec les vars env et les conditions supplémentaires - c'est "plus propre" et moins sujet aux erreurs). Je ne pense pas que je recommanderais la soumission d'une "liste de préchargement" si vous n'y avez accès .htaccess. (Mon 2c)
MrWhite