Принудительное использование HTTPS с помощью mod_rewrite, включая прокси SSL


9

У меня есть сервер, получающий некоторый трафик от балансировщика нагрузки, завершающего SSL - в этом случае он приходит как HTTP через порт 80 с http_x_forwarded_proto= "https"

Мне нужно правило mod_rewrite, которое разрешает только прямой HTTPS-трафик или перенаправленный HTTPS-трафик.

У меня есть это до сих пор:

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]

но я получаю

RewriteCond: неверные разделители флага

ошибка.

Что мне нужно исправить, чтобы это работало, и это лучший подход?

Ответы:


16

Проблема заключалась в пробелах после "! =":

Рабочая версия:

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

сложно ...


Я не уверен, что если SSL выгружен, переменная HTTPS когда-либо будет установлена. Во всяком случае, в моей ситуации это работало нормально без первого теста.
wurtel

1

Если у вас есть балансировщик нагрузки, который всегда использует SSL при взаимодействии с сервером, вам нужно пропустить первую проверку, поскольку она всегда будет истинной. (Если вы разгружаете SSL на балансировщике нагрузки, первая строка всегда верна, если кому-то не удастся напрямую подключиться к вашему серверу с использованием SSL, в этом случае это будет false и не будет пытаться перенаправить, так как X-Forwarded-Protoбудет пропущено.)

Код, который я использую, так как мы всегда общаемся через SSL между ELB и веб-сервером:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.