web-dev-qa-db-fra.com

Comment rediriger toutes les requêtes HTTP vers HTTPS

J'essaie de rediriger toutes les requêtes HTTP non sécurisées sur mon site (par exemple, http://www.example.com) vers HTTPS (https://www.example.com). J'utilise PHP btw. Puis-je faire cela dans .htaccess?

254
Cat

Mise à jour: Bien que cette réponse ait été acceptée il y a quelques années, notez que son approche est maintenant recommandée contre par la documentation Apache. Utilisez plutôt une Redirect. Voir cette réponse .


RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

La source

262
Reese Moore

La Apache Docs _ recommande de ne pas utiliser de réécriture:

Pour rediriger les URL http vers https, procédez comme suit:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect / https://www.example.com/
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Ce fragment de code devrait aller dans le fichier de configuration du serveur principal, not dans .htaccess comme demandé dans la question.

Cet article n’a peut-être été évoqué qu’après que la question a été posée et répondue, mais semble être la solution actuelle.

305
ssc

Je recommanderais avec la redirection 301:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
124
David

Comme je le disais dans cette question , je vous suggérerais d'éviter de rediriger aveuglément toutes les demandes HTTP vers leur équivalent HTTPS, car cela pourrait vous donner une fausse impression de sécurité. Au lieu de cela, vous devriez probablement rediriger la "racine" de votre site HTTP vers la racine de votre site HTTPS et créer un lien à partir de là, uniquement vers HTTPS.

Le problème est que si un lien ou un formulaire sur le site HTTPS amène le client à envoyer une demande au site HTTP, son contenu sera visible avant la redirection.

Par exemple, si l'une de vos pages servies sur HTTPS a un formulaire avec <form action="http://example.com/doSomething"> et envoie des données qui ne doivent pas être envoyées en clair, le navigateur envoie d'abord la demande complète (y compris l'entité, s'il s'agit d'un POST) au HTTP. le site d'abord. La redirection sera immédiatement envoyée au navigateur et, étant donné qu'un grand nombre d'utilisateurs désactive ou ignore les avertissements, il est probable qu'elle soit ignorée.

Bien sûr, l'erreur de fournir les liens qui devraient être vers le site HTTPS mais qui finissent par être pour le site HTTP peut poser problème dès que vous obtenez quelque chose d'écoute sur le port HTTP sur la même adresse IP que votre site HTTPS. Cependant, je pense que le fait de garder les deux sites comme un "miroir" n'augmente que les chances de faire des erreurs, car vous pouvez avoir tendance à présumer qu'il se corrigera automatiquement en redirigeant l'utilisateur vers HTTPS, alors qu'il est souvent trop tard. (Il y avait des discussions similaires dans cette question. )

33
Bruno

J'ai découvert que le meilleur moyen pour https et www sur le domaine est

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_Host} !^www.example.com$ [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301]
17
GiorgosK

C’est l’approche de redirection HTML qui fonctionne mais qui n’est pas la meilleure.

 <meta http-equiv="Refresh" content="0;URL=https://www.example.com" />

Approche PHP

<?php
function redirectTohttps() {
    if ($_SERVER['HTTPS']!="on") {
        $redirect= "https://".$_SERVER['HTTP_Host'].$_SERVER['REQUEST_URI'];
        header("Location:$redirect"); 
    } 
}
?>

.htaccess approche

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI}

copié de: www.letuslook.org

12
Timothy Nwanwene

J'aime cette méthode de redirection de http à https. Parce que je n'ai pas besoin de le modifier pour chaque site.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R,L]
9
Cory

C'est la méthode appropriée pour rediriger HTTP vers HTTPS à l'aide de .htaccess selon GoDaddy.com. La première ligne de code est explicite. La deuxième ligne de code vérifie si HTTPS est désactivé et, le cas échéant, redirige HTTP vers HTTPS en exécutant la troisième ligne de code, sinon la troisième ligne de code est ignorée.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

https://www.godaddy.com/help/redirect-http-to-https-automatically-8828

6
AnarchyOutlaw

La meilleure solution dépend de vos exigences. Ceci est un résumé des réponses précédemment publiées avec un contexte ajouté.

Si vous travaillez avec le serveur Web Apache et pouvez modifier sa configuration, suivez la documentation Apache :

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

Mais vous avez également demandé si vous pouvez le faire dans un fichier .htaccess. Dans ce cas, vous pouvez utiliser RewriteEngine d'Apache:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [L]

Si tout fonctionne correctement et que vous souhaitez que les navigateurs gardent cette redirection en mémoire, vous pouvez la déclarer permanente en modifiant la dernière ligne en:

RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Mais faites attention si vous pouvez changer d'avis sur cette redirection. Les navigateurs s'en souviennent très longtemps et ne vérifient pas si cela a changé.

La première ligne RewriteEngine On peut ne pas être nécessaire en fonction de la configuration du serveur Web.

Si vous recherchez une solution PHP, examinez le tableau $ _SERVER et la fonction header :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_Host'] . $_SERVER['REQUEST_URI']); 
} 
6
maikel

L'utilisation du code suivant dans votre fichier .htaccess redirige automatiquement les visiteurs vers la version HTTPS de votre site:

RewriteEngine On

RewriteCond %{HTTPS} off

RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

Si vous avez un fichier .htaccess existant:

Ne dupliquez pas RewriteEngine On.

Assurez-vous que les lignes commençant par RewriteCond et RewriteRule suivent immédiatement le RewriteEngine On déjà existant.

6
OpenWebWar

Ajoutez le code suivant au fichier .htaccess:

Options +SymLinksIfOwnerMatch
RewriteEngine On
RewriteCond %{SERVER_PORT} !=443
RewriteRule ^ https://[your domain name]%{REQUEST_URI} [R,L]

Où [votre nom de domaine] est le nom de domaine de votre site Web.

Vous pouvez également rediriger des dossiers spécifiques hors de votre nom de domaine en remplaçant la dernière ligne du code ci-dessus par:

RewriteRule ^ https://[your domain name]/[directory name]%{REQUEST_URI} [R,L]
5
Rahul

Faites tout ce qui est expliqué ci-dessus pour la redirection. Ajoutez simplement "HTTP Strict Transport Security" à votre en-tête. Cela évitera l'homme dans l'attaque du milieu.

Editez votre fichier de configuration Apache (/etc/Apache2/sites-enabled/website.conf et /etc/Apache2/httpd.conf par exemple) et ajoutez ce qui suit à votre hôte virtuel:

# Optionally load the headers module:
LoadModule headers_module modules/mod_headers.so

<VirtualHost 67.89.123.45:443>
    Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
</VirtualHost>

https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security

4
Waqas

Si vous êtes dans une situation où vous ne pouvez pas accéder directement à la configuration Apache pour votre site, où de nombreuses plates-formes hébergées sont toujours limitées de cette manière, je recommanderais en fait une approche en deux étapes. La raison pour laquelle Apache lui-même indique que vous devriez utiliser ses options de configuration d’abord et surtout par le biais de mod_rewrite pour HTTP à HTTPS.

Premièrement, comme mentionné ci-dessus, vous devez configurer vos règles .htaccess mod_rewrite:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

Ensuite, dans votre (vos) fichier (s) PHP (vous devez le faire chaque fois que cela convient à votre situation, certains sites transfèreront toutes les demandes dans un seul fichier PHP, d’autres sur leurs besoins et la demande faite):

<?php if ($_SERVER['HTTPS'] != 'on') { exit(1); } ?>

Ce qui précède doit être exécuté avant tout code susceptible d’exposer des données sécurisées dans un environnement non sécurisé. Ainsi, votre site utilise la redirection automatique via HTACCESS et mod_rewrite, tandis que vos scripts garantissent qu'aucune sortie n'est fournie sans un accès via HTTPS.

J'imagine que la plupart des gens ne pensent pas de la sorte, et Apache vous recommande donc de ne pas utiliser cette méthode dans la mesure du possible. Cependant, une vérification supplémentaire en fin de développement est nécessaire pour garantir la sécurité des données de vos utilisateurs. J'espère que cela aidera quelqu'un d'autre qui pourrait avoir à se pencher sur l'utilisation de méthodes non recommandées en raison de restrictions imposées sur nos services d'hébergement.

3
F. Scott Gale

Grâce à .htaccess Cela aidera.

RewriteEngine On


RewriteBase /
RewriteCond %{HTTP_Host} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} !=on
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Reportez-vous également à cela pour plus de détails. Comment rediriger HTTP Http?

2
Roshan Padole

Sauf si vous avez besoin de mod_rewrite pour autre chose, utiliser la directive SI Apache est plus propre et plus rapide:

<If "%{HTTPS} == 'off'">
Redirect permanent / https://yoursite.com/
</If>

Vous pouvez ajouter d'autres conditions à la directive IF, telles que garantir un seul domaine canonique sans le préfixe www:

<If "req('Host') != 'myonetruesite.com' || %{HTTPS} == 'off'">
Redirect permanent / https://myonetruesite.com/
</If>

Il y a beaucoup d'inertie de familiarité à utiliser mod_rewrite pour tout, mais voyez si cela fonctionne pour vous.

Plus d'infos: https://httpd.Apache.org/docs/2.4/mod/core.html#if

Pour le voir en action (essayez sans www ou https: //, ou avec .net au lieu de .com): https://nohodental.com/ (un site sur lequel je travaille).

2
SashaK

Pour rediriger toutes les demandes http vers https, vous pouvez utiliser:

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_Host}%{REQUEST_URI} [NE,L,R]

Si mod-rewrite n'est pas activé et que vous utilisez Apache 2.4, vous pouvez également utiliser une directive Redirect à l'intérieur de if pour rediriger les demandes http vers https.

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
2
starkeen

J'ai trouvé une méthode pour forcer toutes les pages de mon site à rediriger de http à analogique en pages https qui fonctionnent pour moi.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
1
Oleg Apanovich

Si vous utilisez Apache, mod_rewrite est la solution la plus simple et dispose de nombreuses documentations en ligne expliquant comment le faire. Par exemple: http://www.askapache.com/htaccess/http-https-rewriterule-redirect.html

0
vcsjones

Si vous souhaitez le faire à partir du serveur Tomcat, suivez les étapes ci-dessous.

Sur un serveur HTTP autonome Apache Tomcat (8.5.x), comment le configurer afin que, si un utilisateur saisit www.domain.com, il soit automatiquement transféré vers le site https (www.domain.com).

La méthode en 2 étapes pour inclure les éléments suivants dans votre [Tomcat_base] /conf/web.xml avant la balise de fermeture

step 1: 
<security-constraint>
<web-resource-collection>
<web-resource-name>HTTPSOnly</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>

et en définissant les paramètres de connecteur [Tomcat_base] /conf/server.xml:

step 2:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="443"/>
<Connector port="443" protocol="org.Apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true">
<SSLHostConfig>
<Certificate certificateKeystoreFile="[keystorelocation]" type="RSA" />
</SSLHostConfig>
</Connector>

Remarque: Si vous avez déjà effectué la configuration https et essayé de rediriger l'utilisateur, effectuez l'étape 1 uniquement.

0
Bhaskara Arani

Un autre bord à ce problème est quand un équilibreur de charge entre en jeu. 

La situation est la suivante: - Le trafic entre le navigateur et l'équilibreur de charge est (devrait être) HTTPS - Le trafic entre Load Balancer et le serveur Web réel est HTTP. 

Ainsi, toutes les variables de demande de serveur dans PHP ou Apache indiquent que la connexion est simplement HTTP. Et les répertoires HTTP et HTTPS sur le serveur sont les mêmes.

La RewriteCondition dans la réponse approuvée ne fonctionne pas. Cela donne une boucle ou ça ne marche pas. 

La question est: Comment faire en sorte que cela fonctionne sur un équilibreur de charge. 

(Ou bien l'équilibreur de charge est-il mal configuré? C'est ce que j'espère, car je peux alors transférer le problème à la société WebHosting :-))

0
BertC

prendre ce code pour vous .htaccess fichier Rediriger HTTP vers HTTPS automatiquement

RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]

0
Ehsan Sattari

Ça marche pour moi:

<IfModule mod_rewrite.c>
 RewriteEngine On
  RewriteCond %{HTTPS} !on
  RewriteRule ^(.*)$ https://%{HTTP_Host}%{REQUEST_URI} [L,R=301]
</IfModule>

et par exemple, http: // serveur/foo? email = quelqu'un% 40exemple.com redirige normalement sans aucun problème . Le fichier .htaccess situé dans le dossier racine du site Web (nommé par exemple public_html) .Il est possible d'utiliser RewriteCond% {SERVER_PORT}! ^ 443 $ à la place RewriteCond% {HTTPS}! Sur

0
Intacto
 Redirect 301 / https://example.com/

(travaillé pour moi quand aucune des réponses ci-dessus n'a fonctionné)

Prime:

ServerAlias www.example.com example.com

(https: // www . example.com fixe non trouvé)

0
aalesund

Si vous utilisez un Elastic Load Balancer Amazon Web Services qui accepte le trafic https et l'achemine vers votre ou vos serveurs avec http, le moyen correct de rediriger tout le trafic http vers https est décrit ici: https: // aws. Amazon.com/premiumsupport/knowledge-center/redirect-http-https-elb

Utilisez l'en-tête X-Forwarded-Proto (contient http ou https) qui est toujours inclus dans les demandes http de l'équilibreur de charge, comme décrit ici: https://docs.aws.Amazon.com/elasticloadbalancing/latest/classic/ x-forwarded-headers.html

Dans le fichier httpd.conf:

<VirtualHost *:80>

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

</VirtualHost>

Ou dans votre fichier .htaccess racine:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Bonus: il ne tentera pas de rediriger le trafic http sur votre ordinateur de développement local.

0
ScottyB