web-dev-qa-db-ja.com

HTTPをhttpsにリダイレクトするHAProxy(ssl)

負荷分散にHAProxyを使用していますが、サイトでのみhttpsをサポートする必要があります。したがって、ポート80のすべての要求をポート443にリダイレクトしたいと思います。

どうすればいいですか?

編集:httpsの同じURLにリダイレクトし、クエリパラメータを保持したいと思います。したがって、 http://foo.com/barhttps://foo.com/bar にリダイレクトされます

85
Jon Chu

これが最大の助けであることがわかりました

HAProxy 1.5以降を使用し、次の行をフロントエンド構成に追加するだけです。

redirect scheme https code 301 if !{ ssl_fc }
125
Jay Taylor

以前の回答にコメントするのに十分な評判がないので、Jay Taylorの回答を補足する新しい回答を投稿しています。基本的に彼の答えはリダイレクト、暗黙的なリダイレクトを行いますが、302(一時的なリダイレクト)を発行することを意味しますが、質問はWebサイト全体がhttpsとして提供されることを通知するため、適切なリダイレクトは301(永続的なリダイレクト)でなければなりません)。

redirect scheme https code 301 if !{ ssl_fc }

小さな変更のように見えますが、影響はWebサイトによっては大きくなる可能性があります。永続的なリダイレクトでは、ブラウザーに最初からhttpバージョンを探す必要がないことを通知します(将来のリダイレクトを回避)-httpsの時間節約サイト。また、SEOにも役立ちますが、リンクの成果を分けることはできません。

63
Marcos Abreu

すべてのトラフィックをリダイレクトするには:

redirect scheme https if !{ ssl_fc }

単一のURLをリダイレクトするには(複数のフロントエンド/バックエンドの場合)

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

37
user2966600

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
15
Matthew Brown

すべてのhttpをhttpsにリダイレクトする最も確実な方法は次のとおりです。

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

これは、「コード301」を使用する少し手の込んだ方法ですが、永続的であることをクライアントに知らせることもできます。 「モードhttp」の部分はデフォルト設定では必須ではありませんが、害はありません。デフォルトセクションにmode tcpがある場合(私がしたように)、それは必要です。

14
Maitreya

User2966600のソリューションのわずかなバリエーション...

すべてをリダイレクトするには除く単一のURL(複数のフロントエンド/バックエンドの場合):

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

Jay Taylorが言ったように、HAProxy 1.5-devにはredirect scheme設定ディレクティブがあり、これはまさに必要なことを実現します。

ただし、1.5を使用できず、ソースからHAProxyをコンパイルする場合は、redirect scheme機能をバックポートして、1.4で機能するようにしました。パッチはここで入手できます: http://marc.info/?l=haproxy&m=138456233430692&w=2

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

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のすべてのリクエストをプロキシの背後にあるWebサーバーのポート443にリダイレクトする場合は、haproxy.cfgでexample 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
Flat

これをHAProxyフロントエンド設定に追加します。

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

HAProxy-HTTPリクエストのリダイレクト

0
Nick Tsai

ACLを使用してトラフィックを区別しないのはなぜですか?私の頭の上に:

acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver

これはマシュー・ブラウンが答えたものの上に行きます。

ha docs を参照し、hdr_domなどを検索して、以下のACLオプションを見つけます。選択肢はたくさんあります。

0
Glenn Plas