Comment rediriger toutes les requêtes HTTP vers HTTPS

j'essaie de rediriger toutes les requêtes https://over.wiki/http/" class="blnk">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 dans .htaccess?

243
demandé sur Kate Gregory 2010-11-03 03:14:20

20 réponses

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


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

Source

245
répondu Reese Moore 2017-05-23 12:10:46

le Apache docs déconseille l'utilisation d'une réécriture:

rediriger http Url https , procédez de la manière suivante:

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

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

cet extrait doit aller dans le fichier de configuration du serveur principal, et non dans .htaccess comme demandé dans la question.

cet article aurait pu apparaître seulement après que la question ait été posée et répondu, mais semble être la voie à suivre.

287
répondu ssc 2018-02-15 22:38:26

je recommande avec 301 redirect:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
117
répondu David 2014-12-29 23:05:37

comme je le disais dans cette question , je vous conseille d'éviter de rediriger toutes les requêtes HTTP vers leur équivalent HTTPS aveuglément, 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 fait que le client envoie 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 qui dit <form action="http://example.com/doSomething"> et envoie des données qui ne devraient pas être envoyées en clair, le navigateur enverra d'abord la demande complète (y compris l'entité, si c'est un message) au site HTTP en premier. La redirection sera envoyée immédiatement au navigateur et, comme un grand nombre d'utilisateurs désactivent ou ignorent les Avertissements, il est probable qu'elle sera ignorée.

de 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 causer des problèmes 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 garder les deux sites comme un "miroir" augmente seulement les chances de faire des erreurs, car vous pouvez avoir tendance à faire l'hypothèse qu'il va auto-corriger en redirigeant l'utilisateur vers HTTPS, alors qu'il est souvent trop tard. (Il y avait similaire les discussions dans à cette question. )

30
répondu Bruno 2017-05-23 12:34:51

j'ai découvert que la meilleure façon pour https et www sur le domaine est

RewriteCond %{HTTPS} off 
RewriteCond %{HTTPS_HOST} !^www.cheapcarhire.gr$ [NC]
RewriteRule ^(.*)$ https://www.cheapcarhire.gr/ [L,R=301]
16
répondu GiorgosK 2014-10-21 10:42:42

c'est l'approche de redirection html qui fonctionne mais pas la meilleure.

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

PHP approach

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

.htaccess approch 151940920"

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

copié de: www.letuslook.org

11
répondu Timothy Nwanwene 2016-04-15 11:27:04

j'aime cette méthode de redirection de http vers https. Parce que je n'ai pas besoin de l'éditer pour chaque site.

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
9
répondu Cory 2014-11-21 08:37:25

c'est la bonne méthode pour rediriger HTTP vers HTTPS en utilisant .htaccess selon GoDaddy.com. La première ligne du code est explicite. La deuxième ligne de code vérifie si HTTPS est désactivé, et si c'est le cas, il redirige HTTP vers HTTPS en lançant 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
répondu AnarchyOutlaw 2016-02-22 16:39:09

en Utilisant le code suivant dans votre .le 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 existant .fichier htaccess:

ne pas dupliquer RewriteEngine On.

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

6
répondu OpenWebWar 2016-07-02 11:26:03

ajouter 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 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
répondu Rahul 2014-09-28 15:44:39

la meilleure solution dépend de vos exigences. Il s'agit d'un résumé des réponses précédemment publiées avec un certain 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 aussi demandé si vous pouviez le faire dans un fichier .htaccess . Dans ce cas, vous pouvez utiliser Apache RewriteEngine :

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

si tout fonctionne bien et que vous voulez que les navigateurs se souviennent de cette redirection, vous pouvez la déclarer comme permanente en changeant 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 pendant très longtemps et ne vérifieront pas si elle a changé.

vous pouvez ne pas avoir besoin de la première ligne RewriteEngine On en fonction de la configuration du serveur web.

si vous regardez pour une solution PHP, regardez la $_SERVER array et la header function :

if (!$_SERVER['HTTPS']) {
    header("Location: https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']); 
} 
5
répondu maikel 2016-09-11 09:14:47

faites tout ce qui est expliqué ci-dessus pour la redirection. Il suffit d'ajouter "HTTP Strict Transport Security" à votre en-tête. Cela évitera l'homme au milieu de l'attaque.

éditez votre fichier de configuration apache (/etc/apache2/sites-enabled / website.conf et / etc/apache2 / httpd.conf par exemple) et ajouter ce qui suit à votre serveur 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
répondu Waqas 2015-08-21 22:23:39

pour rediriger toutes les requêtes http vers https , vous pouvez utiliser:

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

si le mod-rewrite n'est pas activé et que vous êtes sur apache 2.4, Vous pouvez également utiliser une directive Redirect à l'intérieur de if pour rediriger les requêtes http vers https .

Apache 2.4.

<if "%{HTTPS} !~ /on/">
Redirect / https://www.example.com/
</if>
2
répondu starkeen 2016-07-02 13:46:39

à travers .htaccess.

RewriteEngine On


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

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

aussi, référez-vous à ceci pour plus de détails. Comment Rediriger Http Vers Https?

2
répondu Roshan Padole 2016-12-17 09:51:12

sauf si vous avez besoin de mod_rewrite pour d'autres choses, en utilisant Apache core si la directive est plus propre et plus rapide:

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

vous pouvez ajouter plus de conditions à la directive IF, comme assurer 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é dans l'utilisation de mod_rewrite pour tout, mais voyez si cela fonctionne pour vous.

plus d'informations: https://httpd.apache.org/docs/2.4/mod/core.html#if

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

2
répondu SashaK 2017-02-06 21:53:55

si vous êtes dans une situation où vous ne pouvez pas accéder à la config apache directement pour votre site, ce que de nombreuses plates-formes hébergées sont encore limitées de cette façon, alors je recommande en fait une approche en deux étapes. La raison pour laquelle Apache lui-même documente que vous devez utiliser ses options de configuration d'abord et avant tout sur le mod_rewrite pour HTTP à HTTPS.

tout d'abord, comme mentionné ci-dessus, vous devez configurer votre .htaccess mod_rewrite règle (s):

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

puis, dans votre(Vos) fichier (s) PHP (vous devez faire ceci où que ce soit il serait approprié pour votre situation, certains sites canaliseront toutes les demandes à travers un seul fichier PHP, d'autres serviront différentes pages en fonction de leurs besoins et la demande étant 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 une redirection automatique via HTACCESS et mod_rewrite, pendant que votre(vos) script (s) s'assurent qu'aucune sortie n'est fournie lorsqu'il n'est pas accédé par HTTPS.

je suppose que la plupart des gens ne pensent pas comme ça, et Apache recommande donc de ne pas utiliser cette méthode là où c'est possible. Cependant, il suffit d'un contrôle supplémentaire sur la fin du développement pour s'assurer que les données de votre utilisateur est sécurisé. Espérons que cela aide quelqu'un d'autre qui pourrait avoir à examiner l'utilisation de méthodes non recommandées en raison de restrictions sur nos services d'hébergement fin.

2
répondu F. Scott Gale 2017-10-28 15:00:39

j'ai trouvé une méthode pour forcer toutes les pages de mon site à rediriger du http vers l'analogique des pages sur https qui fonctionnent pour moi.

RewriteEngine On 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
1
répondu Oleg Apanovich 2018-07-03 20:36:43

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

0
répondu vcsjones 2010-11-03 00:16:12

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

la situation est la suivante: - Le trafic à partir du navigateur pour charger L'équilibreur, et Retour, Est (devrait être) HTTPS - Le trafic entre L'équilibreur de charge et le serveur web réel est HTTP.

ainsi, toutes les variables de requête de serveur en PHP ou Apache montrent que la connexion est juste HTTP. Et les répertoires HTTP et HTTPS sur le serveur sont les mêmes.

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

Question Est: Comment obtenir ce travail sur un équilibreur de charge.

(ou le répartiteur de charge est-il configuré incorrectement. Ce qui est ce que j'espère car je peux alors déplacer le problème à la société D'hébergement: -))

0
répondu BertC 2015-09-26 11:30:46

si vous utilisez un équilibreur de charge élastique D'Amazon Web Services qui accepte le trafic https et l'achemine vers votre(s) serveur (s) avec http, la bonne façon de rediriger tout le trafic http vers https est décrite 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 requêtes http du répartiteur de charge, comme décrit ici: https://docs.aws.amazon.com/elasticloadbalancing/latest/classic/x-forwarded-headers.html

dans le httpd.fichier conf:

<VirtualHost *:80>

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

</VirtualHost>

Ou dans votre racine .fichier htaccess:

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

Bonus: il n'essaiera pas de rediriger le trafic http sur votre machine de développement local.

0
répondu ScottyB 2018-07-06 22:31:52