Reindirizza tutte le richieste http dietro Amazon ELB a https senza usare if


27

Attualmente ho un ELB che serve sia http://www.example.org che https://www.example.org .

Vorrei impostarlo in modo che qualsiasi richiesta che punti a http://www.example.org sia reindirizzata a https://www.example.org .

L'ELB invia le richieste https come richieste http, quindi utilizzando:

server {
      listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
}

non funzionerà perché le richieste fatte a https://www.example.org verranno comunque inviate alla porta 80 su nginx.

So che è possibile riscriverlo come

server {
      listen         80;
      server_name    www.example.org;
      if ($http_x_forwarded_proto != "https") {
          rewrite ^(.*)$ https://$server_name$1 permanent;
      }
}

Ma tutto ciò che ho letto ha detto che ifdovrebbe essere evitato a tutti i costi nella configurazione di nginx, e questo sarebbe per ogni singola richiesta. Inoltre, significa che devo impostare una speciale configurazione separata per il controllo dello stato ( come descritto qui : "... quando sei dietro un ELB, dove ELB agisce come endpoint HTTPS e invia solo traffico HTTP al tuo server, tu interrompere la capacità di rispondere con una risposta HTTP 200 OK per il controllo dello stato necessario all'ELB ").

Sto considerando di inserire il login nel codice dell'applicazione Web anziché nella configurazione di nginx (e ai fini di questa domanda supponiamo che sia un'applicazione basata su Django), ma non sono sicuro che sarebbe più sovraccarico di la if configurazione.


Ciao, per favore, puoi dirmi dove metti questi codici?
YuAn Shaolin Maculelê Lai,

@ YuAnShaolinMaculelêLai Certo. Questi sono file di configurazione per nginx, quindi ho appena inserito il codice in un file in /etc/nginx/conf.d/. Solitamente, chiamo il nome domainname.conf dove "domainname" è il dominio del sito Web in questione. Puoi nominare il file come vuoi purché si concluda con .conf.
Jordan Reiter,

Grazie mille. Ho provato a creare un nuovo file seguendo .conf. Ma non ha funzionato per me. Quindi ho inserito il codice nel file generato da AWS in /etc/nginx/conf.d/. Ora funziona.
YuAn Shaolin Maculelê Lai,

Risposte:


9

Se funziona correttamente in questo modo, non aver paura. http://wiki.nginx.org/IfIsEvil

È importante notare che il comportamento di if non è incoerente, date due richieste identiche non fallirà casualmente su uno e funzionerà sull'altro, con test e comprensione adeguati se è possibile utilizzare . Tuttavia, i consigli per l'uso di altre direttive ove disponibili sono ancora molto validi.


Questa pagina dice anche che "se ha problemi se usato nel contesto della posizione". Mi sembra che puoi fare quello che devi fare al di fuori location {}, server {}invece. (Ma per favore fatemi sapere se questo non è corretto!)
Excalibur

15
  1. Imposta il tuo ELB di mappatura AWS ELB: 80 sull'istanza: 80 e ELB: 443 sull'istanza: 1443.
  2. Associa nginx per l'ascolto sulle porte 80 e 1443.
  3. Inoltra richieste che arrivano alla porta 80 alla porta 443.
  4. Il controllo dello stato deve essere HTTP: 1443. Rifiuta HTTP: 80 perché reindirizza 301.

configurazione di aws elb

Installazione di NGINX

    server {
       listen         80;
       server_name    www.example.org;
       rewrite        ^ https://$server_name$request_uri? permanent;
    }

    server {
       listen         1443;
       server_name    www.example.org;
   } 

per quanto riguarda le impostazioni del controllo dello stato? potresti per favore approfondire anche questo.
samkhan13,

questo non ha funzionato con il controllo helth impostato su http: 80, il controllo dello stato ha esito negativo.
samkhan13,

2
Lo stato di salute dovrebbe essere HTTP:1443. Rifiuta il HTTP:80perché il reindirizzamento 301.
cbron,

questo ha funzionato principalmente per me, ma la riga di riscrittura non ha funzionato con il mio dominio jolly. Questo altro post ha risolto quella parte: serverfault.com/questions/447258/…
Ron

9

Questa soluzione utilizza la logica condizionale, ma come suggerisce la risposta accettata, penso anche che sia ok. Rif: /programming/4833238/nginx-conf-redirect-multiple-conditions

Inoltre, ciò non richiede l'apertura di ulteriori porte nelle impostazioni di sicurezza di aws per l'immagine. Puoi terminare ssl in AWS LB e instradare il traffico https alla porta http 80 della tua istanza.

In questo esempio, il controllo dello stato di LB ha colpito / integrità sulla porta 80 che instrada al server dell'app, quindi il controllo dello stato convalida sia nginx che l'app sta respirando.

server {
  listen 80 default deferred;

  set $redirect_to_https 0;
  if ($http_x_forwarded_proto != 'https') {
    set $redirect_to_https 1;
  }
  if ($request_uri = '/health') {
    set $redirect_to_https 0;
  }
  if ($redirect_to_https = 1) {
    rewrite ^ https://www.example.com$request_uri? permanent;
  }
  ...
}

1
ci deve essere un modo più elegante per farlo
Edward,

0

Ora puoi creare un nuovo listener nelle impostazioni di AWS Load Balancer che reindirizza la porta HTTP 80 alla porta 443 HTTPS. Quindi non è più necessario toccare la configurazione nginx / apache.


sfortunatamente, non è ancora supportato in Cloudformation
Aryeh Leib Taurog
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.