HAProxy http को https (ssl) पर पुनर्निर्देशित करना


99

मैं लोड संतुलन के लिए HAProxy का उपयोग कर रहा हूं और केवल मेरी साइट को https का समर्थन करना चाहता हूं। इस प्रकार, मैं पोर्ट 80 पर सभी अनुरोधों को पुन: निर्देशित करने के लिए 443 पोर्ट करना चाहूंगा।

यह मैं कैसे करूंगा?

संपादित करें: हम https पर उसी url को पुनर्निर्देशित करना चाहते हैं, जिससे क्वेरी परम को संरक्षित किया जा सके। इस प्रकार, http://foo.com/bar https://foo.com/bar पर पुनर्निर्देशित होगा

जवाबों:


137

मुझे यह सबसे बड़ी मदद लगी :

HAProxy 1.5 या नए का उपयोग करें, और फ्रंटएंड कॉन्फिगर में निम्नलिखित पंक्ति जोड़ें:

redirect scheme https code 301 if !{ ssl_fc }

20
इसे जोड़ने के लिए, नीचे दिए गए User2966600 के उत्तर से 301 के साथ, जोड़ा गया, इसका उपयोग केवल एक विशिष्ट डोमेन के लिए https पर पुनर्निर्देशित करने के लिए करें:redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Quentin Skousen

1
वह काम किया। हालांकि यह 'कोड 301' के बिना काम नहीं करता है। अपडेट के लिए धन्यवाद।
डेज

7
दिए गए जवाब देने के लिए एक बराबर वाक्य रचना इस तरह होगा: http-request redirect scheme https code 301 if !{ ssl_fc }ALOHA HAProxy 7.0 में http पुनर्निर्देशन के लिए दस्तावेज यह भी उल्लेख करते हैं कि " दोनों निर्देशों का वाक्यविन्यास एक ही है, कहा गया है कि पुनर्निर्देशन को अब विरासत माना जाता है और कॉन्फ़िगरेशन को http-request redirect रूप में जाना चाहिए "। मैं पूरी तरह से आश्वस्त हुए बिना, अनुमान लगाता हूं कि HAProxy के ओपन सोर्स संस्करण की नई रिलीज़ पर भी यही व्याख्या लागू होती है।
रॉडोफोजेक

आपके जवाब के लिए धन्यवाद। क्या आप यह समझाने के लिए विस्तार कर सकते हैं कि हमें इस पंक्ति को कहाँ जोड़ना चाहिए? फ्रंटएंड / बैकएंड / डिफॉल्ट / ग्लोबल / में ..?
realtebo

मैं आमतौर पर इसे फ्रंटएंड के अंदर रखता हूं, लेकिन रीडायरेक्ट सिर्फ एक हेडर है, इसलिए मुझे उम्मीद है कि रिडायरेक्टर को तब तक ट्रिगर किया जा सकता है जब तक कि प्रतिक्रिया हेडर नहीं भेजे जाते। मैं जानना चाहता हूं कि क्या यह दोनों स्थानों में काम कर सकता है, इसे कोशिश करना पड़ सकता है।
जे टेलर

68

मेरे पास पिछले उत्तर पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं जे टेलर के जवाब को पूरक करने के लिए एक नया उत्तर पोस्ट कर रहा हूं। मूल रूप से उसका जवाब पुनर्निर्देशित होगा, एक अंतर्निहित रीडायरेक्ट, हालांकि, यह 302 (अस्थायी पुनर्निर्देशन) जारी करेगा, लेकिन चूंकि यह सवाल बताता है कि पूरी वेबसाइट को https के रूप में परोसा जाएगा, तो उपयुक्त रीडायरेक्ट 301 (स्थायी रीडायरेक्ट) होना चाहिए )।

redirect scheme https code 301 if !{ ssl_fc }

यह एक छोटा सा बदलाव लगता है, लेकिन यह प्रभाव वेबसाइट के आधार पर बहुत बड़ा हो सकता है, एक स्थायी रीडायरेक्ट के साथ हम ब्राउज़र को सूचित कर रहे हैं कि इसे अब से शुरू से http संस्करण की तलाश नहीं करनी चाहिए (भविष्य के रीडायरेक्ट से बचना) - https के लिए एक समय बचत साइटों। यह एसईओ के साथ भी मदद करता है, लेकिन आपके लिंक के रस को विभाजित नहीं करता है।


41

सभी ट्रैफ़िक को पुनर्निर्देशित करने के लिए:

redirect scheme https if !{ ssl_fc }

एकल url पुनर्निर्देशित करने के लिए (कई फ्रंट / बैकेंड के मामले में)

redirect scheme https if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }


1
धन्यवाद, "केवल एक विशिष्ट मेजबान पर" शर्त बस वही थी जिसकी मुझे तलाश थी!
क्वेंटिन स्कूसन

क्या आप कृपया दूसरे विकल्प का एक व्यावहारिक उदाहरण दिखा सकते हैं, कृपया?
RicarHincapie

16

Http://parsnips.net/haproxy-http-to-https-redirect/ के अनुसार फॉलो करने के लिए अपने haproxy.cfg को कॉन्फ़िगर करना जितना आसान होना चाहिए।

#---------------------------------------------------------------------
# Redirect to secured
#---------------------------------------------------------------------
frontend unsecured *:80
    redirect location https://foo.bar.com

#---------------------------------------------------------------------
# frontend secured
#---------------------------------------------------------------------
frontend  secured *:443
   mode  tcp
   default_backend      app

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    mode  tcp
    balance roundrobin
    server  app1 127.0.0.1:5001 check
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check

7
ताकि सब कुछ foo.bar.com पर पुनर्निर्देशित हो जाए । आदर्श रूप में, हम foo.bar.com/baz पर पुनर्निर्देशित करना चाहते हैं foo.bar.com/baz । हमें क्वेरी परम भी चाहिए।
जॉन चू

@JonChu एक वैध उपयोग-मामला उठाती है, यह केवल एक आंशिक समाधान है।
जे टेलर १

3
रीडायरेक्ट स्थान का उपयोग करने के बजाय, पूर्वनिर्धारित https: //foo.bar.com के बजाय पुनः प्रयास करें। इसे जॉन-चु उल्लेख का उपयोग करने में मदद करनी चाहिए।
xangxiong

16

Http से https तक सब कुछ पुनर्निर्देशित करने का सबसे अच्छा गारंटी तरीका है:

frontend http-in
   bind *:80
   mode http
   redirect scheme https code 301

यह 'कोड 301' का उपयोग करने वाला एक छोटा प्रशंसक है, लेकिन ग्राहक को यह बता सकता है कि यह स्थायी है। डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ 'मोड http' भाग आवश्यक नहीं है, लेकिन चोट नहीं पहुंचा सकता। यदि आपके पास mode tcpचूक अनुभाग (जैसे मैंने किया) है, तो यह आवश्यक है।


10

User2966600 के समाधान की थोड़ी भिन्नता ...

एक URL को छोड़कर सभी को पुनर्निर्देशित करना (कई फ्रंट / बैकएंड के मामले में):

redirect scheme https if !{ hdr(Host) -i www.mydomain.com } !{ ssl_fc }

4

जैसे जे टेलर ने कहा, हैप्रोक्सी 1.5-देव में redirect schemeविन्यास निर्देश है, जो ठीक वही है जो आपको चाहिए।

हालांकि, यदि आप 1.5 का उपयोग करने में असमर्थ हैं, और यदि आप स्रोत से HAProxy को संकलित करने के लिए तैयार हैं, तो मैंने redirect schemeकार्यक्षमता को वापस भेज दिया है इसलिए यह 1.4 में काम करता है। आप यहाँ पैच प्राप्त कर सकते हैं: http://marc.info/?l=haproxy&m=138456233430692&w=2



1

HAProxy के नए संस्करणों में इसका उपयोग करने की सिफारिश की गई है

http-request redirect scheme https if !{ ssl_fc }

http ट्रैफ़िक को पुनर्निर्देशित करने के लिए https।


0

यदि आप url को फिर से लिखना चाहते हैं, तो आपको इस लाइन को जोड़ते हुए अपनी साइट virtualhost को बदलना होगा:

### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on

### Rewrite http:// => https://
RewriteCond %{SERVER_PORT} 80$
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,NC,L]

लेकिन, यदि आप प्रॉक्सी के पीछे वेब सर्वर के पोर्ट 443 पर पोर्ट 80 पर अपने सभी अनुरोधों को पुनर्निर्देशित करना चाहते हैं, तो आप इस उदाहरण को अपने haproxy.cfg पर भ्रमित करने का प्रयास कर सकते हैं :

##########
# Global #
##########
global
    maxconn 100
    spread-checks 50
    daemon
    nbproc 4

############
# Defaults #
############
defaults
    maxconn 100
    log global
    mode http
    option dontlognull
    retries 3
    contimeout 60000
    clitimeout 60000
    srvtimeout 60000

#####################
# Frontend: HTTP-IN #
#####################
frontend http-in
    bind *:80
    option logasap
    option httplog
    option httpclose
    log global
    default_backend sslwebserver

#########################
# Backend: SSLWEBSERVER #
#########################
backend sslwebserver
    option httplog
    option forwardfor
    option abortonclose
    log global
    balance roundrobin
    # Server List
    server sslws01 webserver01:443 check
    server sslws02 webserver02:443 check
    server sslws03 webserver03:443 check

उम्मीद है इससे आपको मदद होगी


0

आप ट्रैफ़िक को अलग करने के लिए ACL का उपयोग क्यों नहीं करते? मेरे सिर के ऊपर:

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

मैथ्यू ब्राउन ने जो जवाब दिया वह सबसे ऊपर जाता है।

हा डॉक्स देखें , अधिक एसीएल विकल्प खोजने के लिए एचडीआर_डोम और नीचे जैसी चीजों को खोजें। बहुत सारे विकल्प हैं।



0

इस तरह किया जा सकता है -

  frontend http-in
   bind *:80
   mode http
   redirect scheme https code 301

Http से संबंधित कोई भी ट्रैफ़िक https पर रीडायरेक्ट करेगा


0

पुनर्निर्देशित कथन विरासत है

का उपयोग http अनुरोध रीडायरेक्ट बजाय

acl http      ssl_fc,not
http-request redirect scheme https if http

0

सीधे शब्दों में:

frontend incoming_requsts
        bind *:80
        bind *:443 ssl crt *path_to_cert*.**pem**
        **http-request redirect scheme https unless { ssl_fc }**
        default_backend k8s_nodes
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.