For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

Forum Discussion

VFB's avatar
VFB
Icon for Cirrus rankCirrus
Jan 06, 2016

http header and uri redirect

Hello, I'm attempting to construct an iRule that looks at a header and URI, then performs a redirect if they match. This is what I've attempted but unsuccessful. I have multiple redirects based on different headers and URI's, but this is a base of what I need to get started. Thanks in advance.

 

when HTTP_REQUEST { switch -glob [string tolower [HTTP::header]] contains "www.yahoo.com" and [HTTP::uri]] equals "/news" - "/weather" { HTTP::redirect "https://www.yahoo.com/login.aspx=0" } else { when HTTP_REQUEST { switch -glob [string tolower [HTTP::header]] contains "www.google.com" and [HTTP::uri]] equals "/news" - "/weather" { HTTP::redirect "https://www.google.com/login.aspx=0" } } }

 

2 Replies

  • Hi,

    Maybe I did not understood well, but, as you mentioned "multiple headers", have you a list of header names or you intend to look at any of them? I think I would do like this:
    when HTTP_REQUEST { 
        switch -glob [string tolower [HTTP::uri]] {
            "/news*" - 
            "/weather*" {
                foreach name [list MyHeader1 MyHeader2 MyHeaderN] {
                    switch -glob [string tolower [HTTP::header $name]] {
                        "*www.yahoo.com*" { 
                            HTTP::redirect "https://www.yahoo.com/login.aspx=0"
                            return
                        }
                        "*www.google.com*" { 
                            HTTP::redirect "https://www.google.com/login.aspx=0"
                            return
                        }
                    }
                }
            }
        }
    }
    

    or this for any header names:

    when HTTP_REQUEST { 
        switch -glob [string tolower [HTTP::uri]] {
            "/news*" - 
            "/weather*" {
                foreach name [HTTP::header names] {
                    switch -glob [string tolower [HTTP::header $name]] {
                        "*www.yahoo.com*" { 
                            HTTP::redirect "https://www.yahoo.com/login.aspx=0"
                            return
                        }
                        "*www.google.com*" { 
                            HTTP::redirect "https://www.google.com/login.aspx=0"
                            return
                        }
                    }
                }
            }
        }
    }
    

    I'm not sure if that was what you wanted, anyway, I hope it helps you in some way.

  • Hi VFB,

     

    could it be that you wanna parse the HOST-header for a given site name and then apply some redirects based on the a given URI? If so then this code would do the trick...

     

    when HTTP_REQUEST { 
        switch -exact -- [string tolower [HTTP::host]] "www.yahoo.com" {
            switch -exact -- [string tolower [HTTP::uri]] "/news" - "/weather" {
                HTTP::redirect "https://www.yahoo.com/login.aspx=0"
            } default {
                do nothing
            }   
        } "www.google.com" {
            switch -exact -- [string tolower [HTTP::uri]] "/news" - "/weather" {
                HTTP::redirect "https://www.google.com/login.aspx=0"
            } default {
                do nothing
            }
        } default {
             do nothing
        }
    }

    BTW: If not, then elaborate some additional details on the "header" you want to parse.

     

    Cheers, Kai