redirection htaccess vers https: // www

309

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 souhaite que mon site soit redirigé vers https://www.avec HTTPS et applique le www.sous - domaine, mais lorsque j'accède http://www.(sans HTTPS), il ne me redirige pas vers https://wwwavec HTTPS.

bigben
la source
Devrait êtreRewriteCond %{HTTPS} =off
Michael Berkowski
1
Si je le fais, il redirige vers https: / / ww ww w w.
bigben
Cher @bigben, vous avez accepté une mauvaise réponse ici! vous pouvez découvrir pourquoi son tort dans ma réponse .
Amir Fo

Réponses:

632

Pour forcer HTTPS en premier, vous devez vérifier la variable d'environnement correcte %{HTTPS} off, mais votre règle ci-dessus ajoute ensuite le www.Puisqu'il y a une deuxième règle à 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 mandataire

Lorsqu'il se trouve derrière certaines formes de proxy, où le client se connecte via HTTPS à un proxy, un équilibreur de charge, une application Passenger, etc., la %{HTTPS}variable peut ne jamais l'être onet provoquer une boucle de réécriture. En effet, votre application reçoit en fait du trafic HTTP ordinaire même si le client et le proxy / équilibreur de charge utilisent HTTPS. Dans ces cas, vérifiez l'en- X-Forwarded-Prototête au lieu de la %{HTTPS}variable. Cette réponse montre le processus approprié

Michael Berkowski
la source
14
Dans certains cas, votre certificat peut être valable uniquement pour un seul domaine (il peut fonctionner avec www, mais pas sans, par exemple). Dans de tels cas, redirigez d'abord vers le domaine correct, puis redirigez vers https, sinon vous obtiendrez un message d'erreur cert dans votre navigateur.
Nick Benson
19
Lorsque j'ai utilisé RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]une URL comme exaple.com/?bla=%20 est devenue exaple.com/?bla=%2520 , c'est-à-dire que le signe de pourcentage a été encodé. Pensez à utiliser le drapeau NEpour éviter le double encodage:RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]
Beat
5
cela me donne une boucle de redirection sur un serveur, fonctionne sur l'autre. je ne sais vraiment pas pourquoi
user151496
4
@ user151496 Le serveur défaillant utilise-t-il une sorte de proxy HTTP, comme passer par un cache Varnish ou dans Passenger? Si c'est le cas, vous devrez peut-être vérifier l'en- X-Forwarded-Prototête pour vérifier HTTPS au lieu de la %{HTTPS}variable. Vous n'avez pas dit quelle partie provoque la boucle, la wwwou la partie HTTPS, mais c'est la première chose qui me vient à l'esprit.
Michael Berkowski
5
À strictement parler, les deux règles que vous avez ci-dessus sont dans le mauvais ordre. Si une demande arrive http://example.com(c'est-à-dire HTTP et non www), vous obtiendrez une double redirection. D'abord à https://example.com(la première règle) puis à https://www.example.com(la deuxième règle). Vous pouvez résoudre ce problème en inversant simplement ces deux règles, car les deux règles redirigent indépendamment vers HTTPS.
MrWhite
149

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

Problème:

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

Solution

Utilisez d'abord la redirection vers le www (ou quel que soit le domaine couvert par votre certificat) et ensuite seulement la redirection https. Cela garantira que vos utilisateurs ne seront 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]
Larzan
la source
5
+1 parce que c'est la meilleure option pour ce scénario, mais notez que cela n'empêchera pas le même problème de se produire si le client y accède https://example.com, mais à mon avis, c'est le format le moins susceptible d'être tapé par un utilisateur. (La réponse acceptée aura également le même problème)
Joshua Goossen
@ Larzan: C'est faux. L'exception de certification se produit uniquement parce que vous effectuez 2 redirections réelles . Remplacez "[L, R = 301]" par "[R = 301]". Les règles ne sont donc pas abandonnées. L = LAST
defim
Si vous devez gérer https://sans wwwtout en ayant un certificat uniquement sur le www, ajoutez simplement cette règle à la solution: RewriteCond %{HTTP_HOST} !^www\. RewriteCond %{HTTPS} on RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI}[L,R=301] elle revient simplement à httplorsque vous essayez de vous connecter https://example.compour éviter une erreur de certificat.
Eric Burel
1
Les deux règles doivent de toute façon être inversées (comme vous l'avez fait), afin d'éviter un double redirection lors de la demande http://example.com(c.-à-d. HTTP et pas www)
MrWhite
@EricBurel Vous ne pouvez pas éviter l'erreur de certificat dans cette instance - la négociation SSL se produit avant l'exécution de votre code (ce qui est tout l'intérêt de SSL en premier lieu). Si votre redirection a pu s'exécuter avant l'erreur de cert des navigateurs, cela impliquerait que la demande a déjà été effectuée via une connexion non sécurisée - ce qui serait un échec fondamental dans le modèle SSL.
MrWhite
99

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]
Andrew
la source
2
Veuillez noter que les conseils actuels sur le site de support Cloudflare sont légèrement différents: support.cloudflare.com/hc/en-us/articles/…
ColinMcDermott
1
D'accord avec @ h0mayun, le conseil Cloudflare donne des résultats dans une boucle de redirection, alors que ce code fonctionne parfaitement ici - merci!
hobailey
2
Je lance angularjs sur ec2. Les solutions utilisant RewriteCond% {HTTPS}! = On me donnent une redirection infinie (je ne sais pas trop pourquoi). Cette solution, avec X-Forwarded-Proto, semble faire l'affaire. Je vous remercie!
Mark Watkins
3
Je modifié =httpà !=httpsnos environnements. X-Forwarded-Protol'en-tête n'a pas été déclaré si http, de même !=httpsque l'astuce.
Johnathan Elmore
Merci pour cet aperçu! J'ai passé des heures à essayer de comprendre pourquoi {HTTPS}ne fonctionnait pas. J'ai essayé {ENV:HTTPS}et même {SERVER_PORT} 443, mais à la fin, c'était parce que je devais vérifier les en-têtes de requête HTTP personnalisés de Cloudflare.
camslice
56

MAUVAISE SOLUTION ET POURQUOI!

N'utilisez jamais la solution ci-dessous car lorsque vous utilisez leur code, c'est 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

Redirige ensuite vers:

https://example.com

Redirige ensuite vers:

https://www.example.com

C'est trop demander au serveur.

La plupart des réponses, même acceptées, ont un problème.


MEILLEURE SOLUTION ET LA RÉPONSE

Ce code a une [OR]condition 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]
Amir Fo
la source
3
"MAUVAISE SOLUTION ET POURQUOI!" - Ces règles sont juste dans le mauvais ordre. Inversez ces deux règles et ce sera correct - vous obtiendrez une seule redirection et non deux.
MrWhite
4
Oui, le code donné donne 2 redirections - je ne le conteste pas - tout ce que je dis, c'est que vous devez simplement inverser ces règles pour résoudre ce problème, aucune autre modification n'est requise. (La réponse "acceptée" est en effet incorrecte - ce qui semble être ce à quoi vous faites référence - les directives sont dans le mauvais ordre.)
MrWhite
1
yup @AmirForsati a raison. il redirige deux fois et cela devrait être la réponse acceptée.
Zakir hussain
4
Vous pouvez l'utiliser si vous souhaitez conserver la variable de nom de domaine:RewriteEngine On RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301] RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
I.devries
Cela me redirige vers wp-content/cache/page_enhanced/et ainsi de suite. Comment puis-je réparer cela? Edit: On dirait que je dois le mettre en haut de .htaccess. Merci pour le script :)
Giacomo
35

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
llioor
la source
2
Correct C'est le meilleur moyen que j'ai trouvé pour les utilisateurs proxy et non proxy +1
Deep 3015
1
C'est le meilleur, car il résout plusieurs redirections 301
Niraj Chauhan
1
meilleure solution jamais.
SM Jobayer Alam
1
Très bonne réponse. C'est le seul qui a fonctionné pour moi. Fonctionne si vous êtes derrière Cloudflare (bien que je n'ai pas de règles de page configurées chez Cloudflare).
jasonco
La seule solution qui fonctionne sur tous mes cas. Mais que se passe-t-il si je veux faire de l'oposite et supprimer tous les "www".
FedeKrum
27

Il existe de nombreuses 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.
# 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
Vynz
la source
J'ai trouvé en changeant la condition de réécriture RewriteCond %{HTTPS} offde RewriteCond %{HTTPS} !=oncette redirection serait toujours le cas, cela semble la meilleure réponse à moi.
Samuel Hawksby-Robinson,
Cette solution doit être acceptée comme une réponse correcte! A aussi fonctionné pour moi!
AndrewShmig
11

Pour rediriger 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 .

starkeen
la source
1
Problème!: Si HTTP_HOST contient déjà www. mais le schéma n'est pas HTTPS, alors vous vous retrouvez avec www.www. chez votre hôte.
Jpsy
@Jpsy vous avez raison. J'ai mis à jour la destination de redirection. Merci pour votre contribution.
starkeen
1
C'est presque ce que je cherchais mais je veux garder le domaine générique comme dans d'autres exemples. C'est possible?
cronoklee
8

Si vous êtes sur CloudFlare, assurez-vous d'utiliser quelque chose comme ça.

# 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 sauvera de la boucle de redirection et redirigera votre site vers SSL en toute sécurité.

PS C'est une bonne idée de vérifier le mod_rewrite.c!

Ahmad Awais
la source
il ne redirige pas https: // theurlwithoutwww.com vers https: // www.
theearentthedroids
C'est en fait une solution qui fonctionne seulement si vous avez des directives "ajouter www" au préalable. D'autres solutions me donnent "de nombreuses redirections".
Daniel.P.
3
RewriteEngine On 
RewriteCond %{SERVER_PORT} 80 
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
Анастасия Ермолик
la source
2
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]

Remarques: assurez-vous d'avoir effectué les étapes suivantes

  1. réécriture sudo a2enmod
  2. sudo service apache2 restart
  3. Ajouter des abonnements 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

Kundan roy
la source
1

Similaire à la solution de redirection htaccess d'Amir Forsati vers https: // www mais pour un nom de domaine variable, je suggère:

RewriteEngine on
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%2%{REQUEST_URI} [R=301,L]
Bernhard Bodenstorfer
la source
0

À 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]
Adam Kozlowski
la source
-2

J'essaie la première réponse et ça ne marche pas ... Ce travail:

<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
Jackssn
la source