Ayant récemment déplacé un site vers SSL, j'ai étudié la possibilité d'appliquer le pré-chargement à HSTS. La syntaxe est approuvée et la liste Chrome lui permet d'être OK. Cependant, n'étant pas du tout codeur, un léger problème se pose.
J'ai:
php_value upload_tmp_dir "/tmp"
# Force SSL
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
# Redirect to www
RewriteCond %{HTTP_Host} ^example.com\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L]
# Security header
Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS
# End Force SSL'
Cela semble OK, mais certains sites sur le web - je ne vais pas encombrer cela avec des citations --- conseiller RewriteCond %{HTTPS} off
et d'autres ont RewriteCond %{HTTPS} on
Logiquement, ON semble correct, mais j'ai besoin de savoir ce qui est correct. Ni donner des erreurs.
... conseiller
RewriteCond %{HTTPS} off
et d'autres ontRewriteCond %{HTTPS} on
Cela n’aurait pas de sens dans le contexte donné, car il s’agit évidemment de contraires (je serais intéressé de voir tous les exemples que vous citez).
Cependant, vous voulez peut-être dire off
vs !on
? Celles-ci sont équivalentes dans ce contexte. Le préfixe !
annule l'expression régulière, ce qui signifie effectivement et non "activé" (c'est-à-dire qu'il doit être "désactivé").
Ainsi, dans le contexte des directives ci-dessus, où vous testez si HTTPS n'est pas actif, les éléments suivants sont équivalents:
# Does the HTTPS server variable contain "off"?
RewriteCond %{HTTPS} off
# Does the HTTPS server variable not contain "on"?
RewriteCond %{HTTPS} !on
La variable de serveur HTTPS est définie sur "on" ou "off". (Ou bien, cela n'est pas du tout défini - mais cela dépend de votre configuration serveur/SSL et vous l'aurez déjà découverte à ce moment-là.)
Ce que vous utilisez est vraiment juste une question de préférence.
.htaccess
# Redirect to www RewriteCond %{HTTP_Host} ^example.com\.com [NC] RewriteRule (.*) https://www.example.com/$1 [E=HTTPS,R=301,L] # Security header Header set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS
(Je suppose que l'extrait .com
dans ^example.com\.com
n'est qu'une faute de frappe? Ce devrait être juste ^example\.com
.)
E=HTTPS
- Le réglage de la variable d'environnement HTTPS
sur la RewriteRule
redirect serait semble être nécessaire pour définir l'en-tête de réponse HTTP Strict-Transport-Security
sur la redirection canonique (HTTPS uniquement) non www à www[*1] (c'est-à-dire https://example.com
à https://www.example.com
), qui est défini de manière conditionnelle en fonction de la vérification env=HTTPS
de la directive Header
. Toutefois, pour que cet en-tête soit défini sur la redirect , vous devez également utiliser le mot clé always
sur la directive Header
, comme suit:
Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS
Comme indiqué dans Apache docs , concernant l'utilisation de always
avec la directive Header
lors de la définition d'en-têtes sur des redirections : :
- Vous ajoutez un en-tête à une réponse sans succès (non 2xx) générée localement, telle qu'une redirection, auquel cas seule la table correspondant à
always
est utilisée dans la réponse finale.
[*1] Cet en-tête doit être défini sur la redirection afin de satisfaire au point 4.1 de la exigences de soumission de précharge du HSTS :
Si vous diffusez une redirection supplémentaire à partir de votre site HTTPS, cette redirection doit toujours avoir l'en-tête HSTS (plutôt que la page vers laquelle il redirige).
Juste un commentaire supplémentaire sur le article lié dans les commentaires ci-dessous, qui dit:
La variable d'environnement
env=HTTPS
ne fonctionnait pas comme prévu. J'ai donc utilisé le drapeauE=HTTPS
sur la redirection www pour définir la variable d'environnementenv=HTTPS
à la demande suivante .
Le dernier bit relatif à la définition de "la variable d’environnement env=HTTPS
à la demande suivante" n’est pas tout à fait correct. Définir la variable d'environnement HTTPS
sur la réponse actuelle (redirection) . Au moment où la "requête suivante" survient (c'est-à-dire que le navigateur a répondu à la redirection), cette variable d'environnement (qui a été définie ci-dessus) est depuis longtemps oubliée. mais cela nécessite l'utilisation du mot clé always
sur la directive Header
(comme mentionné ci-dessus).
Header always set Strict-Transport-Security "max-age=63072000; preload; includeSubdomains" env=HTTPS
Juste un petit point, et peut-être que ça n'a pas d'importance, mais ... j'inclurais la directive preload
à la fin de la liste des directives. Par exemple:
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload" env=HTTPS
La directive preload
ne fait pas partie de la spécification HTTP Strict Transport Security (HSTS) . Il est seulement requis par la liste de préchargement. Les autres agents utilisateurs/navigateurs ne l'utilisent pas et peuvent même ne pas le comprendre. Il serait donc plus logique de le mettre à la fin de la liste. Certaines analyses peuvent s'arrêter dès qu'elles atteignent une directive "invalide"?
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
Vérifiez si HTTPS N'EST PAS activé
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
Vérifiez si HTTPS IS off
RewriteCond %{SERVER_PORT} !^443$
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}
Vérifier si la connexion ne fonctionne PAS sur le port sécurisé https 443
Mais tous font la même chose: vérifie s'il n'y a pas de https et redirige vers https.
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=10886400; includeSubDomains; preload"
</IfModule>
Vous savez déjà ce que ça fait.