負荷分散に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 }
以前の回答にコメントするのに十分な評判がないので、Jay Taylorの回答を補足する新しい回答を投稿しています。基本的に彼の答えはリダイレクト、暗黙的なリダイレクトを行いますが、302(一時的なリダイレクト)を発行することを意味しますが、質問はWebサイト全体がhttpsとして提供されることを通知するため、適切なリダイレクトは301(永続的なリダイレクト)でなければなりません)。
redirect scheme https code 301 if !{ ssl_fc }
小さな変更のように見えますが、影響はWebサイトによっては大きくなる可能性があります。永続的なリダイレクトでは、ブラウザーに最初から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
すべてのhttpをhttpsにリダイレクトする最も確実な方法は次のとおりです。
frontend http-in
bind *:80
mode http
redirect scheme https code 301
これは、「コード301」を使用する少し手の込んだ方法ですが、永続的であることをクライアントに知らせることもできます。 「モードhttp」の部分はデフォルト設定では必須ではありませんが、害はありません。デフォルトセクションにmode tcp
がある場合(私がしたように)、それは必要です。
User2966600のソリューションのわずかなバリエーション...
すべてをリダイレクトするには除く単一のURL(複数のフロントエンド/バックエンドの場合):
redirect scheme https if !{ hdr(Host) -i www.mydomain.com } !{ ssl_fc }
Jay Taylorが言ったように、HAProxy 1.5-devにはredirect scheme
設定ディレクティブがあり、これはまさに必要なことを実現します。
ただし、1.5を使用できず、ソースからHAProxyをコンパイルする場合は、redirect scheme
機能をバックポートして、1.4で機能するようにしました。パッチはここで入手できます: http://marc.info/?l=haproxy&m=138456233430692&w=2
frontend unsecured *:80
mode http
redirect location https://foo.bar.com
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
これがお役に立てば幸いです
これをHAProxyフロントエンド設定に追加します。
acl http ssl_fc,not
http-request redirect scheme https if http
ACLを使用してトラフィックを区別しないのはなぜですか?私の頭の上に:
acl go_sslwebserver path bar
use_backend sslwebserver if go_sslwebserver
これはマシュー・ブラウンが答えたものの上に行きます。
ha docs を参照し、hdr_domなどを検索して、以下のACLオプションを見つけます。選択肢はたくさんあります。