2014-10-06 20 views
21

Cloudflare proxy'sinin arkasındaki bir web sitesine ev sahipliği yapıyorum. Bu, Cloudflare HTTP (port 80) ve HTTPS (443 numaralı bağlantı noktası) trafiğini işlese de, sunucumdaki tüm isteklerin 80 numaralı bağlantı noktasının üzerinde olduğu anlamına gelir.Bir başlığın değerine göre nginx yönlendirmesi nasıl yapılır?

İkisi arasında ayrım yapmak için, Cloudflare, kullanıcının bağlantısına göre "http" veya "https" olarak ayarlanmış bir X-Forwarded-Proto başlığı içerir.

Her isteği, sitemin SSL sürümüne bir X-Forwarded-Proto: http başlığıyla yeniden yönlendirmek istiyorum. Bunu nginx yapılandırmasıyla nasıl başarabilirim?

+0

Sadece hızlı CloudFlare, sitenizin içeriğini barındırmıyor. Not: PageRules burada da çalışmış olabilir, çünkü sadece http: // 'ye https: // iletmeye çalışıyormuşsunuz gibi görünüyor. PageRules hakkında bilgi: https://support.cloudflare.com/hc/en-us/articles/200168306-Is-there-a-tutorial-for-Page-Rules- – damoncloudflare

cevap

30

Bunu yapmanın en kolay yolu, if yönergesidir. Daha iyi bir yol varsa, lütfen if yönergesinin verimsiz olduğunu söyleyin. Nginx, üstbilgileri alt başlıklarda alt çizgilere dönüştürür; bu nedenle X-Forwarded-Proto, $http_x_forwarded_proto olur.

server { 
    listen 80; 
    server_name example.com; # Replace this with your own hostname 
    if ($http_x_forwarded_proto = "http") { 
     return 301 https://example.com$request_uri; 
    } 

    # Rest of configuration goes here... 
} 
+2

İnsanlarla konuştuğunuzdan emin değilsiniz, ancak verimsiz. Yeniden yazımlar alanı dışında amaçlarla istismar edildiğinde yanıltıcıdır. Kötü olanları anlamak için kötü yazı olup olmadığını okuyun. Çözümünüz onun için tasarlandığı şey, bu yüzden iyi çalışması gerekiyor. – Melvyn

+8

Sadece küçük bir not: Birden çok sunucu_adı değeriniz varsa, dönüş dizgisini daha genel sürümle değiştirmek daha iyidir: dönüş 301 https: // $ host $ request_uri; – Alekc

0

deneyin kullanarak harita yönergesi: Böyle http://nginx.org/en/docs/http/ngx_http_map_module.html#map

şey ...

map $http_x_forwarded_proto  $php_backend { 
    "https"   "https_php_backend named loc"; 
    default  "default_php_backend named loc"; 
} 
server{ 
    location/{ 
     proxy_pass http://$php_backend; 
    } 
} 

Bu kod soyut olmakla birlikte, tht yolu deneyebilirsiniz ...

İlgili konular