Quando configuramos um AWS Load Balancers vemos a opção de Listeners, onde podemos configurar qual a porta do LB que será redirecionada para a porta das instâncias que fazem parte deste.

alt Load Balancer Porém surge uma grande dúvida: Como podemos fazer o redirecionamento do acesso via HTTP para HTTPS? Lembrando que, o LB não tem esta opção de fazer o redirecionamento automático.

Portanto devemos delegar a tarefa para o serviço que responde por HTTP dentro da instância. Neste nosso caso usamos o NGinx, mas nos exemplos abaixo vamos deixar um modelo de configuração para Apache2 e IIS também.

Uma observação importante: Quando usamos o LB na frente de nossa aplicação o certificado SSL deverá ser adicionado na porta do referente ao HTTPS do próprio Load Balancers. Porém a instância deverá ter estas configurações referente a porta 443.

Pois o LB manda a requisição da porta 80 (HTTP) para o serviço na instância e lá dentro que ocorrer o redirecionamento para HTTPS.

  • NGinx: Observer que deixamos os valores de server_name como indefinidos.
server {
  listen 80;
  server_name "";
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  location / {
    if ($http_x_forwarded_proto != 'https') {
      rewrite ^ https://$host$request_uri? permanent;
    }
  }
}
  • Apache2
<VirtualHost *:80>
  ...
  RewriteEngine On
  RewriteCond %{HTTP:X-Forwarded-Proto} !https
  RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI}
  ...
</VirtualHost>
  • IIS Install IIS Url-Rewrite module, using the configuration GUI add these settings
<rewrite xdt:Transform="Insert">
  <rules>
    <rule name="HTTPS rewrite behind ELB rule" stopProcessing="true">
      <match url="^(.*)$" ignoreCase="false" />
      <conditions>
        <add input="{HTTP_X_FORWARDED_PROTO}" pattern="^http$" ignoreCase="false" />
      </conditions>
      <action type="Redirect" redirectType="Found" url="https://{SERVER_NAME}{URL}" />
    </rule>
  </rules>
</rewrite>