J'ai le code htaccess suivant:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond !{HTTPS} off
RewriteRule ^(.*)$ https://www.%{HTTP_Host}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host}%{REQUEST_URI} [L,R=301]
</IfModule>
Je veux que mon site soit redirigé vers https://www.
avec HTTPS et que le sous-domaine www.
, .__ soit appliqué, mais lorsque j'accède à http://www.
(sans HTTPS), il ne me redirige pas vers https://www
avec HTTPS.
Pour commencer par forcer HTTPS, vous devez vérifier la variable d'environnement correcte %{HTTPS} off
, mais votre règle ci-dessus ajoute ensuite le www.
. Comme vous avez une deuxième règle à appliquer pour appliquer www.
, ne l'utilisez pas dans la première règle.
RewriteEngine On
RewriteCond %{HTTPS} off
# First rewrite to HTTPS:
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
# Now, rewrite any request to the wrong domain to use www.
# [NC] is a case-insensitive match
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule .* https://www.%{HTTP_Host}%{REQUEST_URI} [L,R=301]
Lorsque certaines formes de proxy sont derrière lesquelles le client se connecte via HTTPS à un proxy, à un équilibreur de charge, à une application Passenger, etc., la variable %{HTTPS}
peut ne jamais être on
et provoquer une boucle de réécriture. En effet, votre application reçoit en réalité un trafic HTTP simple, même si le client et l'équilibreur proxy/charge utilisent HTTPS. Dans ces cas, vérifiez l'en-tête X-Forwarded-Proto
au lieu de la variable %{HTTPS}
. Cette réponse montre le processus approprié
La réponse de Michal a fonctionné pour moi, avec toutefois une petite modification:
Problème:
lorsque vous avez un certificat de sécurité de site unique, un navigateur qui tente d’accéder à votre page sans https: // www. (ou le domaine couvert par votre certificat) affichera un écran d’avertissement rouge laide avant que ne reçoive même la redirection vers la page https sûre et correcte.
Solution
Commencez par utiliser la redirection vers le site www (ou le domaine couvert par votre certificat), puis seulement avec la redirection https. Cela garantira que vos utilisateurs ne sont confrontés à aucune erreur car votre navigateur voit un certificat qui ne couvre pas l'URL actuelle.
#First rewrite any request to the wrong domain to use the correct one (here www.)
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_Host}%{REQUEST_URI} [L,R=301]
#Now, rewrite to HTTPS:
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
Si vous utilisez CloudFlare ou un CDN similaire, vous obtiendrez une erreur de boucle infinie avec les solutions% {HTTPS} fournies ici. Si vous êtes un utilisateur de CloudFlare, vous devez utiliser ceci:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
N'utilisez jamais la solution ci-dessus, car lorsque vous utilisez leur code, cela ressemble à quelque chose comme:
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule .* https://www.example.com%{REQUEST_URI} [L,R=301]
Le navigateur va à:
http://example.com
Puis redirige vers:
https://example.com
Puis redirige vers:
https://www.example.com
C'est trop demande au serveur
Ce code a une condition [OR]
pour empêcher les doubles modifications à l’URL!
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]
La plupart des réponses, même acceptées, n'utilisent pas cette astuce.
C’est le meilleur moyen que j’ai trouvé pour les utilisateurs proxy et non proxy
RewriteEngine On
### START WWW & HTTPS
# ensure www.
RewriteCond %{HTTP_Host} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_Host}%{REQUEST_URI} [L,R=301]
# ensure https
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
### END WWW & HTTPS
Il y a beaucoup de solutions là-bas. Voici un lien vers le wiki Apache qui traite directement de cette question.
http://wiki.Apache.org/httpd/RewriteHTTPToHTTPS
RewriteEngine On
# This will enable the Rewrite capabilities
RewriteCond %{HTTPS} !=on
# This checks to make sure the connection is not already HTTPS
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]
# This rule will redirect users from their original location, to the same location but using HTTPS.
# i.e. http://www.example.com/foo/ to https://www.example.com/foo/
# The leading slash is made optional so that this will work either in httpd.conf
# or .htaccess context
Pour redirection http: // ou https: // vers https: // www, vous pouvez utiliser la règle suivante sur toutes les versions d'Apache:
RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]
Apache 2.4
RewriteEngine on
RewriteCond %{REQUEST_SCHEME} http [OR]
RewriteCond %{HTTP_Host} !^www\.
RewriteRule ^ https://www.example.com%{REQUEST_URI} [NE,L,R]
Notez que la variable% {REQUEST_SCHEME} est disponible depuis Apache 2.4.
Si vous êtes sur CloudFlare, assurez-vous d’utiliser quelque chose comme ceci.
# BEGIN SSL Redirect
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
</IfModule>
# END SSL Redirect
Cela vous évitera la boucle de redirection et redirigera votre site vers SSL en toute sécurité.
P.S. C'est une bonne idée de vérifier le fichier mod_rewrite.c!
J'essaie d'abord de répondre et ça ne marche pas ...
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{ENV:HTTPS} !=on
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [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
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R]
RewriteEngine On
RewriteCond %{HTTP_Host} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_Host}/$1 [R=301,L]
Remarques: assurez-vous d'avoir suivi les étapes suivantes
- Sudo a2enmod réécrire
- Service Sudo Apache2 redémarrer
- Ajoutez la suite dans votre fichier vhost, situé dans /etc/Apache2/sites-available/000-default.conf
<Directory /var/www/html>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
Require all granted
</Directory>
Maintenant, votre .htaccess fonctionnera et votre site sera redirigé vers http: // vers https: // www
Définir dans votre fichier .htaccess
RewriteEngine On
RewriteCond %{HTTP_Host} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_Host}/$1 [R=301,L]
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]