web-dev-qa-db-fra.com

Basculer correctement entre HTTP et HTTPS à l'aide de .htaccess

Nous avons un site d'achat que nous hébergeons sur un hôte partagé (Mediatemple Gridserver). Certaines parties du site doivent utiliser HTTPS (paiement, etc.) mais le reste doit utiliser HTTP.

Quelqu'un sait-il comment nous pouvons toujours forcer l'utilisation correcte de HTTP/HTTPS pour des URL particulières? Nous l'avons fait fonctionner dans différents états, mais nous ne pouvons pas obtenir une demande pour une page qui devrait être sur HTTP mais qui est demandée avec HTTPS pour revenir correctement.

J'ai jeté un œil autour de SO mais je n'ai pas trouvé de réponse appropriée à cela.

21
Alistair Holt

J'utilise quelque chose de similaire à ceci pour mon dossier d'administration dans wordpress:

#redirect all https traffic to http, unless it is pointed at /checkout
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} !^/checkout/?.*$
RewriteRule ^(.*)$ http://mydomain.com/$1 [R=301,L]

Le RewriteCond %{HTTPS} on la portion peut ne pas fonctionner pour tous les serveurs Web. Mon hébergeur nécessite RewriteCond %{HTTP:X-Forwarded-SSL} on, par exemple.

Si vous souhaitez forcer l'inverse, essayez:

#redirect all http traffic to https, if it is pointed at /checkout
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} ^/checkout/?.*$
RewriteRule ^(.*)$ https://mydomain.com/$1 [R=301,L]

Si vous voulez d'autres façons de le faire, consultez askapache .

38
Curtis Tasker

Cela devrait fonctionner dans à peu près tous les scénarios et devrait fonctionner dans votre vhost ou .htaccess réel:

RewriteEngine on
RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]

(n'oubliez pas la barre oblique avant% {REQUEST_URI} car cela peut permettre de passer un numéro de port, ce qui est dangereux)

15
Wil Moore III
RewriteEngine on
RewriteCond %{HTTPS} off [OR] 
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{SERVER_NAME}/%{REQUEST_URI} [R=301,L]

J'ai eu du mal à être derrière un loadballancer. C'est comme ça que je l'ai réparé.

6
Sjaak Wish

Comme détaillé dans cette réponse , corrigez votre application pour utiliser https:// liens en cas de besoin. Ne vous fiez pas aux redirections automatiques, cela pourrait vous conduire à un faux sentiment de sécurité si vous n'avez pas rendu vos liens/formulaires servis sur https:// aller à https:// URL aussi. En utilisant mod_rewrite rend automatiquement plus difficile la détection de telles erreurs (qui peuvent également être des vulnérabilités).

1
Bruno

Pour moi, cela a fonctionné (je l'ai utilisé pour wordpress et redirection vers HTTPS). Vous devez ajouter les lignes de condition et de règle juste derrière les lignes RewriteEngine et RewriteBase:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# I added these two lines for redirect to HTTPS
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://www.yoursite.com/$1 [R=301,L]
# (end of custom modifications)

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress`

Jetez un œil pour conditionner RewriteCond %{HTTP:X-Forwarded-Proto} !https - seulement cela a fonctionné pour mon serveur d'hébergement. (J'ai essayé RewriteCond %{SERVER_PORT} !^443$ ou RewriteCond %{HTTPS} off également, mais sans succès.

1
David Najman

Je pense que ça devrait être:

RewriteCond %{HTTPS}  =on
^/checkout(.*) http://shoppingsite.com/checkout$1 [R]

Voir la documentation mod_rewrite .

0
Matthew Flaschen