http'yi yük dengeleyicinin arkasında ngnix ile https'ye yeniden yaz


13

Yönetici panelinin içindeki SSL anahtarımı / pem'i kurmamı sağlayan bir Rackspace yük dengeleyici kullanıyorum. Her şey iyi çalışıyor, hem http hem de https protokollerini kullanabilirim. Ama http kullanarak https yönlendirmek için çalışırsanız:

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

... bir yönlendirme döngüsü alıyorum. 443 numaralı bağlantı noktasını dinlemediğimin farkındayım ama bunun nedeni yük dengeleyicinin benim için hallettiğiydi. Ben de if ($scheme ~* http){boşuna yeniden yazma sarmayı denedim .

Sorumun diğer kısmı www'yi url'den kaldırmak istiyorum, bunu tek bir yeniden yazma ile yapabilir miyim? Yukarıdaki yeniden yazım da bununla ilgilenmemeli midir?

Yardımın için teşekkürler!


Yük dengeleyici, bağlantının HTTPS olup olmadığı konusunda size bir gösterge gönderiyor olmalıdır. Rackspace'e sorun. (Oh, ve muhtemelen www'den kurtulmak istemiyorsun ...)
Michael Hampton

İlginç, ben buna bakacağım. Sence neden www'den kurtulmamalıyım?
jwerre

Yanıtlar:


14

sciurus, Rackspace'in Bulut Yük Dengeleyicilerinin, yük dengeleyicisine SSL yüklendiğinde X-Forwarded-Proto'u https olarak ayarlamasında doğrudur. Nginx'te bir yönlendirme döngüsünü önlemek için location, vhost yapılandırmasındaki bölüme aşağıdakileri ekleyebilmeniz gerekir :

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

Bu, https olmayan istekleri https'ye yönlendirirken sonsuz yönlendirme döngüsünü önlemelidir.


18

Nginx'in yerleşik sunucu değişkenlerini kullanarak $request_urive $server_namebunu normal ifadeler kullanmadan yapabilirsiniz. Sunucunuzun locationbloğuna aşağıdakileri ekleyin; işiniz bitti:

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

Bu, yük dengeleyicinizin $http_x_forwarded_protobaşlığı ve isteği arka uç örneklerinize gönderdiğini varsayar . Diğer yaygın başlıklar arasında $http_x_forwarded_schemeve sadece bulunur $scheme.

Daha fazla bilgi nginx Tuzaklar ve Yaygın Hatalar belgelerinde bulunabilir: https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#taxing-rewrites


5
Kesinlikle yeniden yazma üzerinde dönüş kullanmalısınız. Upvoted.
designermonkey

1
Bunun $hostyerine kullanabilirsiniz$server_name
Yossi

sunucu_adı _ ile çalışmaz; yani @Yossi'nin önerdiği gibi $ host değişkeni kullanılmalıdır.
Razvan Grigore

1

Yük dengeleyici her zaman sizinle http üzerinden konuşur. Neler oluyor

  1. Tarayıcı, yük dengeleyicide 80 numaralı bağlantı noktasına bir istekte bulunur
  2. Yük dengeleyici, web sunucunuzda 80 numaralı bağlantı noktasına bir istekte bulunur
  3. Web sunucunuz kullanıcıya bir yönlendirme gönderir
  4. Kullanıcı yük dengeleyicisinde 443 numaralı bağlantı noktasına bir istekte bulunur

2-4. Adımlar, tarayıcı yeniden yönlendirme döngüsünü algılayıp vazgeçene kadar tekrarlamaya devam eder.

DÜZENLEME: Bunu çözmek için, yalnızca X-Forwarded-Proto üstbilgisi http olarak ayarlandığında yeniden yazma işlemi gerçekleştirin. Bu başlık Rackspace'in yük dengeleyicisinin web sunucunuza isteği aldığı protokolü nasıl söylediğini gösterir.


Sanırım neden $ server_protocol her zaman HTTP döndürür açıklar
jwerre

Peki bunun neden olduğunu cevapladınız ... nasıl düzeltileceğine dair herhangi bir öneriniz var mı?
jwerre
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.