Ters proxy olarak kullanıldığında, nginx'in trafiği https'den http'ye yönlendirmesini önleyin


16

İşte benim kısaltılmış nginx vhost conf:

upstream gunicorn {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
    listen 80;
    listen 443 ssl;
    server_name domain.com ~^.+\.domain\.com$;

    location / {
        try_files $uri @proxy;
    }

    location @proxy {
        proxy_pass_header Server;
        proxy_redirect off;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 120;
        proxy_pass http://gunicorn;
    }
}

Aynı sunucunun hem HTTP hem de HTTPS'yi sunması gerekir, ancak yukarı akış bir yönlendirme yayınladığında (örneğin, bir form işlendikten sonra), tüm HTTPS istekleri HTTP'ye yeniden yönlendirilir. Bu sorunu düzelten bulduğum tek şey proxy_redirect, aşağıdaki şekilde değişiyor :

proxy_redirect http:// https://;

Bu, HTTPS'den gelen istekler için harika çalışır, ancak HTTP üzerinden bir yönlendirme yayınlanırsa, bunu HTTPS'ye de yönlendirir.

Çaresizlik içinde denedim:

if ($scheme = 'https') {
    proxy_redirect http:// https://;
}

Ama nginx proxy_redirectburada izin verilmiyor şikayet ediyor .

Aklıma gelen tek diğer seçenek, iki sunucuyu ayrı ayrı tanımlamak ve proxy_redirectsadece SSL'de ayarlamaktır , ancak daha sonra conf'in geri kalanını çoğaltırım ( serverbasitlik uğruna atladığım çok şey var ). includeFazlalığı hesaba katmak için bir direktif de kullanabileceğimi biliyorum , ama gerçekten herhangi bir bağımlılık olmadan sadece bir conf dosyasını tutmak istiyorum.

Öncelikle, sorunu tamamen ortadan kaldıracak bir şey eksik mi? Ya da, ikinci değilse, sunucu yapılandırmasının HTTP ve HTTPS sürümlerini ayırabilmem için gereksiz yapılandırma bilgilerini hesaba katmanın başka bir yolu (harici bir dosya eklemenin yanı sıra) var mı?

Yanıtlar:


29

Biraz ilham aldım ve denedim:

proxy_redirect http:// $scheme://;

Hangi hile yapmak gibi görünüyor. Yine de bu bana acımasız görünüyor, bu yüzden aynı sonucu elde etmek için yanlış veya daha az acayip yollar yaptığım herhangi bir şey hakkında herhangi bir rehberliğe hoş geldiniz.


Gerçekten de, bunu yapmak için "resmi" bir yol olarak görünmektedir ... bkz wiki.nginx.org/SSL-Offloader
Hendy Irawan

Yukarıdaki nginx wiki bağlantısı artık çalışmıyor, yeni konum nginx.com/resources/wiki/start/topics/examples/SSL-Offloader
Paul Tobias

Konumunuzda bir eğik çizgi yoksa bu işe yaramaz
hdave

? lanet lanet tanrı, neden yazılım sadece bir ters vekil (veya en az lanet saygı X-Forwarded-Tasarısı ya da her türlü blet + arkasında yaşamayı bekleyemeyiz gelmez
Axel Latvala

5

Diğer çözüm, yukarı akışa isteğin HTTP veya HTTPS olup olmadığını belirtmek ve buna göre yönlendirmeyi yayınlatmaktır. Bunu nginx konfigürasyonuna eklemek, yukarı akımın incelemesi için bir başlık ayarlayacaktır.

proxy_set_header    X-Scheme $scheme;

Ah, şimdi bu konfigürasyona sahip olduğunuzu görüyorum.
mgorven

Evet. Ama yine de yardım etme girişimini takdir ediyorum.
Chris Pratt

4
Bu biraz aldatıcı bir başlık gibi görünüyor. Bence X-Forwarded-Proto daha iyi
vladkras
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.