HAProxy เปลี่ยนเส้นทาง http เป็น https (ssl)


100

ฉันใช้ HAProxy ในการทำโหลดบาลานซ์และต้องการให้ไซต์ของฉันรองรับ https เท่านั้น ดังนั้นฉันต้องการเปลี่ยนเส้นทางคำขอทั้งหมดบนพอร์ต 80 ไปยังพอร์ต 443

ฉันจะทำอย่างไร

แก้ไข: เราต้องการเปลี่ยนเส้นทางไปยัง URL เดียวกันบน https โดยสงวนพารามิเตอร์ข้อความค้นหาไว้ ดังนั้นhttp://foo.com/barจะเปลี่ยนเส้นทางไปที่https://foo.com/bar

คำตอบ:


143

ฉันพบว่านี่เป็นความช่วยเหลือที่ยิ่งใหญ่ที่สุด :

ใช้ 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' ขอบคุณสำหรับการอัปเดต
deej

7
http-request redirect scheme https code 301 if !{ ssl_fc }ไวยากรณ์เทียบเท่ากับคำตอบที่ได้รับก็จะเป็นเช่นนี้ เอกสารสำหรับการเปลี่ยนเส้นทาง http ใน ALOHA HAProxy 7.0ยังระบุว่า " ไวยากรณ์ของคำสั่งทั้งสองเหมือนกันกล่าวคือขณะนี้ถือว่าการเปลี่ยนเส้นทางเป็นแบบเดิมและการกำหนดค่าควรย้ายไปที่ฟอร์มการเปลี่ยนเส้นทางคำขอ http " ฉันสรุปโดยไม่แน่ใจว่าคำอธิบายเดียวกันนี้ใช้กับ HAProxy เวอร์ชันโอเพ่นซอร์สที่ใหม่กว่า
rodolfojcj

ขอบคุณสำหรับการตอบกลับของคุณ. ช่วยขยายความเพื่ออธิบายว่าเราต้องเพิ่มบรรทัดนี้ที่ไหน ในส่วนหน้า / แบ็กเอนด์ / default / global / .. ?
realtebo

1
สิ่งสำคัญคือต้องทราบว่าสิ่งนี้ต้องอยู่ในบล็อกส่วนหน้าแยกต่างหาก โค้ดตัวอย่างออนไลน์จำนวนมากมีทั้งการผูกในบล็อกเดียวกันและการเปลี่ยนเส้นทางในบล็อกแบบผูกคู่จะป้องกันไม่ให้ haproxy เริ่มทำงาน
Sami Fouad

68

ฉันไม่มีชื่อเสียงมากพอที่จะแสดงความคิดเห็นเกี่ยวกับคำตอบก่อนหน้านี้ดังนั้นฉันจึงโพสต์คำตอบใหม่เพื่อเติมเต็มคำตอบของ Jay Taylor โดยทั่วไปคำตอบของเขาจะทำการเปลี่ยนเส้นทางเป็นการเปลี่ยนเส้นทางโดยปริยายหมายความว่าจะออก 302 (การเปลี่ยนเส้นทางชั่วคราว) แต่เนื่องจากคำถามแจ้งว่าเว็บไซต์ทั้งหมดจะแสดงเป็น https ดังนั้นการเปลี่ยนเส้นทางที่เหมาะสมควรเป็น 301 (การเปลี่ยนเส้นทางแบบถาวร ).

redirect scheme https code 301 if !{ ssl_fc }

ดูเหมือนว่าจะมีการเปลี่ยนแปลงเล็กน้อย แต่ผลกระทบอาจมีมากขึ้นอยู่กับเว็บไซต์ด้วยการเปลี่ยนเส้นทางถาวรเราแจ้งเบราว์เซอร์ว่าไม่ควรมองหาเวอร์ชัน http อีกต่อไปตั้งแต่เริ่มต้น (หลีกเลี่ยงการเปลี่ยนเส้นทางในอนาคต) - ประหยัดเวลาสำหรับ https ไซต์ นอกจากนี้ยังช่วยในเรื่อง SEO แต่ไม่แบ่งส่วนที่เป็นลิงค์ของคุณ


42

ในการเปลี่ยนเส้นทางการรับส่งข้อมูลทั้งหมด:

redirect scheme https if !{ ssl_fc }

วิธีเปลี่ยนเส้นทาง URL เดียว (ในกรณีที่มีหลายส่วนหน้า / ส่วนหลัง)

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


1
ขอบคุณเงื่อนไข "เฉพาะในโฮสต์ที่เฉพาะเจาะจง" คือสิ่งที่ฉันกำลังมองหา!
Quentin Skousen

โปรดแสดงตัวอย่างที่เป็นประโยชน์ของตัวเลือกที่สองได้ไหม
RicarHincapie

16

วิธีที่รับประกันได้ดีที่สุดในการเปลี่ยนเส้นทาง http ทั้งหมดเป็น https คือ:

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

นี่เป็นเรื่องเล็กน้อยที่ใช้ 'รหัส 301′ แต่อาจแจ้งให้ลูกค้าทราบว่าเป็นแบบถาวร ส่วน 'โหมด http' ไม่จำเป็นสำหรับการกำหนดค่าเริ่มต้น แต่ไม่สามารถทำร้ายได้ หากคุณมีmode tcpในส่วนค่าเริ่มต้น (เช่นเดียวกับที่ฉันทำ) ก็จำเป็น


15

อ้างอิงจาก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 เรายังต้องการพารามิเตอร์การสืบค้น
Jon Chu

@JonChu ยกกรณีการใช้งานที่ถูกต้องนี่เป็นเพียงวิธีแก้ปัญหาบางส่วนเท่านั้น
Jay Taylor

3
แทนที่จะใช้ตำแหน่งการเปลี่ยนเส้นทางให้ลองใช้คำนำหน้าการเปลี่ยนเส้นทาง https: //foo.bar.com แทน มันควรช่วยในกรณีใช้งานที่จอนชูกล่าวถึง
xangxiong

10

การเปลี่ยนแปลงเล็กน้อยของโซลูชันของ user2966600 ...

ในการเปลี่ยนเส้นทางทั้งหมดยกเว้น URL เดียว (ในกรณีที่มีส่วนหน้า / แบ็กเอนด์หลายรายการ):

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

4

เช่นเดียวกับ Jay Taylor กล่าวว่า HAProxy 1.5-dev มี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


1

คำสั่งเปลี่ยนเส้นทางเป็นแบบเดิม

ใช้http-request redirectแทน

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

0

หากคุณต้องการเขียน URL ใหม่คุณต้องเปลี่ยนโฮสต์เสมือนของไซต์ของคุณโดยเพิ่มบรรทัดนี้:

### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on

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

แต่ถ้าคุณต้องการเปลี่ยนเส้นทางคำขอทั้งหมดของคุณบนพอร์ต 80 ไปยังพอร์ต 443 ของเว็บเซิร์ฟเวอร์หลังพร็อกซีคุณสามารถลองใช้ตัวอย่างนี้conf บน 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

สิ่งนี้อยู่เหนือสิ่งที่ Matthew Brown ตอบ

ดูเอกสาร haค้นหาสิ่งต่างๆเช่น hdr_dom และด้านล่างเพื่อค้นหาตัวเลือก ACL เพิ่มเติม มีให้เลือกมากมาย



0

ทำได้ดังนี้ -

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

การเข้าชมใด ๆ ที่กด http จะเปลี่ยนเส้นทางไปยัง https


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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.