web-dev-qa-db-ja.com

http-response、map、およびregsubを使用したHAProxy1.6リダイレクト

これに似たリダイレクトマップをセットアップしたい https://stackoverflow.com/questions/23001799/how-do-i-used-the-map-feature-in-haproxy-to-build-massive-リダイレクトテーブル1-5

違いは、_http-response_ではなく_http-request_を使用することです。その理由は、バックエンドサーバーが404を返したときにonlyをリダイレクトしたいためです。

これは私の設定です

_http-response redirect location %[capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map)] code 301 if { status 404 } { capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map) -m found }
_

regsubを使用して、_capture.req.uri_からクエリパラメータを削除しようとしました。しかし、HAProxyを再起動するとこのエラーが発生します。

[ALERT] 280/171612 (6176) : parsing [/etc/haproxy/haproxy.cfg:87] : error detected in proxy 'http' while parsing 'http-response redirect' rule : error in condition: invalid arg 2 in conv method 'regsub' : missing arguments (got 1/2), type 'string' expected in ACL expression 'capture.req.uri,regsub(\?(.*),),map(/etc/haproxy/redirects.map)'. [ALERT] 280/171612 (6176) : Error(s) found in configuration file : /etc/haproxy/haproxy.cfg Errors found in configuration file, check it with 'haproxy check'.

クエリパラメータなしでURLを取得する方法はありますか? _capture.req.uri_の代わりにpathを使用しようとしましたが、HAProxyが起動しません。

これはpathhttp-response redirect location %[path,map(/etc/haproxy/redirects.map)] code 303 if { status 404 } { path,map(/etc/haproxy/redirects.map) -m found }を使用した私の設定です

そしてこれは警告です

[WARNING] 283/090721 (2875) : parsing [/etc/haproxy/haproxy.cfg:88] : 'redirect' : sample fetch <path,map(/etc/haproxy/redirects.map)> may not be reliably used here because it needs 'HTTP request headers' which is not available here. [WARNING] 283/090721 (2875) : parsing [/etc/haproxy/haproxy.cfg:88] : anonymous acl will never match because it uses keyword 'path' which is incompatible with 'backend http-response header rule'

2
Rudy Lee

元の問題はregsub(\?(.*),)の問題でしたが、regsubコンバーターが構成パーサーが処理できる式に制限されているため問題が発生しました。 _)_は、引数が少なすぎて閉じるregsub()として。 (リテラルの場合、_\\xnn_ hex-escapesを使用してパーサーの制限を回避できますが、ここでは機能しません。)

regsubが使用されていたのは、このリダイレクトが応答処理中にトリガーされ、_if { status 404 }_であり、処理のその段階ではpathフェッチを使用できないためです。HAProxyはサーバーに送信されたリクエスト。

ただし、HAProxy 1.6では、トランザクション(txn)スコープで使用した場合に、要求側からデータを運ぶために使用できるユーザー変数も導入されています。

リクエストの処理中に、pathフェッチの内容を、トランザクションスコープの変数(偶然)pathに格納します。

_http-request set-var(txn.path) path
_

その後、応答処理中にアクセスできます。

以下は、明確にするために複数の行に表示されていますが、構成の1行になければなりません。

_http-response redirect 
    location %[var(txn.path),map(/etc/haproxy/redirects.map)] 
    code 303 
    if { status 404 } { var(txn.path),map(/etc/haproxy/redirects.map) -m found }
_

これ-応答ステータスコードが404の場合-変数から値をフェッチして戻し、マップファイルに値があるかどうかを確認します。その場合、その値がリダイレクトに使用されます。

1