부하 분산에 HAProxy를 사용하고 있으며 내 사이트에서 https 만 지원하기를 원합니다. 따라서 포트 80의 모든 요청을 포트 443으로 리디렉션하고 싶습니다.
어떻게해야합니까?
편집 : 쿼리 매개 변수를 유지하면서 https에서 동일한 URL로 리디렉션하고 싶습니다. 따라서 http://foo.com/bar 는 https://foo.com/bar로 리디렉션됩니다.
부하 분산에 HAProxy를 사용하고 있으며 내 사이트에서 https 만 지원하기를 원합니다. 따라서 포트 80의 모든 요청을 포트 443으로 리디렉션하고 싶습니다.
어떻게해야합니까?
편집 : 쿼리 매개 변수를 유지하면서 https에서 동일한 URL로 리디렉션하고 싶습니다. 따라서 http://foo.com/bar 는 https://foo.com/bar로 리디렉션됩니다.
답변:
HAProxy 1.5 이상을 사용하고 프런트 엔드 구성에 다음 줄을 추가하면됩니다.
redirect scheme https code 301 if !{ ssl_fc }
http-request redirect scheme https code 301 if !{ ssl_fc }
.. ALOHA HAProxy 7.0의 http 리디렉션에 대한 문서에서는 " 두 지시문의 구문이 동일합니다. 즉, 리디렉션은 이제 레거시로 간주되며 구성은 http- 요청 리디렉션 형식으로 이동해야합니다 "라고 언급합니다. 나는 완전히 확신하지 않고, HAProxy의 오픈 소스 버전의 최신 릴리스에도 동일한 설명이 적용된다고 추론합니다.
이전 답변에 대해 언급 할만한 평판이 충분하지 않아 Jay Taylor의 답변을 보완하기 위해 새 답변을 게시하고 있습니다. 기본적으로 그의 대답은 암시 적 리디렉션 인 리디렉션을 수행합니다. 즉, 302 (임시 리디렉션)를 발행하지만 질문에서 전체 웹 사이트가 https로 제공 될 것이라고 알리기 때문에 적절한 리디렉션은 301 (영구 리디렉션)이어야합니다. ).
redirect scheme https code 301 if !{ ssl_fc }
작은 변화로 보이지만 웹 사이트에 따라 영향이 클 수 있습니다. 영구적 인 리디렉션을 통해 브라우저에 더 이상 처음부터 http 버전을 검색하지 않아야 함을 알립니다 (향후 리디렉션 방지)-https의 시간 절약 사이트. 또한 SEO에 도움이되지만 링크의 주스를 나누지는 않습니다.
모든 트래픽을 리디렉션하려면 :
redirect scheme https if !{ ssl_fc }
단일 URL을 리디렉션하려면 (프런트 엔드 / 백엔드가 여러 개인 경우)
redirect scheme https if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
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
Jay Taylor가 말했듯이 HAProxy 1.5-dev에는 redirect scheme
필요한 것을 정확히 수행 하는 구성 지시문이 있습니다.
그러나 1.5를 사용할 수없고 소스에서 HAProxy를 컴파일하려는 경우 redirect scheme
기능을 백 포트하여 1.4에서 작동합니다. 여기에서 패치를받을 수 있습니다 : http://marc.info/?l=haproxy&m=138456233430692&w=2
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
도움이 되었기를 바랍니다.
트래픽을 구별하기 위해 ACL을 사용하지 않는 이유는 무엇입니까? 내 머리 위에 :
acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver
이것은 Matthew Brown이 대답 한 것 위에 있습니다.
ha 문서를 참조하고 더 많은 ACL 옵션을 찾으려면 hdr_dom 및 아래와 같은 항목을 검색 하십시오 . 선택의 폭이 넓습니다.
HAProxy 프런트 엔드 구성에 다음을 추가합니다.
acl http ssl_fc,not
http-request redirect scheme https if http
간단히:
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
redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }