Мне нужно перенаправить весь входящий HTTP-трафик на HTTPS на моем эластичном балансировщике нагрузки.
Устал использовать Apache mod_rewrite:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
Используя преимущество заголовка X-Forwarded-Proto, добавленного балансировщиком нагрузки, это правило должно инструктировать браузер пользователя запрашивать версию HTTPS того же URL-адреса.
Пока не работает (перенаправления не происходит).
Что я делаю не так?
Есть лучший способ сделать это?
РЕДАКТИРОВАТЬ:
В конечном итоге это сработало:
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !=https
RewriteRule ^/(.*)$ https://%{SERVER_NAME}/$1 [R=301,L]
Итак, я предполагаю, что у вас установлен ELB для приема трафика как по HTTP / 80, так и по HTTPS / 443, но все порты перенаправляются на HTTP.
Если вы хотите использовать свой метод (который является умным), уверены ли вы, что то, что вы получите, не %{X-Forwarded-Proto}
- в HTTP:
Приставка мне кажется странной. В остальном это мне кажется правильным.
Если он находится на виртуальном хосте или в конфигурации основного сервера и все еще не работает, вы можете добавить
RewriteLog rewrite-log
RewriteLogLevel 3
затем загляните в файл rewrite-log
чтобы увидеть, что на самом деле происходит. Этот файл может быть невероятно подробным, начиная с более низких уровней. Ведение журнала невозможно запустить из .htaccess
файлы.
(Я бы посоветовал вам сделать флажки на RewriteRule
[R=301,L]
что заставит сервер отправить ответ 301, который сообщает поисковым системам считать перенаправление постоянным и соответственно обновлять свои ссылки.)
В моем случае проблема заключалась в том, что условие! Https нарушало проверку работоспособности.
изменение условия на ^ http $ заставило его работать
RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
обнаружил, что здесь: https://forums.aws.amazon.com/thread.jspa?messageID=641930
Просто хотел добавить свой опыт, поскольку я часами боролся, прежде чем понял, что в моем файле сердцебиения есть неэкранированная точка (/alive.html). Ага.
Вторая проблема заключалась в том, что основной домен не перенаправлял, а файлы. Так http://domain.com/hello.html перенаправлял на https://domain.com/hello.html, но http://domain.com не было.
Вот что я положил в свой файл .htaccess, который у меня сработал:
RewriteEngine On
# SSL connection forced
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/alive\.html$
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]