これに似たリダイレクトマップをセットアップしたい 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が起動しません。
これはpath
http-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'
元の問題は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の場合-変数から値をフェッチして戻し、マップファイルに値があるかどうかを確認します。その場合、その値がリダイレクトに使用されます。