This iRULE example will alter the incoming URI before passing the request to the servers:
when HTTP_REQUEST {
switch -glob [HTTP::uri] {
/old_URI/* { HTTP::uri /new_URI[HTTP::uri] }
}
}
In this case, for any incoming request that starts with the URI “/old_URI/” (http://domain.com/old_URI/), the “/old_URI/” will be replaced with “/new_URI/old_URI” and this will be passed to the servers (http://domain.com/new_URI/old_URI/)
The various interpretations within the switch statement:
/old_URI/ – URI equals /old_URI/
/old_URI/* – URI starts with /old_URI/
*/old_URI/* – URI contains /old_URI/
Instead of the “switch” statement, we can also use an “if-statement” like this:
when HTTP_REQUEST {
if { [HTTP::uri] starts_with "/old_URI/" } {
HTTP::uri /new_URI[HTTP::uri]
}
}
A slightly more complex version of the URI function alteration is provided here:
when HTTP_REQUEST {
set HOST [string tolower [HTTP::host]]
set URI [string tolower [HTTP::uri]]
if { $URI contains "/NEW_Session_ID=" } {HTTP::uri [string map {/NEW_Session_ID= /OLD_Session_ID=} [HTTP::uri]]
pool POOL-WEB-Server
}
}
when HTTP_RESPONSE {
if { [HTTP::header values Location] contains "/OLD_Session_ID=" } {
HTTP::header replace Location [string map {/OLD_Session_ID= /NEW_Session_ID=} [HTTP::header value Location]]
}
}
For any incoming HTTP Request, “/NEW_Session_ID=” within the URI is replaced with “/OLD_Session_ID=” and passed to the servers in the pool “POOL-WEB-Server”.
For any HTTP Response from the server to the client that contains the HTTP Header Location, “/OLD_Session_ID=” is replaced with “/NEW_Session_ID=”
This can be used to “mask” the URI or any other header information between the client and the server.
The following iRule will remove “/m/” in the incoming URI and send a redirect:
when HTTP_REQUEST {
set URI [string tolower [HTTP::uri]]
if {$URI starts_with "/m/" }{
set NEW_URI [string map {"/m/" "/"} [HTTP::uri]]
HTTP::respond 301 Location "http://www.domain.com$NEW_URI"
}
}
TEST:
$ curl -I http://10.10.10.10/m/OLD_URI
HTTP/1.0 301 Moved Permanently
Location: http://www.domain.com/OLD_URI
Server: BigIP
Connection: Keep-Alive
Content-Length: 0
The “/m/” in the URI is replaced with “/” as seen in the “Location” header.
This has been tested in production environment on 10.x code of F5 LTM