riscrivi http in https con ngnix dietro il bilanciamento del carico


13

Sto usando un bilanciamento del carico Rackspace che mi consente di impostare la mia chiave ssl / pem all'interno del pannello di amministrazione. Tutto funziona bene, posso usare sia i protocolli http che https. Ma se provo a reindirizzare http su https usando:

server{
  listen *:80;
  server_name mydomain.com www.mydomain.com; 
  rewrite ^ https://mydomain.com$request_uri? permanent;

... Ottengo un ciclo di reindirizzamento. Mi rendo conto che non sto ascoltando la porta 443, ma è perché il bilanciamento del carico ha gestito questo per me. Ho anche provato a racchiudere la riscrittura if ($scheme ~* http){senza risultati.

L'altra parte della mia domanda è che vorrei rimuovere www dall'URL, posso farlo con una sola riscrittura? La riscrittura di cui sopra non dovrebbe occuparsi anche di questo?

Grazie per l'aiuto!


Il bilanciamento del carico dovrebbe inviarti alcune indicazioni se la connessione era HTTPS. Chiedi a Rackspace. (Oh, e probabilmente non vorrai liberarti di www ...)
Michael Hampton,

Interessante, lo esaminerò. Perché pensi che non dovrei sbarazzarmi di www?
jwerre,

Risposte:


14

sciurus ha ragione nel fatto che i bilanciatori di carico cloud di Rackspace impostano X-Forwarded-Proto su https quando SSL viene scaricato sul bilanciamento del carico. Per evitare un ciclo di reindirizzamento in nginx, dovresti essere in grado di aggiungere quanto segue alla locationsezione nella configurazione del vhost:

if ($http_x_forwarded_proto = "http") {
            rewrite  ^/(.*)$  https://mydomain.com/$1 permanent;
}

Ciò dovrebbe evitare il ciclo di reindirizzamento infinito mentre reindirizza le richieste non https a https.


18

Usando le variabili del server integrate di nginx $request_urie $server_namepuoi farlo senza usare espressioni regolari. Aggiungi quanto segue al locationblocco del tuo server e il gioco è fatto:

if ($http_x_forwarded_proto = "http") {
    return 301 https://$server_name$request_uri;
}

Ciò presuppone che il bilanciamento del carico stia inviando l' $http_x_forwarded_protointestazione insieme alla richiesta alle istanze di back-end. Altre intestazioni comuni includono $http_x_forwarded_schemee anche solo $scheme.

Ulteriori informazioni sono disponibili nella documentazione di nginx Pitfalls e Common Mistakes : https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites


5
Dovrebbe assolutamente usare return over rewrite. Upvoted.
designermonkey,

1
È possibile utilizzare $hostinvece di$server_name
Yossi

non funziona con nome_server _; quindi si dovrebbe usare la variabile $ host come suggerito da @Yossi.
Razvan Grigore,

1

Il bilanciamento del carico ti parla sempre tramite http. Quello che sta succedendo è

  1. Il browser invia una richiesta alla porta 80 sul bilanciamento del carico
  2. Il bilanciamento del carico invia una richiesta alla porta 80 sul server Web
  3. Il tuo server web invia un reindirizzamento all'utente
  4. L'utente effettua una richiesta alla porta 443 sul bilanciamento del carico

I passaggi 2-4 continuano a ripetere fino a quando il browser non rileva il ciclo di reindirizzamento e si arrende.

EDIT: per risolvere questo problema, eseguire la riscrittura solo quando l'intestazione X-Forwarded-Proto è impostata su http. Quell'intestazione è il modo in cui il bilanciamento del carico di Rackspace comunica al server Web il protocollo tramite il quale ha ricevuto la richiesta.


Immagino che ciò spiegherebbe perché $ server_protocol restituisce sempre HTTP
jwerre il

Quindi hai risposto perché questo sta accadendo ... qualche suggerimento su come risolvere?
jwerre,
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.