J'essaie de rediriger mon site Wordpress de non www vers WWW et non SSL vers SSL de façon permanente.
Voici le code que j'utilise:
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
RewriteEngine On
RewriteCond %{HTTP_Host} ^example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
Je me demande si le code est correct ou si on peut le faire mieux. Je veux dire, cela semble fonctionner, mais PageSpeed dit que je devrais éviter autant de redirections.
EDIT: Donc, il devrait ressembler à ça:
RewriteEngine On
RewriteCond %{HTTP_Host} ^example\.com [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
?
EDIT2:
RewriteEngine On
RewriteCond %{HTTP_Host} ^static.example\.com [NC]
RewriteRule (.*) https://static.example.com/$1 [L,R=301]
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
Ce que vous avez est parfaitement OK et devrait être implémenté de cette façon (en redirigeant vers HTTPS sur le même hôte) si vous souhaitez implémenter HSTS .
Cependant, pour éliminer une double redirection lors de la demande de http://example.com
, vous devez inverser ces deux règles. Sinon, vous obtiendrez la double redirection suivante:
http://example.com
à https://example.com
àhttps://www.example.com
Par exemple:
RewriteEngine On
RewriteCond %{HTTP_Host} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
Pas besoin de répéter la directive RewriteEngine
.
Il n'est pas nécessaire de capturer une référence arrière (c'est-à-dire (.*)
) lorsqu'elle n'est pas utilisée dans la substitution . Pas besoin des ancres ^
et $
puisque regex est glouton par défaut.
L'autre incohérence de "style" entre les règles ci-dessus est que vous utilisez une référence arrière capturée ($1
) dans la première RewriteRule
et la variable de serveur REQUEST_URI
dans la seconde. Cela ne change rien à la façon dont cela fonctionne, car il fait la même chose de deux manières différentes. Mais ce sont deux "styles" différents (comme s'ils avaient été écrits par deux personnes différentes).
EDIT2:
J'ai aussi un sous-domaine -
static.example.com
(non www). J'aimerais ajouter SSL ici et rediriger WWW vers non WWW (les utilisateurs peuvent désormais accéder au site via www également, se terminant par une URL telle quewww.static.example.com
). J'ai essayé quelque chose comme dans EDIT2 (je viens de modifier mon post). Pouvez-vous me dire ce qui ne va pas avec ce code?RewriteCond %{HTTP_Host} ^static.example\.com [NC] RewriteRule (.*) https://static.example.com/$1 [L,R=301] RewriteCond %{HTTPS} !=on RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
Votre première règle ici est la redirection de static.example.com
vers static.example.com
(c'est-à-dire aucun changement) - ceci entraînera naturellement une boucle de redirection sans fin (le navigateur finira par rompre avec une erreur).
Si vous souhaitez rediriger à partir de www.static.example.com
, vérifiez-le dans la directive RewriteCond
. Par exemple:
RewriteCond %{HTTP_Host} ^www\.static\.example\.com [NC]
RewriteRule (.*) https://static.example.com/$1 [L,R=301]
Je ne sais pas si vous l'êtes ou non, mais il n'est pas nécessaire de répéter la redirection HTTP vers HTTPS - à condition de placer les directives dans le bon ordre.
Donc, en résumé, avec les deux redirections ensemble:
RewriteEngine On
# Main domain non-www to www redirect
RewriteCond %{HTTP_Host} ^example\.com [NC]
RewriteRule (.*) https://www.example.com/$1 [L,R=301]
# Subdomain www to non-www redirect
RewriteCond %{HTTP_Host} ^www\.static\.example\.com [NC]
RewriteRule (.*) https://static.example.com/$1 [L,R=301]
# HTTP to HTTPS redirect
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]