Назад | Перейти на главную страницу

mod_rewrite - правило перенаправления HTTP на HTTPS работает только после доступа к нему сначала через HTTP

У меня есть приложение 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 сайт. Вот почему это не сработает, когда я очистил кеш.