web-dev-qa-db-fra.com

htaccess redirige vers https: // www

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.

269
bigben

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]

A propos du proxy

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é

564
Michael Berkowski

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]
136
Larzan

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]
93
Andrew

MAUVAISE SOLUTION ET POURQUOI!

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


MEILLEURE SOLUTION ET LA RÉPONSE

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.

44
Amir Forsati

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
30
llioor

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
25
Vynz

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.

10
starkeen

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!

8
Ahmad Awais

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
0
Jackssn
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

  1. Sudo a2enmod réécrire
  2. Service Sudo Apache2 redémarrer
  3. 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

0
Kundan roy

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]
0
Adam Kozlowski