Nginx: Bir yolda SSL zorla, diğerlerinde SSL olmayan


27

Nginx conf dosyasını, sitemdeki yollardan yalnızca birinde ve SSL'yi geri kalanında SSL olmayan olarak zorlamak için nasıl ayarlarım?

Örneğin, / user altındaki tüm URL'lerin https olmasını, tüm URL'lerin ise http olmasını istiyorum.

İlk bölüm için elimde:

rewrite ^/user(.*) https://$http_host$request_uri?;

"İf" kullanmak istemiyorum. İşlem sırasından faydalanacağını tahmin ediyorum, ancak bir döngüye dahil olmak istemiyorum.

Yanıtlar:


38

Nginx konfigürasyonunuzda iki "server" alanınız olmalı Biri 80 numaralı bağlantı noktası için, diğeri ise 443 numaralı bağlantı noktası için (SSL ve SSL olmayan). SSL sayfanıza yönlendirmek için SSL olmayan web sitenize bir konum ekleyin.

server {
    root /var/www/
    location / {
    }
    location /user {
        rewrite ^ https://$host$request_uri? permanent;
    }
}

/ user'da biten tüm trafiği https: // sunucunuza iletecektir.

Sonra 443 sunucunuzda, tam tersini yapın.

server {
    listen 443;
    root /var/www/
    location / {
        rewrite ^ http://$host$request_uri? permanent;
    }
    location /user {
    }
}

2
Bu yaklaşım iyidir, ancak birkaç ortak tuzağa , özellikle de "Konum bloğunun içindeki kök" ve "Vergilendirme yeniden yazar"
dır

1
Düzenledim. İyi görünüyor mu? Ayrıca 80 dinle dinledim ve http_host ekledi.
pbreitenbach

Bu yapılandırmada, kullanıcı sitedeki sayfalarda gezinirken bağlantı / ssl / ssl'den / ssl'ye / ssl'den / ssl'ye / ssl / ssl /userve diğer tüm url'ler için ssl değildir. Sonuç olarak, kullanıcı bile açıkça https://www.example.com/tarayıcının adres çubuğuna yazdığında, sonuçta ortaya çıkan sayfadır http://www.example.com/. Otomatik cevap yazmayı bu cevapta açıklanan ayarlarla elde edilen ssl / ssl olmayan arasına uygulamak için bir yöntem var mı? Teşekkürler!
goodbyeera

@goodbyeera evet. Eğer fikir, kullanıcıları belirli alanlarda SSL kullanmaya zorlamaksa, protokollerini geçersiz kılabiliriz, ancak yeniden yazma komutlarını 443 sunucu yapılandırmasından kaldırarak onları başka yerlerden onurlandırabiliriz. Tabii ki, şimdi güvenli bir yere gittiklerinde, başka bir yere gittiklerinde hala SSL ile dolaşıyor olacaklar, ancak insanların en başından itibaren SSL kullanmayı seçmelerine izin veriyor.
Chuck

13

Nginx, aynı serverblok içinde hem HTTP hem de HTTPS işlemesine izin verir . Böylece her ikisi için de direktifleri çoğaltmanız gerekmez ve güvence altına almak istediğiniz yolu yönlendirebilirsiniz

server {
  listen 80 default_server;
  listen 443 ssl;
  ... ssl certificate and other configs ...

  location /user {
    if ($scheme = 'http') {
      rewrite ^ https://$http_host$request_uri? permanent;
    }
  }

  ... your basic configuration ...
}

Be emin değil koymak ssl onsade HTTP kırarım çünkü orada çizgiyi.

İsteğe bağlı olarak, HTTPS'den diğer tüm istekleri de aynı şekilde HTTP'ye yönlendirebilirsiniz:

if ($scheme = 'https') {
  rewrite ^ http://$http_host$request_uri? permanent;
}

GÜNCELLEME : Alexey Ten'in nazikçe yorumlar bölümünde işaret ettiği gibi, schemeher isteği kontrol etmek çok parlak bir fikir değil. Nginx'inizi yapılandırmanın bildirimsel yolunu izlemelisiniz. Bu durumda, yönlendirmeleri olan iki sunucu bloğunu ilan edin location, ortak mantığı ayrı bir dosyaya ve includeher ikisine de taşıyın . Yani GruffTech'in cevabı daha iyi.


2
Her istek için nginx kontrol şeması yapmak etkisizdir.
Alexey Ten

1
Sorunun 3 yıl önce yanıtlandığını biliyorum, ancak bunu yavaş yavaş yaptığım şeyi yapmaya zorlarken buldum ve sonuçlarımı adımımı izleyecek insanlarla paylaşmak istedim.
Hnatt


1
@AlexeyTen, "eğer bir if kullanmaktan kaçınamıyorsanız" durum böyle değil mi? Direktifleri çoğaltmadan, HTTP ve HTTPS için aynı yapılandırmaya sahip olmanın başka bir yolu var mı?
Hnatt

2
includeOrtak direktifler için direktif kullanın . Bazı çoğaltmalar tamam.
Alexey Ten
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.