web-dev-qa-db-fra.com

Rediriger vers https ne fonctionne pas avec .htaccess

J'ai la configuration suivante dans mon fichier .htaccess, mais je peux toujours accéder à mon site via http:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# Rewrite HTTP to HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}/$1 [R,L]
</IfModule>

# END WordPress

Une idée de ce que je pourrais faire mal?

1
Best Dev Tutorials

Vous avez mis le code au mauvais endroit. Les directives HTTP à HTTPS doivent aller avant le contrôleur frontal WordPress, sinon il ne sera tout simplement jamais traité pour autre chose que des demandes directes de fichiers.

Vos directives personnalisées doivent également se trouver en dehors du bloc # BEGIN WordPress, sinon WordPress lui-même risque de remplacer vos directives dans une future mise à jour.

Par exemple:

# Redirect HTTP to HTTPS
RewriteCond %{HTTPS} !=on
RewriteRule (.*) https://%{SERVER_NAME}/$1 [R,L]

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]    
</IfModule>
# END WordPress

C'est une "redirection", pas une "réécriture". Changez la R en R=301 lorsque vous êtes sûr que tout fonctionne correctement (car cela devrait finalement être un permanent redirect).

1
MrWhite

Connaissez-vous le drapeau [L] pour mod_rewrite? Cela "oblige mod_rewrite à cesser de traiter le jeu de règles. Dans la plupart des contextes, cela signifie que si la règle correspond, aucune autre règle ne sera traitée".

Voir: https://httpd.Apache.org/docs/2.4/rewrite/flags.html#flag_l

Notez que vos règles de réécriture au-dessus de la règle http-> https utilisent cet indicateur. Ces règles ressemblent aux règles de WordPress qui redirigent les demandes qui ne correspondent pas à un fichier ou à un répertoire spécifique vers index.php à des fins de traitement.

Une idée est de changer l'ordre afin que vos règles apparaissent après Rewrite Engine On afin que la vérification http-vs-https soit effectuée en premier, la redirection puisse avoir lieu et then sur la requête redirigée suivante (qui sera désormais https) l'ensemble de règles suivant relatif aux fonctionnalités de WordPress peut s'appliquer.

Vous pouvez également essayer d'écrire RewriteCond {HTTPS} != on en tant que RewriteCond %{HTTPS} off et votre ligne RewriteRule en tant que RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301] pour être plus explicite et renvoyer un code d'état de redirection http 301 (permanent).

EDIT: Je viens de voir le commentaire de Mr White, nous écrivions en même temps. Il a également de bons conseils: placez vos règles révisées en dehors du bloc de commentaires #WORDPRESS afin que les futures mises à jour de WordPress ne les gênent pas!

1
firxworx