Forcer HTTPS avec mod_rewrite, y compris le proxy SSL

9

J'ai un serveur qui reçoit du trafic d'un équilibreur de charge de terminaison SSL, auquel cas il arrive en HTTP sur le port 80 avec a http_x_forwarded_proto= "https"

Je veux une règle mod_rewrite qui autorise uniquement le trafic HTTPS direct ou le trafic HTTPS transféré.

J'ai ceci jusqu'à présent:

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

mais je reçois

RewriteCond: délimiteurs de drapeau incorrects

Erreur.

Que dois-je corriger pour que cela fonctionne, et est-ce la meilleure approche?

Yarin
la source

Réponses:

16

Le problème était l'espace blanc après le "! =":

Version de travail:

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

rusé...

Yarin
la source
Je ne suis pas sûr que si le SSL est déchargé, que la variable HTTPS sera jamais définie. Quoi qu'il en soit dans ma situation, cela a bien fonctionné sans le premier test.
wurtel
1

Si l'équilibreur de charge utilise toujours SSL lors de la communication avec le serveur, vous devez omettre la première vérification car elle sera toujours vraie. (Si vous déchargez SSL sur l'équilibreur de charge, la première ligne est toujours vraie, sauf si quelqu'un parvient à frapper directement votre serveur en utilisant SSL, auquel cas ce serait faux et n'essayez pas de rediriger car X-Forwarded-Protoil manquerait.)

Le code que j'utilise car nous communiquons toujours via SSL entre l'ELB et le serveur Web:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Loren
la source