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

T31's avatar
T31
Icon for Altocumulus rankAltocumulus
Jan 09, 2024
Solved

Capture part of URI and do not redirect.

I am doing redirection for path like this:

/abc (and whatever parameters after /abc) is being redirected to /xyz

when HTTP_REQUEST {
if { [HTTP::host] contains "example.com" }{
elseif { [HTTP::uri] starts_with "/abc" } {
HTTP::redirect /xyz
}

My new requirement is:

If the uri is /abc (and whatever parameters after /abc, eg: /abc?=un), it should redirct to /xyz
If the uri is /abc-def (and whatever parameters after /abc-def, eg: /abc-def?=un, it should stay on same URI /abc-def

Could you please let me know how this can be acheived? Thanks

  • Thank you all for your help.
    I write this irule and solve my problem. 

    when HTTP_REQUEST {
    if { [HTTP::host] contains "example.com" }{
    elseif { [HTTP::uri] starts_with "/abc" and not ([HTTP::uri] contains "abc-def") } {
    HTTP::redirect /xyz

    This is what happening.

    example.com/abc -> redirecting to example.com/xyz
    example.com/abc?=un -> redirecting to example.com/xyz

    example.com/abc-def -> It stays as it is. This is my requirement.
    example.com/abc-def?=un ->  It stays as it is. This is okay for me now. 

    I was looking if there is anyway example.com/abc-def?=un can also be redirected to example.com/abc-def by modifying the irule above.

6 Replies

  • I think you can just replace:

    [HTTP::uri] starts_with "/abc"

    with:

    [HTTP::path] equals "/abc"
  • I think you need to use (not starts_with) operator for your logic. 

    In the below code sample, if the request equals to "abc" or not starts with "abc-def", it will be redirected to /xyz.

    Therefore, 

    "If the uri is /abc (and whatever parameters after /abc, eg: /abc?=un), it should redirct to /xyz
    If the uri is /abc-def (and whatever parameters after /abc-def, eg: /abc-def?=un, it should stay on same URI /abc-def"

    • /abc will be redirected to /xyz
    • /abc?=un will be redirected to /xyz (because it is not starts with "abc-def"
    • /abc-def will stay on same because it will not going into second if statement.

     

    when HTTP_REQUEST {
        if {[HTTP::host] eq "www.example.com"}{
            if{(([HTTP::uri] eq "abc") or !([HTTP::uri] starts_with "abc-def"))  }{
            HTTP::redirect "www.example.com/xyz"
        }
        }
    }

     

  • T31's avatar
    T31
    Icon for Altocumulus rankAltocumulus

    Thank you all for your help.
    I write this irule and solve my problem. 

    when HTTP_REQUEST {
    if { [HTTP::host] contains "example.com" }{
    elseif { [HTTP::uri] starts_with "/abc" and not ([HTTP::uri] contains "abc-def") } {
    HTTP::redirect /xyz

    This is what happening.

    example.com/abc -> redirecting to example.com/xyz
    example.com/abc?=un -> redirecting to example.com/xyz

    example.com/abc-def -> It stays as it is. This is my requirement.
    example.com/abc-def?=un ->  It stays as it is. This is okay for me now. 

    I was looking if there is anyway example.com/abc-def?=un can also be redirected to example.com/abc-def by modifying the irule above.

  • when HTTP_REQUEST {
        set HOST [string tolower [HTTP::host]]
        set URI [HTTP::uri]
    
        if { $HOST equals "example.com" } {
            if { $URI equals "/abc-def?=un" } {
                HTTP::redirect "/abc-def"
                return
            } elseif { $URI starts_with "/abc" && !($URI contains "abc-def") } {
                HTTP::redirect "/xyz"
            }
        }
    }