http를 https (ssl)로 리디렉션하는 HAProxy


100

부하 분산에 HAProxy를 사용하고 있으며 내 사이트에서 https 만 지원하기를 원합니다. 따라서 포트 80의 모든 요청을 포트 443으로 리디렉션하고 싶습니다.

어떻게해야합니까?

편집 : 쿼리 매개 변수를 유지하면서 https에서 동일한 URL로 리디렉션하고 싶습니다. 따라서 http://foo.com/barhttps://foo.com/bar로 리디렉션됩니다.

답변:


141

나는 이것이 가장 큰 도움이된다는 것을 알았습니다 .

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 }.. ALOHA HAProxy 7.0의 http 리디렉션에 대한 문서에서는 " 두 지시문의 구문이 동일합니다. 즉, 리디렉션은 이제 레거시로 간주되며 구성은 http- 요청 리디렉션 형식으로 이동해야합니다 "라고 언급합니다. 나는 완전히 확신하지 않고, HAProxy의 오픈 소스 버전의 최신 릴리스에도 동일한 설명이 적용된다고 추론합니다.
rodolfojcj

답장을 보내 주셔서 감사합니다. 이 줄을 어디에 추가해야하는지 설명하기 위해 확장 할 수 있습니까? 프런트 엔드 / 백엔드 / 기본 / 글로벌 / ..?
realtebo

일반적으로 프런트 엔드 내부에 배치하지만 리디렉션은 헤더 일 뿐이므로 응답 헤더가 전송 될 때까지 리디렉션이 트리거 될 수 있습니다. 두 위치 모두에서 작동하는지 알고 싶습니다. 시도 해봐야 할 수도 있습니다.
Jay Taylor

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 2015 년

두 번째 옵션의 실제 예를 보여 주시겠습니까?
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 . 쿼리 매개 변수도 필요합니다.
Jon Chu

@JonChu는 유효한 사용 사례를 제기하며 이것은 부분적인 해결책 일뿐입니다.
Jay Taylor

3
리디렉션 위치를 사용하는 대신 리디렉션 접두사 https : //foo.bar.com을 사용해보세요. Jon Chu가 언급 한 사용 사례에 도움이 될 것입니다.
xangxiong

16

모든 http를 https로 리디렉션하는 가장 확실한 방법은 다음과 같습니다.

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

이것은 'code 301'을 사용하는 약간 더 멋지지만 클라이언트에게 그것이 영구적임을 알리는 것이 좋습니다. 'mode http'부분은 기본 구성에서 필수적인 것은 아니지만 해를 끼칠 수는 없습니다. mode tcp내가했던 것처럼 기본 섹션에 있으면 필요합니다.


10

user2966600 솔루션의 약간의 변형 ...

단일 URL을 제외한 모든 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


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

1

최신 버전의 HAProxy에서는 다음을 사용하는 것이 좋습니다.

http-request redirect scheme https if !{ ssl_fc }

http 트래픽을 https로 리디렉션합니다.


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으로 리디렉션하려면 haproxy.cfg 에서이 예제 conf를 시도 할 수 있습니다 .

##########
# 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 문서를 참조하고 더 많은 ACL 옵션을 찾으려면 hdr_dom 및 아래와 같은 항목을 검색 하십시오 . 선택의 폭이 넓습니다.



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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.