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


98

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

どうすればいいですか?

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

回答:


137

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

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

redirect scheme https code 301 if !{ ssl_fc }

20
301を追加して、以下のUser2966600の回答から、これに追加するには、唯一の特定のドメインのためにhttpsにリダイレクトするためにこれを使用:redirect scheme https code 301 if { hdr(Host) -i www.mydomain.com } !{ ssl_fc }
クエンティンSkousen

1
うまくいきました。「コード301」がないと動作しません。更新ありがとうございます。
deej

6
指定された回答と同等の構文は次のようになりますhttp-request redirect scheme https code 301 if !{ ssl_fc }ALOHA HAProxy 7.0のhttpリダイレクションのドキュメントには、「両方のディレクティブの構文は同じですが、リダイレクトはレガシーと見なされ、構成はhttp-requestリダイレクトフォームに移行する必要がある」と記載されています。完全に確信はありませんが、同じ説明がHAProxyのオープンソースバージョンの新しいリリースにも当てはまると思います。
rodolfojcj

お返事をありがとうございます。この行をどこに追加する必要があるかを説明してください。フロントエンド/バックエンド/デフォルト/グローバル/ ..?
realtebo

通常はフロントエンド内に配置しますが、リダイレクトは単なるヘッダーであるため、応答ヘッダーが送信されるまでリダイレクトをトリガーできると思います。それが両方の場所で機能するかどうかを知りたいのですが、試してみる必要があるかもしれません。
ジェイテイラー

68

私は以前の答えにコメントする十分な評判がないので、私はジェイ・テイラーの答えを補足するために新しい答えを投稿しています。基本的に彼の回答はリダイレクトを行いますが、暗黙的なリダイレクトですが、302(一時的なリダイレクト)を発行しますが、質問ではウェブサイト全体がhttpsとして提供されることを通知するため、適切なリダイレクトは301(永続的なリダイレクト)である必要があります)。

redirect scheme https code 301 if !{ ssl_fc }

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


40

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

redirect scheme https if !{ ssl_fc }

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

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


1
おかげで、「特定のホストでのみ」の状態が私が探していたものでした!
Quentin Skousen 2015年

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は有効なユースケースを提起し、これは部分的なソリューションにすぎません。
ジェイテイラー

3
リダイレクト場所を使用する代わりに、代わりにリダイレクト接頭辞https://foo.bar.comを試してください。Jon Chuが言及しているユースケースに役立つはずです。
xangxiong 2013年

16

すべてのhttpをhttpsにリダイレクトするための最良の保証された方法は次のとおりです。

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

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


10

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

単一の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のすべての要求をプロキシの背後にあるWebサーバーのポート443にリダイレクトする場合は、haproxy.cfgで次の例の設定を試すことができます。

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

これは、マシューブラウンの答えに上ります。

その他のACLオプションを見つけるには、ha docsを参照し、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.