Bagaimana agar nginx meneruskan header HTTP_X_FORWARDED_PROTO?


18

Saya mengubah pengaturan saya dari

nginx > apache/php

untuk

haproxy > nginx > apache/php

(menggunakan haproxy 1.5-dev18 dengan dukungan ssl yang dikompilasi dalam)

Baik nginx dan haproxy disiapkan dengan benar untuk mengatur header HTTP_X_FORWARDED_PROTO. Namun, ketika nginx mendapatkan traffic ssl dari haproxy, ia melihat koneksi sebagai http dan menetapkan header seperti itu.

Bagaimana saya bisa mengatur nginx untuk meneruskan header HTTP_X_FORWARDED_PROTO jika ada, tetapi jika tidak melanjutkan pengaturannya berdasarkan koneksi?

Jawaban:


36

Saya menemukan cara untuk mengatasi ini. Masalahnya adalah bahwa nginx menimpa header yang diset oleh haproxy pada baris konfigurasi saya ini:

proxy_set_header X-Forwarded-Proto $scheme;

Saya memperbaikinya dengan menambahkan ini:

map $http_x_forwarded_proto $thescheme {
     default $scheme;
     https https;
 }   

dan mengubah baris proxy_set_header untuk menggunakan skema baru:

proxy_set_header X-Forwarded-Proto $thescheme;

Kecuali jika saya melewatkan sesuatu, proxy_set_headerbaris sebelum dan sesudah Anda sama.
Wilfred Hughes

1
$schemevs $thescheme.
Arlen Beiler

Bukankah ini dalam beberapa kasus langka tidak aman? Jika browser web mengirim permintaan HTTP ke haproxy, dan haproxy kemudian mengirimkan permintaan HTTPS ke Nginx - maka default $schemekasusnya akan terjadi, pengaturan $theschemeke HTTPS meskipun sebenarnya permintaan (ke haproxy) tidak aman HTTP. - Untuk menghindari itu, bagaimana dengan default $http_x_forwarded_proto; '' $scheme;:, jadi jika haproxy mengatakan HTTP itu akan dihormati.
KajMagnus

Itu disarankan di sini: stackoverflow.com/a/21911864/694469 (yaitu default $http_x_forwarded_proto;).
KajMagnus

2

Saya memiliki kebutuhan yang sama dengan AWS ELB

Inilah garis pemecahan masalah saya:

proxy_set_header        X-Forwarded-Proto $http_x_forwarded_proto;

Haruskah saya bertaruh menetapkan $http_x_forwarded_protosuatu tempat? Apa itu?
Jonathan

developer.mozilla.org/en-US/docs/Web/HTTP/Headers/... $ http_x_forwarded_proto adalah implementasi
NGINX

2
Jawaban Anda baru saja memecahkan masalah yang telah saya hancurkan selama 3 hari! Setiap pos lainnya tentang masalah penyeimbang muatan aws dengan pendukung https proxy_set_header X-Forwarded-Proto $scheme;, yang tidak berfungsi
MikeMarsian

1

Saya tidak bisa hanya berkomentar jadi saya memposting ini sebagai jawaban: Bisakah Anda memberi kami sebagian atau seluruh konfigurasi nginx Anda sehingga kami dapat melihat apa yang salah dengannya? Mungkin juga konfigurasi HAProxy Anda?

Masalah pertama yang bisa saya pikirkan adalah bahwa HAProxy Anda melakukan terminasi ssl. Singkatnya, untuk melepaskan server backend Anda, penyeimbang beban dapat dikonfigurasi untuk melakukan semua hal ssl, dan kemudian berkomunikasi dengan server backend Anda dalam HTTP. Suka skema di sini: http://blog.exceliance.fr/2012/09/10/how-to-get-ssl-with-haproxy-getting-rid-of-stunnel-stud-nginx-or-pound/

Untuk memberikan jawaban yang baik untuk pertanyaan Anda, dapatkah Anda memeriksa bahwa Anda tidak memiliki masalah loopback di http <> https config? Mungkin saat itu Anda dapat mengarahkan http ke http, https ke https, dan kemudian memaksa http untuk diarahkan ke https.

Bisakah Anda memeriksa bahwa Anda telah mengaktifkan ssl passthrough di konfigurasi HAProxy Anda?


Apakah Anda menyelesaikan masalah Anda?
Yannovitch

1
Saya menemukan jawabannya. Jawaban Anda tidak membantu secara langsung, tetapi tautan kedua itu membantu saya menemukan cara untuk menyelesaikannya. Terima kasih.
Echo mengatakan Reinstate Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.