Почему нельзя делать редирект на https в .htaccess

В сети можно найти множество советов добавить в файлик .htaccess строки вида:

RewriteEngine On 
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://www.yourdomain.com/$1 [R,L]

и, якобы пользователь зашедший на сайт по http будет автоматом перекидываться на защищенную SSL-ем версию сайта.

Но на практике это все выливается в бесконечный редирект всех посетителей (и http и https) на всех страницах.

Почему так происходит?

В сообществе системный администраторов ставить «голый» Apache наружу считается моветоном, и на то есть ряд причин. Пока, просто скажу, что это огромная дырень в безопасности. Перед ним практически всегда ставится кеширующий прокси (например, Nginx, или Varnish), раздающий статический контент (картинки, css и прочую дребедень). Он же (а не Apache) и занимается обработкой SSL (SSL termination proxy). Таким, образом, получается, что запрос шифруется на стороне клиента, отправляется по https на сервер, расшифровывается прокси, и, в расшифрованном виде, по http передается Apache. То есть апачу, вне зависимости от того, какой протокол используется, поступает запрос по http, который он, согласно правилам в .htaccess пытается перекинуть на https и так до бесконечности.

Почему нельзя включить обработку SSL на стороне Apache, а не прокси?

Вспомним сетевую модель OSI. Нас интересуют только последние три уровня:

5. Транспортный (TCP, UDP);
6. Представления (SSL, TLS);
7. Прикладной (HTTP, SMTP, IMAP и др.).

То есть, SSL (а если быть точным, то TLS) обеспечивает защищенную среду передачи данных в рамках сессии TCP. При заходе на сайт эта самая сессия устанавливается не между клиентом и Apache, а между клиентом и прокси, который, в свою очередь, устанавливает TCP сессию между собой и Apache. То есть фактически, при этом устанавливаются две последовательные сессии и SSL защищает первую из них. Последняя остается на усмотрение админа.

И как теперь быть? Куда ставить SSL и где делать перенаправление?

Очевидный ответ — в конфиг прокси (Nginx или Varnish).

One thought on “Почему нельзя делать редирект на https в .htaccess

Добавить комментарий