Как заставить https на эластичном бобовом стебле?

65

Я не могу заставить https на свободном уровне использования эластичного бобового стебля.

Я пробовал следующее предложение в Как заставить https на эластичный beanstalk Amazon без проверки работоспособности

Использование этого правила перезаписи Apache

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{REQUEST_URI} !^/status$ 
RewriteCond %{REQUEST_URI} !^/version$ 
RewriteCond %{REQUEST_URI} !^/_hostmanager/ 
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

Когда я пытаюсь это сделать, HTTP-запросы не перенаправляются на https, как хотелось бы. Вместо этого страница http загружается нормально. Я также попытался использовать заголовок X-Forwarded-Port с тем же результатом.

Я также пробовал следующее правило перезаписи

RewriteCond %{SERVER_PORT} 80
RewriteRule . https://%{SERVER_NAME}%{REQUEST_URI} [L,R]

И это правило вызывает цикл перенаправления. Таким образом, казалось бы, что правила перезаписи apache не собирают заголовки балансировки эластичной нагрузки X-Forwarded-Port и X-Forwarded-Proto, но и цикл перенаправления - это не то, что я собираюсь сделать.

Пожалуйста, помогите. Я новичок в AWS, Elastic Beanstalk и не очень хорошо знаком с правилами Apache. Я не слишком уверен, куда идти отсюда. Спасибо.

  • 0
    После сна, кажется, что правила перезаписи теперь обнаруживают заголовок X-Forwarded-Proto. Не совсем уверен, почему, но это работает сейчас.
  • 1
    Кажется, что Интернет не может договориться об одном, полном и рабочем решении этой проблемы. Надеюсь, вы можете получить помощь здесь, в моем посте . Я должен был прыгать через обручи, чтобы придумать это, наконец.
Показать ещё 1 комментарий
Теги:
amazon-web-services
mod-rewrite
https
elastic-beanstalk

20 ответов

149

Этот ответ предполагает, что вы уже включили https в группе безопасности балансировки нагрузки, добавили сертификат SSL в балансировщик нагрузки, добавили 443 в порты, перенаправленные балансировщиком нагрузки, и указали свое доменное имя в среде Elastic Beanstalk с помощью Route 53 (или эквивалентная служба DNS).

ПРИМЕЧАНИЕ. Этот ответ относится к средам с эластичным beanstalk, которые используют Apache. Он также может не работать для развертывания на докере.

Все, что вам нужно сделать, это добавить в один из ваших .config файлов в каталог .ebextensions вашего проекта следующее:

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            RewriteEngine On
            <If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
            RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
            </If>

Описание

Это умеренно прямо за пределами эластичного бобового стебля. Обычно добавляется правило перезаписи Apache, например:

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

Или, если за балансиром нагрузки, как и в этом случае:

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Однако эти конфигурации работают только в блоке <VirtualHost>. Изменение блока RewriteCond на <If> позволяет корректно работать за пределами блока <VirtualHost>, что позволяет нам вставить автономный конфигурационный файл Apache. Обратите внимание, что стандартная установка Apache в CentOS (включая настройку на ElasticBeanstalk) включает все файлы, соответствующие /etc/httpd/conf.d/*.conf, которые соответствуют пути файла, в котором мы храним этот файл.

Часть условия -n '%{HTTP:X-Forwarded-Proto}' предотвращает перенаправление, если вы не находитесь за балансировщиком нагрузки, что позволяет вам иметь общую конфигурацию между производственной средой с балансировщиком нагрузки и https и промежуточную среду, которая представляет собой единый экземпляр и не имеет https. Это не обязательно, если вы используете балансировщики нагрузки и https во всех своих средах, но это не повредит.

Плохие решения, которые я видел

Я видел много плохих решений этой проблемы, и стоит прочесть их, чтобы понять, почему это решение необходимо.

  • Использовать Cloudfront:. Некоторые люди предлагают использовать не кэшированную настройку Cloudfront перед Elastic Beanstalk для перенаправления HTTP на HTTPS. Это добавляет совершенно новую услугу (что добавляет сложности), что не совсем подходит (Cloudfront - это CDN, это не правильный инструмент для принудительного HTTPS для наследуемого динамического контента). Конфигурация Apache - это нормальное решение этой проблемы, а Elastic Beanstalk использует Apache, чтобы мы могли идти.

  • SSH на сервер и...: Это совершенно противоречит точке Elastic Beanstalk и имеет так много проблем. Любые новые экземпляры, созданные автомасштабированием, не будут иметь модифицированную конфигурацию. Любая клонированная среда не будет иметь конфигурацию. Любое количество разумного набора изменений среды уничтожит конфигурацию. Это такая плохая идея.

  • Перезаписать конфигурацию Apache с новым файлом: Это попадает в правильную область решения, но оставляет вас в кошмаре обслуживания, если Elastic Beanstalk изменяет аспекты настройки сервера (что они очень хорошо может сделать). Также см. Проблемы в следующем элементе.

  • Динамически редактировать конфигурационный файл Apache, чтобы добавить несколько строк: Это достойная идея. Проблемы с этим в том, что он не будет работать, если Elastic Beanstalk когда-либо изменяет имя своего конфигурационного файла Apache по умолчанию и что этот файл может быть перезаписан, когда вы меньше всего ожидаете: https://forums.aws.amazon.com/thread.jspa?threadID=163369

  • 1
    Отличный ответ, это сработало отлично. У меня еще не было каталога .ebextensions в моем проекте, поэтому я создал его и поместил ваш конфиг в произвольно названный файл .conf. Мне удалось сохранить обычный порт отключенным в настройках консоли эластичного бобового стебля, что кажется идеальным.
  • 0
    Отличный ответ, спасибо! После того, как я поиграл с перезаписью моего wsgi.conf и все еще имел проблемы, этот ответ сработал и кажется самым надежным.
Показать ещё 27 комментариев
14

EDIT: пока мне нравится этот ответ, сейчас очень старый. AWS придумал новые сервисы (например, Certificate Manager), которые делают часть этого ответа устаревшей. Кроме того, использование папки .ebextensions с Apache является более чистым способом обработки этого перенаправления, как описано выше.

Если вы размещаете свой сайт на S3, часть этого ответа может по-прежнему вам полезна.


Это сработало для меня:

  • Загрузите сертификат в AWS, используя консольную команду aws. Структура команды:

    aws iam upload-server-certificate --server-certificate-name CERTIFICATE_NAME --certificate-body "file://PATH_TO_CERTIFICATE.crt" --private-key "file://YOUR_PRIVATE_KEY.pem" --certificate-chain "file://YOUR_CERTIFICATE_CHAIN.ca-bundle" --path /cloudfront/
    
  • В приложении Elastic Beanstalk перейдите в Конфигурация Сетевой уровень Балансировка нагрузки и нажмите кнопку значок передачи.

  • Выберите Безопасный порт прослушивателя как 443. Выберите Протокол как HTTPS. Выберите CERTIFICATE_NAME от шаг 2 для идентификатора сертификата SSL. Сохраните конфигурацию.

  • Перейдите в консоль . Нажмите Экземпляры EC2. Нажмите Балансировщики нагрузки. Нажмите балансировку нагрузки. Нажмите Экземпляры и прокрутите вниз, чтобы просмотреть экземпляры EC2, назначенные этому балансировщику нагрузки. Если экземпляр EC2 имеет то же имя, что и ваш URL-адрес приложения (или что-то близкое), обратите внимание на DNS Name для балансировки нагрузки. Он должен быть в формате awseb-e-...

  • Вернитесь в консоль . Нажмите CloudFront. Нажмите Создать рассылку. Выберите дистрибутив Веб.

  • Настройте дистрибутив. Задайте свое Имя домена происхождения в DNS-имя балансира нагрузки, которое вы нашли в шаге 5 . Установите Протокол протокола просмотра на Перенаправить HTTP на HTTPS. Установите строки прямого запроса на Да. Установите Альтернативные имена доменов (CNAME) на URL-адреса, которые вы хотите использовать для своего приложения. Установите сертификат SSL на CERTIFICATE_NAME, который вы загрузили в шаг 2. Создайте свой дистрибутив.

  • Нажмите на имя своего дистрибутива в CloudFront. Нажмите Происхождение, выберите источник и нажмите Изменить. Убедитесь, что Протокольная политика происхождения < соответствует. Возвращаться. Нажмите Поведение, выберите источник и нажмите Изменить. Измените Переслать заголовки на белый список и добавьте Хост. Сохранить.

Примечание: Я также написал более длинное руководство.

  • 0
    Сделал именно это, но это дает мне «Запрос не может быть удовлетворен». «CloudFront не удалось подключиться к источнику», только когда я внесу белый список в заголовок хоста. Если я установил заголовки перенаправления на none, то это сработает, но не будет перенаправлено на https, все http-запросы останутся http. Какие-нибудь мысли?
  • 0
    @Adam Можете ли вы вставить сюда весь файлasticbeanstalk.conf? или дайте мне ссылку на это?
Показать ещё 3 комментария
6

Самое лучшее для меня не работает. <If> директива работает только с Apache 2.4+, но ElasticBeanstalk имеет версию 2.2.x.

Итак, следуя тому же совету, что и выше. Создайте файл с именем .ebextensions/https_rewrite.config со следующим содержимым

files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            LoadModule rewrite_module modules/mod_rewrite.so
            RewriteEngine On
            # This will enable the Rewrite capabilities
            RewriteCond %{HTTPS} !=on
            # This checks to make sure the connection is not already HTTPS
            RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L]

Кажется, это работает для меня.

О том, как создать этот файл в вашем файле WAR, см. в этом :

  • 1
    Дополнительное примечание об этом ответе: блок <if> был новым в 2.4 и не работает в 2.2, поэтому вы его здесь не видите.
  • 0
    EB PHP стеки решений теперь все используют Apache 2.4+
Показать ещё 1 комментарий
4

Изменить: Решение Zags более общее и правильное. Я рекомендую его по моему (что специфично для python env)

Здесь вы найдете чистое и быстрое решение, которое позволяет избежать взлома wsgi.conf или использования CloudFront

В вашем .ebextensions/some_file.config:

# Redirect HTTP to HTTPS
  "/etc/httpd/conf.d/https_redirect.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      <Directory /opt/python/current/app/>
      RewriteEngine on
      RewriteCond %{HTTP:X-Forwarded-Proto} ^http$
      RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
      </Directory>

Я чувствую, что это слишком легко, но, похоже, работает нормально.

Также обратите внимание, что я явно перенаправляю HTTP вместо "не HTTPS".

  • 0
    Таким образом, я получил эту работу в одной среде EBS. /etc/httpd/conf.d/https_redirect.conf существует и перенаправляет на https. Проблема во второй среде, настройка точно такая же, файл /etc/httpd/conf.d/https_redirect.conf НЕ существует. Есть идеи?
  • 0
    @NitzanWilnai /etc/httpd/conf.d/https_redirect.conf не должен существовать, см. Ответ
Показать ещё 1 комментарий
3

Я пытаюсь перенаправить эластичный beanstalk с loadbalancer в 2018 году. Ни один из вышеперечисленных ответов не работает в моей среде. Несколько проблем, которые я использовал:

  • Я пробовал самый проголосовавший ответ, но мой кот - версия 2.7. Он не поддерживает.

  • Я использовал команду container_commands и скопировал параметр 00_applications. AWS просто игнорирует его.

Итак, наконец, я начал работать, читая это: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html

Вот что я делаю:

Я воссоздал структуру папок:

.ebextensions 
 - httpd
  -conf.d
   -ssl.conf

И вот это содержимое ssl.conf

<VirtualHost *:80>
  RewriteEngine on
  RewriteCond %{HTTP:X-Forwarded-Proto} =http
  RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  <Proxy *>
    Order Allow,Deny
    Allow from all
  </Proxy>
  ProxyPass / http://localhost:8080/ retry=0
  ProxyPassReverse / http://localhost:8080/
  ProxyPreserveHost on

  ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>

Надеюсь, это поможет.

  • 0
    Это сработало и для меня в 2018 году!
  • 0
    Он перенаправляет на https, но говорит, что сервер не найден. Я использую веб-приложение Spring MVC
Показать ещё 1 комментарий
3

Ни один из вышеперечисленных ответов не работал у меня, но некоторые помогли мне разобраться в ответе, который сработал у меня Также я нашел приведенный ниже URL-адрес, который помог http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-platform.html

Я создал структуру файлов, упомянутую в вышеприведенном URL, чтобы изменить 2 файла httpd.conf 00_application.conf

скопируйте весь httpd.conf из вашего экземпляра и поместите его в свой код под .ebextention в структуре папок, упомянутой в приведенной выше ссылке. Затем просто добавьте строку ниже этого файла в свой проект

LoadModule rewrite_module modules/mod_rewrite.so

Сделайте то же самое для 00_application.conf, скопируйте его из своего экземпляра и поместите его в свою базу кода под .ebextention в httpd/conf.d/elasticbeanstalk/00_application.conf Теперь отредактируйте этот файл и добавьте ниже между VirtualHost

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Теперь разверните свой код Он должен работать.

  • 0
    Должен быть принятый ответ, спасибо!
3

Он работает для меня следующей командой:

RewriteCond %{HTTP:X-Forwarded-Port} !=443

и без проверки https:

RewriteCond %{HTTP:X-Forwarded-Proto} !https

Похоже, что ELB меняет значение X-Forwarded-Proto на http (даже по протоколу TCP).

  • 0
    Просто и работает для меня. Благодарю.
  • 0
    Это должен быть принятый ответ. Заголовки документированы, поэтому вы можете положиться на них. docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/...
2

На эластичном beanstalk вы можете просто добавить свою конфигурацию, чтобы AWS переписать их, это позволит вам перезаписать конфигурацию веб-сервера и отправить свою собственную конфигурацию.

Просто добавьте следующий файл в путь:.ebextensions\httpd\conf.d

Содержимое файла:

<VirtualHost *:80>
   LoadModule rewrite_module modules/mod_rewrite.so

   RewriteEngine On
   RewriteCond %{HTTP:X-Forwarded-Proto} !https
   RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
   RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

   <Proxy *>
     Order deny,allow
     Allow from all
   </Proxy>

   ProxyPass / http://localhost:8080/ retry=0
   ProxyPassReverse / http://localhost:8080/
   ProxyPreserveHost on

   ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>

".ebextensions" - это стандартная папка конфигурации в AWS, а остальные просто указывают на файл и папку, которые вы хотите перезаписать. Если файл или папка не существует, просто создайте их.

2

Мне было трудно понять это, поэтому после того, как я придумал решение, я написал подробное объяснение моего решения, надеюсь, поможет кто-нибудь другой. Это относится к приложениям Tomcat 8, Apache2 и Spring Boot. Есть действительно полезные примеры ebextension в лабораторных гидах AWS.

Резюме того, что сработало для меня:

  • Создайте файл в /src/main/webapp/.ebextensions/httpd/conf.d/elasticbeanstalk.conf
  • Добавить rewrite conds/rules с осторожностью, чтобы включить "LoadModule rewrite_module modules/mod_rewrite.so"
  • Развертывание в AWS EBS

Вот пример Spring загрузочного приложения.

1

Начиная с 2018-07-25, существует лучшая опция для перенаправления https непосредственно в балансировщике нагрузки, что устраняет необходимость возиться с файлами конфигурации.

https://aws.amazon.com/about-aws/whats-new/2018/07/elastic-load-balancing-announces-support-for-redirects-and-fixed-responses-for-application-load-balancer/

1

У меня есть следующие конфигурации для эластичного бобового стека (64-битный Amazon Linux 2016.09 v2.3.1 с Tomcat 8 Java 8). Я создал каталог .ebextensions и добавил файл YAML.config с условиями перезаписи

Загас решение, описанное выше (что очень сложно), не работает для меня.

  • Потому что условие "Если" неизвестно
  • Из-за Apache 2.2 у меня нет mod_rewrite.so, включенного в мой файл httpd.conf.

Это решение имеет для меня больше смысла, но и это не работает. Ничего не происходит, и я не вижу файл "ssl_rewrite.conf" в каталоге "conf.d".

Третьим решением было добавить файлы "run.config" и "ssl_rewrite.conf" в каталог ".ebextendsion".

run_config содержит

container_commands:
copy-config:
command: "cp .ebextensions/ssl_rewrite.conf /etc/httpd/conf.d"

ssl_rewrite.conf содержит

LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

ssl_rewrite.conf создается под "conf.d" directcotry, но перенаправление с http на https не работает.

Единственное работающее решение для меня заключалось в том, чтобы добавить следующие строки в "/etc/httpd/conf.d/elasticbeanstalk/00_application.conf"

<VirtualHost *:80>
......
RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
......
</VirtualHost>

но это временное решение, и если машина заменена, мое перенаправление https исчезнет.

  • 0
    «если машина заменена, мое перенаправление https пропало». Я думаю, вы могли бы использовать тот же прием, показанный в ответе Загса, для автоматической записи файла, когда ELB развертывает приложение в новом экземпляре. По сути, укажите путь к файлу в разделе files: содержимое файла в разделе content: | и установите соответствующий режим, владельца и группу. ELB создаст файл для вас автоматически.
  • 0
    Я использовал вышеупомянутый метод (в моем комментарии), чтобы развернуть этот файл как часть приложения (вместо записи его непосредственно в текущий экземпляр). Я проверил через SSH, что файл существует. Однако, это также не сработало для меня, несмотря на то, что мои настройки были очень близки к вашей: 64-битная Amazon Linux 2016.03 v2.1.1 под управлением Tomcat 8 Java 8 Хотя одна вещь, файл изначально не существовал вообще - он был создан новым , Должен ли я вместо этого редактировать /etc/httpd/conf.d/elasticbeanstalk.conf ?
0

Мне нужно было применять HTTPS только для нашей производственной среды, а не для разработки и промежуточной среды, которые также находятся на Elastic Beanstalk, но не используют балансировщик нагрузки (и поэтому не могут быть назначены сертификату напрямую).

Я использую переменную окружения USE_HTTPS. Мы ssl_rewrite.conf файл ssl_rewrite.conf тогда и только тогда, когда USE_HTTPS имеет значение true.

.ebextensions/файлы/ssl_rewrite.conf

RewriteEngine On
<If "-n '%{HTTP:X-Forwarded-Proto}' && %{HTTP:X-Forwarded-Proto} != 'https'">
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</If>

.ebextensions/https.config

files:
  "/home/ec2-user/https_setup.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/bin/bash

      echo "USE_HTTPS env var: ${USE_HTTPS,,}"
      outfile=/etc/httpd/conf.d/ssl_rewrite.conf
      if [ "${USE_HTTPS,,}" == "true" ]; then
        echo "Configure SSL rewrite"
        cp .ebextensions/files/ssl_rewrite.conf $outfile
        chmod 644 $outfile
        chown root:root $outfile
      else
        [ -f $outfile ] && rm $outfile
        echo "Do not use SSL"
        exit 0
      fi

container_commands:
  01_https_setup:
    command: "/home/ec2-user/https_setup.sh"

Обратите внимание, что если вы измените USE_HTTPS, вам необходимо USE_HTTPS приложение, чтобы изменения вступили в силу. Вы также можете удалить команды echo в файле https.config если хотите.

0

На всякий случай все еще борется:

Я боролся в течение некоторого времени и, наконец, я нашел GitHub (из команды AWS) со всеми конфигурациями AWS, а приведенный ниже пример работает для перенаправления HTTP> HTTPS для Apache 2.2. (Для конфигураций для Apache 2.4 и Nginx см. Ссылку ниже).

Apache 2.2

  1. Создайте файл в корневом каталоге вашего приложения: YOUR_PROJECT_ROOT/.ebextensions/httpd/conf.d/elasticbeanstalk.conf (В случае использования IntelliJ/Java убедитесь, что он добавлен в финальный артефакт WAR)

  2. Добавьте следующие строки, чтобы включить перенаправление в виртуальном хосте:

    <VirtualHost *:80>
        LoadModule rewrite_module modules/mod_rewrite.so
        RewriteEngine On
        RewriteCond %{HTTP:X-Forwarded-Proto} !https
        RewriteCond %{HTTP_USER_AGENT} !ELB-HealthChecker
        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
    
        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>
    
        ProxyPass / http://localhost:8080/ retry=0
        ProxyPassReverse / http://localhost:8080/
        ProxyPreserveHost on
    
        ErrorLog /var/log/httpd/elasticbeanstalk-error_log
    </VirtualHost>
    

Для получения дополнительных примеров для Apache 2.4 и Nginx посетите этот репозиторий GitHub:

https://github.com/awsdocs/elastic-beanstalk-samples/tree/master/configuration-files/aws-provided/security-configuration/https-redirect/java-tomcat

Кроме того, имеется много полезной конфигурации и доступных примеров.

С уважением

0

AWS не принимает unserscores (_) в headders, в то время как мы можем использовать (-), So Удалить подчеркивания из переменных заголовка, например: - header_var_val = "some value" заменить его headervarval = "some value". Меня устраивает.

0

Чтобы продлить еще два ответа на этот вопрос https://stackoverflow.com/questions/14693852/how-to-force-https-on-elastic-beanstalk, https://stackoverflow.com/questions/14693852/how-to-force-https-on-elastic-beanstalk. Для пользователей, загружающих spring, которые развертывают свои службы на AWS с помощью ELB, и вам необходимо пошаговое руководство, вы можете добавить файл conf.conf в src/main/webapp/.ebextensions/httpd/conf.d/in ваш проект.

<Предварительно > <код > ЦСИ --главный ----Ява ----Ресурсы ---- WebApps ------. ebextensions -------- HTTPD ---------- confd ------------ ****. Конф Код >

****. conf выглядит следующим образом. Заметил, что у меня есть сайт для тестирования с одним экземпляром, поэтому я добавляю условие, чтобы исключить его.

  < VirtualHost *: 80 >  Модули LoadModule rewrite_module/mod_rewrite.so
  RewriteEngine On  RewriteCond% {HTTP: X-Forwarded-Proto}! Https  RewriteCond% {HTTP_USER_AGENT}! ELB-HealthChecker  RewriteCond% {HTTP_HOST}! Testexample.com #excludes тестовый сайт  RewriteRule (. *) Https://% {HTTP_HOST}% {REQUEST_URI}
  < Прокси > >    Отказаться, разрешить    Разрешить от всех  </прокси >
  ProxyPass/http://localhost: 8080/retry = 0  ProxyPassReverse/http://localhost: 8080/  ProxyPreserveHost on
  ErrorLog/var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>
Код>

После этого не забудьте добавить "ресурс" в maven-war-plugin в свой pom.xml, чтобы получить вышеуказанную конфигурацию.

<Предварительно > <код > < плагин >    < идентификатор_группа > org.apache.maven.plugins </GroupID>    < артефакт > Maven-плагин войны </артефакт >    < & конфигурация GT;        <webResources>            & Л; ресурс >              <! - некоторый другой ресурс, настроенный вами самостоятельно →            </ресурс >            & Л; ресурс >               < & каталога GT; SRC/основная/WebApps/.ebextensions </каталог >                <TargetPath> .ebextensions </TargetPath>                & Л; фильтрация > истинно </фильтрации >            </ресурс >        </webResources>    </конфигурации >    < & версии GT; 2.1.1 </& версии GT;  </плагин > Код >

Наконец, скопируйте и подтолкните свой код, подождите код и код кода AWS, чтобы забрать свой код из своего репозитория и развернуть в beanstalk-среду или просто упаковать свой проект в военный файл и загрузить его в среду beanstalk AWS.

0

Мы решили это на нашем сервере, правильно обработав X-Forwarded-Proto.

Это наш конфигуратор Grails, но он поможет вам с идеей:

    grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
    grails.plugin.springsecurity.portMapper.httpPort = 80
    grails.plugin.springsecurity.portMapper.httpsPort = 443
    grails.plugin.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
    grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http'
    grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
    grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https'
    grails.plugin.springsecurity.secureChannel.definition = [
        [pattern: '/**', access: 'REQUIRES_SECURE_CHANNEL']
    ]
0

Обратите внимание, что самый проголосовавший ответ немного устарел. Ответ А Павла на самом деле правильный ответ. Ссылка, предоставленная в его ответе, - AWS (так что рекомендуемый способ переопределить вашу конфигурацию Apache, чтобы перенаправить с HTTP на HTTPS при запуске приложения на Elastic Beanstalk).

Есть одна очень важная вещь. Если вы развертываете более одного веб-приложения, добавление папки .ebextensions внутри одного из ваших веб-приложений не будет работать. Вы заметите, что Non из сконфигурированных конфигураций записывается или создается. Если вы развертываете несколько веб-приложений в среде эластичного beanstalk, вам необходимо прочитать эту статью AWS Java Tomcat Развертывание нескольких файлов WAR на Elastic Beanstalk

В общем, вам нужно будет создать следующую структуру, прежде чем вы выпустите команду eb для развертывания WAR файлов:

MyApplication.zip
├── .ebextensions
├── foo.war
├── bar.war
└── ROOT.war

Если внутри каждого файла WAR существует папка .ebextentions, вы заметите, что она полностью игнорируется, и никакие изменения конфигурации не будут выполнены.

Надеюсь, это поможет кому-то еще.

0

Почему бы вам просто не поместить файл .htaccess в корневую папку? Таким образом, вы можете просто протестировать и отладить его. И если вы включите его в .zip, он будет автоматически развернут во всех экземплярах снова.

Просто используйте .htaccess:

RewriteEngine on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
-4

это простое решение

  • ssh в ваш экземпляр EC2
  • скопируйте содержимое файла /etc/httpd/conf.d/wsgi.conf в локальный файл wsgi.conf, который будет помещен в базовую папку вашего приложения.
  • Отредактируйте локальную версию wsgi.conf и добавьте следующие правила переадресации в <VirtualHost> </Теги VirtualHost >

    RewriteEngine On
    RewriteCond %{HTTP:X-Forwarded-Proto} !https
    RewriteRule !/status https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301]
    
  • Измените "/статус" на любую страницу, которую вы используете, на странице проверка работоспособности.

  • Сохранить файл
  • Отредактируйте свой <app> .conf внутри вашего каталога ebextensions, чтобы добавить команду контейнера для копирования этой версии wsgi.conf поверх версии Amazons

    container_commands:
    01_syncdb:
      command: "django-admin.py syncdb --noinput" leader_only: true
    02_collectstatic:
      command: "django-admin.py collectstatic --noinput"
    03_wsgireplace:
      command: 'cp wsgi.conf ../wsgi.conf'
    ...
    
  • Разверните код.

  • В развернутой версии wsg.conf по адресу /etc/httd/conf.d/wsgi.conf теперь будут указаны необходимые правила перенаправления.

Он должен работать, и файл будет соответствующим образом обновлен для каждого развертывания. Единственное, на что нужно обратить внимание, это то, что Amazon изменит содержимое своего базового файла wsgi.conf в будущем, тогда ваша копия может перестать работать.

Autor rickchristianson

  • 2
    Точная копия его собственного ответа: stackoverflow.com/questions/6858492/… . прекратите публиковать дубликаты ответов!
  • 0
    проблема может быть решена с тем же ответом;) его спам ??
Показать ещё 2 комментария
-4

Если вы используете среду с балансировкой нагрузки, вы можете следовать инструкциям Конфигурирование HTTPS для среды AWS Elastic Beanstalk и в конце отключить HTTP порт.

Обратите внимание, что в настоящее время AWS Free Usage Tier содержит такое же количество часов для балансировки эластичной нагрузки (ELB), что и для EC2 Micro Instance.

  • 7
    Таким образом, вы включаете только HTTPS, но не применяете его. Принудительное выполнение означает, что вы автоматически перенаправляете все HTTP-запросы в HTTPS.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню