Forum Discussion

adminas's avatar
adminas
Icon for Altocumulus rankAltocumulus
Jul 10, 2024
Solved

Need help with iRule based on host and path

Hello all.

I am trying to create an iRule that will choose a specific pool based on host and path. I tried the following code:

when HTTP_REQUEST {
  if { [HTTP::host] equals "hostname_a"} {
    if { [HTTP::path] equals "/path" } {

      pool pool_a
        log local0. "URL : [HTTP::host][HTTP::uri] entered"
    }
  }
  if { [HTTP::host] equals "hostname_b"} {
    if { [HTTP::path] equals "/path" } {

        pool pool_b
        log local0. "URL : [HTTP::host][HTTP::uri] entered"
    }
  } 
}

According to Big-IP stats, the iRule gets executed but it doesnot direct the call to the pool (pool stats shows 0) specified although logging is invoked and I get the URL in the ltm logs.

Right after this script there is another one which gets executed and works as it should be. It specifies even more conditions for a series of pools and if none is matched then directs the call to the default pool specified there.

The problem is with the first one. I would like it to be executed and unless there is a match, then it should proceed to executing the second one. 

If you can give me some advice it would be highly appreciated. Thank you.

  • Finally, problem solved! The reason was the order of execution for the 2 scripts. I donot really understand why this happens but when I placed the script in second place, everything is executed as expected. If you have any ideas please let me know.

    The problematic order which doesnot work is shown below:

    First script:

    when HTTP_REQUEST {
      if { [HTTP::host] equals "hostname_a"} {
        if { [HTTP::path] equals "/path" } {

          pool pool_a
            log local0. "URL : [HTTP::host][HTTP::uri] entered"
        }
      }
      if { [HTTP::host] equals "hostname_b"} {
        if { [HTTP::path] equals "/path" } {

            pool pool_b
            log local0. "URL : [HTTP::host][HTTP::uri] entered"
        }
      } 
    }

     

    Second script:

    when HTTP_REQUEST {
    if {[HTTP::has_responded]}{return}
        switch -glob [string tolower [HTTP::path]]
        {

    ....

    ....

        }

        default
        {
                switch [string tolower [HTTP::host]]
                {

                     "hostname_a"

                     {

                       pool pool_c
                       persist none

                      }

    ....

    .....

                      default

                       {

                             pool_z

                       }

    ......

    Anyway, thank you all very much for your time.

10 Replies

No RepliesBe the first to reply