HAProxy chuyển hướng http đến https (ssl)


99

Tôi đang sử dụng HAProxy để cân bằng tải và chỉ muốn trang web của mình hỗ trợ https. Do đó, tôi muốn chuyển hướng tất cả các yêu cầu trên cổng 80 đến cổng 443.

Tôi sẽ làm điều này như thế nào?

Chỉnh sửa: Chúng tôi muốn chuyển hướng đến cùng một url trên https, giữ nguyên các tham số truy vấn. Do đó, http://foo.com/bar sẽ chuyển hướng đến https://foo.com/bar

Câu trả lời:


137

Tôi thấy đây là trợ giúp lớn nhất :

Sử dụng HAProxy 1.5 hoặc mới hơn và chỉ cần thêm dòng sau vào cấu hình giao diện người dùng:

redirect scheme https code 301 if !{ ssl_fc }

20
Để thêm vào đó, từ câu trả lời của User2966600 dưới đây, với 301 bổ sung, sử dụng để chuyển hướng đến https cho chỉ là một lĩnh vực cụ thể:redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Quentin Skousen

1
Điều đó đã hiệu quả. Mặc dù nó không hoạt động nếu không có 'mã 301'. Cảm ơn đã cập nhật.
deej

6
Một cú pháp tương đương với câu trả lời nhất định sẽ được như thế này: http-request redirect scheme https code 301 if !{ ssl_fc }. Tài liệu về chuyển hướng http trong ALOHA HAProxy 7.0 thậm chí còn đề cập rằng " cú pháp của cả hai lệnh đều giống nhau, điều đó nói rằng, chuyển hướng hiện được coi là kế thừa và các cấu hình sẽ chuyển sang biểu mẫu chuyển hướng yêu cầu http ". Tôi suy luận, mà không hoàn toàn chắc chắn, giải thích tương tự cũng áp dụng cho các bản phát hành mới hơn của phiên bản mã nguồn mở HAProxy.
rodolfojcj

Cảm ơn vì đã trả lời. Bạn có thể mở rộng để giải thích nơi chúng tôi phải thêm dòng này? Trong frontend / backend / default / global / ..?
realtebo

Tôi thường đặt nó bên trong giao diện người dùng, nhưng chuyển hướng chỉ là một tiêu đề, vì vậy tôi hy vọng chuyển hướng có thể được kích hoạt cho đến khi tiêu đề phản hồi được gửi. Tôi muốn biết nếu nó có thể hoạt động ở cả hai địa điểm, có thể phải thử.
Jay Taylor

68

Tôi không có đủ danh tiếng để bình luận về một câu trả lời trước đó, vì vậy tôi đăng một câu trả lời mới để bổ sung cho câu trả lời của Jay Taylor. Về cơ bản, câu trả lời của anh ấy sẽ thực hiện chuyển hướng, một chuyển hướng ngầm, nghĩa là nó sẽ đưa ra 302 (chuyển hướng tạm thời), nhưng vì câu hỏi thông báo rằng toàn bộ trang web sẽ được phân phát dưới dạng https, nên chuyển hướng thích hợp phải là 301 (chuyển hướng vĩnh viễn ).

redirect scheme https code 301 if !{ ssl_fc }

Có vẻ như một thay đổi nhỏ, nhưng tác động có thể rất lớn tùy thuộc vào trang web, với chuyển hướng vĩnh viễn, chúng tôi sẽ thông báo cho trình duyệt rằng trình duyệt không nên tìm kiếm phiên bản http ngay từ đầu (tránh chuyển hướng trong tương lai) - một trình tiết kiệm thời gian cho https các trang web. Nó cũng giúp ích cho SEO, nhưng không phân chia nguồn lực của các liên kết của bạn.


40

Để chuyển hướng tất cả lưu lượng truy cập:

redirect scheme https if !{ ssl_fc }

Để chuyển hướng một url (Trong trường hợp có nhiều giao diện người dùng / phụ trợ)

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


1
Cảm ơn, điều kiện "chỉ trên một máy chủ cụ thể" chính là điều tôi đang tìm kiếm!
Quentin Skousen

Bạn có thể vui lòng chỉ ra một ví dụ thực tế về lựa chọn thứ hai được không?
RicarHincapie

16

Theo http://parsnips.net/haproxy-http-to-https-redirect/, việc định cấu hình haproxy.cfg của bạn để chứa phần sau sẽ dễ dàng như vậy.

#---------------------------------------------------------------------
# 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
Vì vậy, điều đó sẽ chuyển hướng mọi thứ đến foo.bar.com . Tuy nhiên, lý tưởng nhất là chúng tôi muốn foo.bar.com/baz chuyển hướng đến foo.bar.com/baz . Chúng tôi cũng cần các tham số truy vấn.
Jon Chu

@JonChu nêu ra trường hợp sử dụng hợp lệ, đây chỉ là giải pháp một phần.
Jay Taylor

3
Thay vì sử dụng vị trí chuyển hướng, hãy thử chuyển hướng tiền tố https: //foo.bar.com. Nó sẽ hữu ích với trường hợp sử dụng mà Jon Chu đề cập.
xangxiong

16

Cách đảm bảo tốt nhất để chuyển hướng mọi thứ từ http sang https là:

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

Đây là một chút tưởng tượng bằng cách sử dụng 'mã 301 ′, nhưng cũng có thể cho khách hàng biết nó vĩnh viễn. Phần 'mode http' không cần thiết với cấu hình mặc định, nhưng không thể làm tổn hại. Nếu bạn có mode tcpphần mặc định (như tôi đã làm), thì nó là cần thiết.


10

Một biến thể nhỏ của giải pháp của user2966600 ...

Để chuyển hướng tất cả ngoại trừ một URL duy nhất (Trong trường hợp có nhiều giao diện người dùng / phụ trợ):

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

4

Giống như Jay Taylor đã nói, HAProxy 1.5-dev có redirect schemechỉ thị cấu hình, hoàn thành chính xác những gì bạn cần.

Tuy nhiên, nếu bạn không thể sử dụng 1.5 và nếu bạn muốn biên dịch HAProxy từ nguồn, tôi đã báo cáo lại redirect schemechức năng để nó hoạt động trong 1.4. Bạn có thể tải bản vá tại đây: http://marc.info/?l=haproxy&m=138456233430692&w=2


2
frontend unsecured *:80
    mode http
    redirect location https://foo.bar.com

1

Trong các phiên bản HAProxy mới hơn, bạn nên sử dụng

http-request redirect scheme https if !{ ssl_fc }

để chuyển hướng lưu lượng truy cập http sang https.


0

Nếu bạn muốn viết lại url, bạn phải thay đổi máy chủ ảo trang web của mình bằng cách thêm các dòng sau:

### Enabling mod_rewrite
Options FollowSymLinks
RewriteEngine on

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

Tuy nhiên, nếu bạn muốn chuyển hướng tất cả các yêu cầu của mình trên cổng 80 đến cổng 443 của máy chủ web phía sau proxy, bạn có thể thử conf ví dụ này trên haproxy.cfg của mình:

##########
# 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

Tôi hy vọng điều này sẽ giúp bạn


0

Tại sao bạn không sử dụng ACL để phân biệt lưu lượng truy cập? trên đầu tôi:

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

Điều này dựa trên những gì Matthew Brown đã trả lời.

Xem tài liệu ha , tìm kiếm những thứ như hdr_dom và bên dưới để tìm thêm các tùy chọn ACL. Có rất nhiều sự lựa chọn.



0

Có thể được thực hiện như thế này -

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

Mọi lưu lượng truy cập vào http sẽ chuyển hướng đến https


0

tuyên bố chuyển hướng là kế thừa

sử dụng chuyển hướng yêu cầu http thay thế

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

0

Đơn giản:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.