うまいぼうぶろぐ

linuxとhttpdとperlのメモ

big-ip irule memo

httpとhttpsのpoolをひとつのiruleで処理する

例えば
example.com-http
example.com-https
のようなpoolがある場合

CLIENT_ACCEPTEDではTCP::local_portでportが判別できるので

when CLIENT_ACCEPTED {
  switch -exact [TCP::local_port] {
    80  {  set pool_service "http"   }
    443 {  set pool_service "https"  }
  }
  set pool_prefix "example.com-"
  if ( # 何か条件分岐 ) {
    pool $pool_prefix$pool_service
  }
}

とすればiruleまとめられる

  • irule

pool hogehoge-pool
などを書いた場合、そのpoolが存在していないと構文エラーとなり
iruleを保存できない

ただし、変数などを定義して

set hogehoge "hogehoge-pool"
pool $hogehoge

とした場合はiruleは保存できるか、そのiruleが実行された際にエラーとなり、
iruleはそこで中断する。

set hogehoge "hogehoge-pool"
if { [HTTP::uri] starts_with "/hoge/" } {
  pool $hogehoge
  log local0.info "wryyyyyyyy"
}

hogehoge-poolがない場合、pool $hogehoge の時点でエラーになるため、
log local0.info は実行されずログにwryyyyyyyと出ない。

HTTP_RESPONSE

HTTP::redirect でredirectする場合は
HTTP::header insertなどを書いても無視される

irule の処理を終わらせる

1つのirule内の処理を終える場合
return

iruleが複数ファイルに分かれている場合に、
同じeventの処理を終える場合
event disable

例えば
virtualserver

  • irule1
  • irule2

が適用されていて、HTTP_REQUESTで書かれているとする。
普通に適用すると、irule1の内容のあと、irule2も評価されるけど、
特定の条件があった場合には、irule1でHTTP_REQUESTを終えたい場合、
irule1内にevent disable
と書く