У меня есть приложение Tomcat 8, развернутое на Elastic Beanstalk, которое использует поддомен моего основного приложения. Оба являются отдельными приложениями и не взаимодействуют друг с другом. у меня есть mod_rewrite
правило перенаправления всех http
запросы к https
в файле конфигурации в .ebextensions
папка -
files:
"/etc/httpd/conf.d/httpd_redirect.conf" :
mode: "000644"
owner: root
group: root
content: |
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://sub.domain.com%{REQUEST_URI} [L,R]
В идеале, кто-то получает доступ к приложению по адресу sub.domain.com
или http://sub.domain.com
будет перенаправлен на https://sub.domain.com
.
Проблема в том, что это работает только после того, как я запрошу приложение с https
первый. Итак, я должен запросить https://sub.domain.com
сначала, а затем и далее, non-https
запросы будут перенаправлены на https
.
Кроме того, это работает только до тех пор, пока я не очищу кеш браузера. После очистки кеша non-https
запросы больше не перенаправляются на https
. Я сделал https
запросите сначала снова, чтобы перенаправление начало работать.
Что может быть причиной этого? Основной домен использует сертификат, отличный от сертификата субдомена, если это имеет значение.
Как заставить приложение всегда использовать https
?
У меня включен безопасный прослушиватель на балансировщике нагрузки с этим файлом конфигурации в .ebextensions
-
option_settings:
aws:elb:listener:443:
SSLCertificateId: arn:aws:acm:us-east-2:1234567890123:certificate/####################################
ListenerProtocol: HTTPS
InstancePort: 80
Проблема была не в правиле перезаписи. Файл должен был быть помещен по определенному пути в .ebextensions
чтобы он работал в Tomcat 8. Конфигурационные файлы тоже нужно было настроить по-другому. Большинство приведенных примеров не относились к Tomcat, поэтому я поместил их не в то место.
Что сработало -
В /.ebextensions/httpd/conf.d/myconf.conf
, место -
LoadModule rewrite_module modules/mod_rewrite.so
И в /.ebextensions/httpd/conf.d/elasticbeanstalk/00_application.conf
, место -
<VirtualHost *:80>
<Proxy *:80>
Order Allow,Deny
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>
Обратите внимание на использование .conf
файлы вместо .config
. Это важно!
Кроме того, ложное ощущение перенаправления, которое я получал, было связано с тем, что кеш браузера обслуживает меня https
сайт. Вот почему это не сработает, когда я очистил кеш.