17 votes

Boucle de redirection lors de la redirection de toutes les demandes http vers https en utilisant .htaccess

J'ai les règles suivantes dans mon fichier .htaccess

# to redirect http to https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

# to redirect urls with index.php to /
RewriteCond %{THE_REQUEST} ^.*/index.php 
RewriteRule ^(.*)index.php$ /$1 [R=301,L]

# to redirect non www requests to www url
RewriteCond %{HTTP_HOST} !^www\.example\.com 
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]

Lorsque j'essaie d'accéder au site Web, il se transforme en une boucle de redirection. Comment résoudre ce problème et rediriger correctement ?

34voto

Konstantin Points 856

Juste au cas où quelqu'un aurait une boucle de redirection en utilisant Apache http->https rewrite derrière un équilibreur de charge, voici la solution qui a fonctionné pour moi.

J'ai eu le même problème en utilisant RewriteCond %{HTTPS} off pour Apache derrière l'équilibreur de charge, quand l'équilibreur de charge fait des trucs SSL.

Si la version https du site n'est pas configurée via Apache ModSSL, la variable %{HTTPS} n'est pas activée et la redirection se poursuit à l'infini.

La solution la plus simple consiste à diriger tout le trafic https vers un autre serveur virtuel Apache (lorsque le SSL est géré par un équilibreur de charge) qui est la copie du serveur principal, mais dont le port est différent (disons 81). Et dans le fichier .htaccess, utilisez mod_rewrite pour tout ce qui n'est pas sur le port 81 :

ReWriteCond %{SERVER_PORT} !^81$
RewriteRule ^/(.*) https://%{HTTP_HOST}/$1 [NC,R,L]

La deuxième façon de procéder consiste à envoyer l'en-tête X-Forwarded-Proto de l'équilibreur de charge à Apache et à l'utiliser dans la condition de réécriture :

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

15voto

Z M Points 151

J'ai vu beaucoup de personnes souffrir de boucles de redirection en essayant d'utiliser des fichiers .htaccess pour passer de http à https. Et il y a BEAUCOUP de réponses différentes sur la façon de résoudre ce problème. Certaines personnes disent :

ReWriteCond %{SERVER_PORT} 80
OR
RewriteCond %{HTTPS} off
OR
RewriteCond %{HTTPS} !on
OR (as above)
RewriteCond %{HTTP:X-Forwarded-Proto} !https
OR EVEN
RewriteCond %{HTTP:X-Forwarded-SSL} =off

mais aucune d'entre elles n'a fonctionné pour moi. J'ai fini par découvrir la vérité sous-jacente, à savoir que les différents serveurs sont configurés de différentes manières et qu'ils fournissent tous différentes variables de serveur.

Si aucune de ces méthodes ne fonctionne pour vous, l'astuce consiste à utiliser PHP pour trouver les variables env que votre serveur particulier vous envoie lorsque vous accédez à une page http, et les variables env qu'il vous envoie lorsque vous accédez à une page https, puis vous pouvez utiliser cette variable pour effectuer la redirection. Il suffit de créer un fichier PHP (tel que showphpvars.php) sur votre serveur avec ce code :

<?php phpinfo() ?>

et ensuite le visualiser avec un navigateur. Trouvez la section des variables avec _SERVER["HTTP_HOST" (etc)], et cherchez celle qui change pour http et https. La mienne s'est avérée être une variable appelée SSL qui était définie à 1 lors de l'utilisation de https, et pas du tout définie lors de l'utilisation de http.

J'ai utilisé cette variable pour rediriger vers https avec PHP, ce qui est tellement plus agréable que d'utiliser htaccess, mais je pense que toutes les variables _SERVER peuvent aussi être accédées en utilisant htaccess, si vous voulez continuer à l'utiliser. Utilisez simplement le nom entre guillemets, sans le bit _SERVER[""] que PHP ajoute.

7voto

Indigo Points 590

Pour votre information, cela dépend vraiment de votre fournisseur d'hébergement. Il peut utiliser un équilibreur de charge, comme l'a indiqué Konstantin dans une autre réponse.

Dans mon cas ( Infomaniak ), rien de ce qui précède n'a fonctionné et j'ai obtenu une boucle de redirection infinie.

La bonne façon de procéder est expliqué dans leur site d'assistance :

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://your-domain.com/$1 [R=301,L]

Vérifiez donc toujours auprès de votre fournisseur d'hébergement. Avec un peu de chance, ils ont un article expliquant comment faire. Sinon, demandez simplement à l'assistance.

1voto

Bjarte Aune Olsen Points 123

Si vous obtenez une boucle de redirection quoi que vous fassiez dans htaccess, effectuez la redirection en PHP à la place.

J'ai utilisé phpinfo(), comme @z-m le suggère, pour trouver la variable qui change lorsque je suis sur SSL. Dans mon cas, c'était $_SERVER['HTTP_X_PROTO'] == "https". Lorsque je ne suis pas sur SSL, cette variable n'est pas définie.

Voici le code que j'utilise pour rediriger de HTTP à HTTPS :

  if ($_SERVER['HTTP_X_PROTO'] != "https") {
    header("HTTP/1.1 301 Moved Permanently");
    $location = "https://" . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI];
    header("Location: $location");
    exit;
  }

0voto

Zuben45 Points 29
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X