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

jonathanw84's avatar
Jun 03, 2020
Solved

iRule to Add Trailing Slash Except for Extensions

Hello,

I have an iRule that I am using to direct requests to a specific pool based on the URI:

when HTTP_REQUEST {
   set uri [string tolower [HTTP::uri]]
   if {[HTTP::uri] starts_with "/apps"} {
   pool ProxyPass_DEV_pool_2
   }
   else {
   pool ProxyPass_DEV_pool_1
}
}

This is working fine, but I also need to ensure that any request that does not have an trailing slash "/" at the end, gets it added, with the exception of requests that end in an extension. For example: www.website.com/apps would become www.website.com/apps/, but for any URI really.

Additionally, www.website.com/test.html would not be affected.

Any suggestions? Thanks!

  • Hello,

    Considering that the resource will only have the dot char to extensions, I do this way:

    when HTTP_REQUEST {
        if { not ( [HTTP::path] ends_with "/") && not ( [URI::basename [HTTP::uri]] contains "." ) } {
            # Append slash and keep querystring when it exists
            HTTP::uri [HTTP::path]/[expr { "[URI::query [HTTP::uri]]" eq {} ? {} : "?[URI::query [HTTP::uri]]" }]
        }
        if { [string tolower [HTTP::uri]] starts_with "/apps" } {
            pool ProxyPass_DEV_pool_2
        }
        else {
            pool ProxyPass_DEV_pool_1
        }
    }

    Where:

    1. "/apps" will become "/apps/" internally;
    2. "/apps?param=value" will become "/apps/?param=value" internally;
    3. "/test.html" and "/test.html?param=value" remais the same. 

    I hope it helps.

    Regards

4 Replies

  • Hello,

    Considering that the resource will only have the dot char to extensions, I do this way:

    when HTTP_REQUEST {
        if { not ( [HTTP::path] ends_with "/") && not ( [URI::basename [HTTP::uri]] contains "." ) } {
            # Append slash and keep querystring when it exists
            HTTP::uri [HTTP::path]/[expr { "[URI::query [HTTP::uri]]" eq {} ? {} : "?[URI::query [HTTP::uri]]" }]
        }
        if { [string tolower [HTTP::uri]] starts_with "/apps" } {
            pool ProxyPass_DEV_pool_2
        }
        else {
            pool ProxyPass_DEV_pool_1
        }
    }

    Where:

    1. "/apps" will become "/apps/" internally;
    2. "/apps?param=value" will become "/apps/?param=value" internally;
    3. "/test.html" and "/test.html?param=value" remais the same. 

    I hope it helps.

    Regards

    • jonathanw84's avatar
      jonathanw84
      Icon for Cirrus rankCirrus

      Thanks cjunior! This worked well with only one minor issue. It looks like it is appending the / regardless if it the / is there or not. Is there a way to make the statement to say "if not contains "." AND does not end with "/", to add the "/"?

       

      Thanks!

      • cjunior's avatar
        cjunior
        Icon for Nacreous rankNacreous

        Ops! That passed by my eyes :/.

        Thank you for warn me.

        I rewrited that condition. Check that out.