htaccess redirige vers https: // www

J’ai le code htaccess suivant:

 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]  

Je veux que mon site soit redirigé vers https://www. avec HTTPS, et faire respecter le www. sous-domaine, mais quand j’accède à http://www. (sans HTTPS), il ne me redirige pas vers https://www avec HTTPS.

Pour forcer le protocole HTTPS, vous devez d’abord %{HTTPS} off variable d’environnement %{HTTPS} off , mais votre règle ci-dessus ajoute le code www. Puisque vous avez une deuxième règle 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] 

À propos du proxy

Lorsque derrière certaines formes de proxy, le client se connecte via HTTPS à un proxy, un équilibreur de charge, une application Passenger, etc., la variable %{HTTPS} peut ne jamais être activée et provoquer une boucle de réécriture. Cela est dû au fait que votre application reçoit en réalité du trafic HTTP brut, même si le client et le proxy / équilibreur de charge utilisent HTTPS. Dans ces cas, vérifiez l’en X-Forwarded-Proto tête X-Forwarded-Proto au lieu de la variable %{HTTPS} . Cette réponse montre le processus approprié

La réponse de Michals a fonctionné pour moi, mais avec une petite modification:

Problème:

lorsque vous avez un certificate de sécurité de site unique , un navigateur qui tente d’accéder à votre page sans https: // www. (ou quel que soit le domaine couvert par votre certificate) affichera un écran d’avertissement rouge moche avant même qu’il puisse recevoir la redirection vers la page https sûre et correcte.

Solution

Commencez par utiliser la redirection vers www (ou quel que soit le domaine couvert par votre certificate), puis uniquement la redirection https. Cela garantira que vos utilisateurs ne sont confrontés à aucune erreur car votre navigateur voit un certificate 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 CloudFlare, vous devrez utiliser ceci:

 RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] 

BAD SOLUTION ET POURQUOI!

Lorsque vous utilisez ce code:

 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 de demande au serveur


LA MEILLEURE SOLUTION ET LA RÉPONSE

Ce code a une condition [OR] pour empêcher les doubles changements à l’url!

 RewriteEngine on RewriteCond %{HTTPS} off [OR] RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L] 

Il y a beaucoup de solutions. Voici un lien vers le wiki apache qui traite directement de ce problème.

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. # ie 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 

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 

Pour redirect 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 ça.

 # BEGIN SSL Redirect  RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]  # END SSL Redirect 

Cela vous sauvera de la boucle de redirection et redirecta votre site vers SSL en toute sécurité.

PS C’est une bonne idée de vérifier si mod_rewrite.c!

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] 

Cela fonctionnera pour https et www

 RewriteCond %{HTTPS} !=on # This checks to make sure the connection is not already HTTPS RewriteRule ^/?(.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]