У меня есть приложение, развернутое в Elastic Beanstalk, контейнер Tomcat которого использует Google OpenID Connect для аутентификации. Я хочу перенаправить все запросы http на https, для которых у меня есть следующая конфигурация mod_rewrite в файле в .ebextensions -

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            LoadModule rewrite_module modules/mod_rewrite.so
            RewriteEngine On
            RewriteCond %{HTTP:X-Forwarded-Proto} =http
            RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Консоль учетных данных Google OAuth2 имеет https://example.com/j_security_check в качестве авторизованного URL-адреса перенаправления. Конфигурация работает нормально, когда запрашивается либо example.com, либо https://example.com, после чего приложение перенаправляется на упомянутый авторизованный URL.

Однако, когда http явно запрашивается - http://example.com - приложение перенаправляется на https, но port 80 все еще используется. Тогда авторизованный URL переадресации становится https://example.com:80/j_security_check, и я получаю Error: redirect_uri_mismatch.

Как я могу перенаправить явные запросы http на https с изменением порта на 443? Основная цель - соответствовать указанному авторизованному URL-адресу перенаправления. Если возможно, я хотел бы реализовать это с помощью файла конфигурации .ebextensions или аналогичного решения.

0
Anish Sana 2 Янв 2018 в 15:19

2 ответа

Лучший ответ

Проблема была не в правиле перезаписи. Файл должен был быть помещен по определенному пути в .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. Это важно!

Кроме того, перенаправление, которое я получал, не было подлинным. Я не обращал на это пристального внимания, потому что, когда я запросил example.com, кеш браузера обслуживал меня https://example.com. На самом деле это не перенаправление запроса http на https.

0
Anish Sana 6 Янв 2018 в 00:11

Может у вас что-то подобное. Если это сработает, я дам вам объяснение.

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
0
Vaisakh PS 2 Янв 2018 в 13:52