Learn F5 Technologies, Get Answers & Share Community Solutions Join DevCentral

Filter by:
  • Solution
  • Technology
Answers

Simple iRule for URL appending?

Hey - was wondering if someone could give me a hand with a pretty basic task... how to append(or redirect) and URL. I have some people comming into a VS for "host.unit.com", but I have to send them to "host.unit.com/somewhere/else". The VS is taking in HTTP port 80, but is doing PAT to different nodes on different ports. I tried a couple of iRule examples, but failed. Anything would be appreciated... thanks.
1
Rate this Question

Answers to this Question

placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
This is a simple version that will do the initial redirect.


when HTTP_REQUEST {
	if { [HTTP::path] equals "/" } {
		HTTP::redirect "/somewhere/else.html"
	}
}


Let us know if this takes care of what you need or if you need anything else.
1
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER

Hi,

With https you don't need to change anything on this iRule.
You have to apply your server-ssl profile and that's all (you may need a client-ssl profile too).

1
Comments on this Answer
Comment made 15-Oct-2014 by Arun Bhardwaj 108
Thanks very much Thomas Gobet....:)
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Most Excellent!!! Worked like a charm. Thanks.
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
This is a simple version that does what you are describing that you need.

 
when HTTP_REQUEST {
	if { [HTTP::path] equals "/" } {
		HTTP::redirect "/somewhere/else.html"
	}
}


If you are needing something in addition to this or different functionality let us know.
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Keep in mind that HTTP::redirect issues a 302 - temporary redirect. It's more efficient to use 301s (permanent redirect) since it's cached by the client.

If you're pretty certain that the redirect target is not likely to change I'd use a 301. Otherwise you'll want to stick with a 302.
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
I have an very similar request which is that instead of append uri after url, I need insert "/aaa/bbb" in between. e.g. when user type in "http://www.testdomain.com/*", my F5 iRule need insert /aaa/bbb/ and make it "http://www.testdomain.com/aaa/bbb/*". Looking forward your kindly reply.

Not sure if "*" is the correct wildcard in TCL scripting, but when I put in "*", I actually mean that user could be puting different value.

Thanks
Roger
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Then you'd want something like:


when HTTP_REQUEST {
  if {!([HTTP::uri] starts_with "/aaa/bbb")} {
    HTTP::redirect "http://www.testdomain.com/aaa/bbb[HTTP::uri]"
  }
}


#Colin
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
yes, this is what I put in right now:

when HTTP_REQUEST {
    if {[HTTP::path] matches_regex "/*"} {
    HTTP::redirect "/aaa/bbb[HTTP::uri]"
    }
}

I did a packet capture on the VIP and by follow TCP stream, I find this iRule will insert /aaa/bbb with every HTTP request dose not matter it have /aaa/bbb or not. It will just insert /aaa/bbb over and over without stop, so the HTTP GET becomes....


1. GET /aaa/bbb/test.html
2. GET /aaa/bbb/aaa/bbb/test.html
3. GET /aaa/bbb/aaa/bbb/aaa/bbb/test.html
............
............
n. GET /aaa/bbb/aaa/bbb/...................................../aaa/bbb/aaa/bbb/test.html

Is there anything I can do in this iRule to make it insert only once?

Thanks
Roger







0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
The rule I wrote earlier does that check. The line that's important is:

if {!([HTTP::uri] starts_with "/aaa/bbb")} {


This means that the redirect only occurs if the URI doesn't already start with "/aaa/bbb"

#Colin
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Hey Colin

I am new to iRule so not sure why the one you write is not working, and I did some change on your iRule and it works now. Not sure if it is the best way, but its looks like this now:

when HTTP_REQUEST {
    if {[HTTP::uri] contains "/aaa/bbb"}
         {
        pool mypool        
         }
    else
      {
    HTTP::redirect "http://www.testweb.com/aaa/bbb[HTTP::uri]"
    }
}


Thank you very much for quick reply and the Rule you write!

Happy I made my first iRule working!

Thanks
Roger
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
I'm glad you got it working. :)

#Colin
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Hey guys,

This iRule works perfectly for me:


when HTTP_REQUEST { if { [HTTP::path] equals "/" } { HTTP::redirect "/apath" } }
 


But before using it I tried the following and it didn't work but I still have the curiosity to know why if anyone has any idea why please let me know. Here's my iRule:

 when HTTP_REQUEST { set val [HTTP::uri] if { {[string length $val] == 0} or {[string length $val] == 1} } { HTTP::redirect https://[HTTP::host]/apath } }
 
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Did the request contain a query string?
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
Banyan,

[root@iris:Active] css # b virtual bar list
bvirtual bar {
   snat automap
   pool foo
   destination 172.28.17.33:http
   ip protocol tcp
   rules myrule
   profiles {
      http {}
      tcp {}
   }
}
[root@iris:Active] css # b rule myrule list
rule myrule {
   when HTTP_REQUEST {
        set val [HTTP::uri]
        log local0. "\[HTTP::uri\] is $val"
        log local0. "\[string length $val\] is [string length $val]"
        if { ([string length $val] == 0) or ([string length $val] == 1)} {
                HTTP::redirect https://[HTTP::host]/apath
        }
}
}

[root@iris:Active] css # curl -I http://172.28.17.33/
HTTP/1.0 302 Found
Location: https://172.28.17.33/apath
Server: BigIP
Connection: Keep-Alive
Content-Length: 0

[root@iris:Active] css # cat /var/log/ltm
Nov  2 20:38:32 local/tmm info tmm[1609]: Rule myrule <HTTP_REQUEST>: [HTTP::uri] is /
Nov  2 20:38:32 local/tmm info tmm[1609]: Rule myrule <HTTP_REQUEST>: [string length /] is 1
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
I have box in pool member node on http://xyz.com/test. I want to irule hide internal /test and redirect to only http://xyz.com. Please help me
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
I have box in pool member node on http://xyz.com/test. I want to irule hide internal /test and redirect to only http://xyz.com. Please help me
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER
There are a few considerations to your request:

1. If you JUST want to hide the /test URI from the client, you can use the HTTP::uri command to transparently change the URI in the HTTP request.


when HTTP_REQUEST {
     HTTP::uri "/test[HTTP::uri]"
}


This is a rather brute force way of changing the incoming URI to "/test" plus whatever is already in the client's request.

Ex. client requests "/foo" and the server sees "/test/foo"

2. The problem with the above approach is that it doesn't account for what information the server may send back to the client in the form of object references. If that is a concern, then there are a few options, but I'd recommend an iRule-based stream expression to replace "/test" references in the response payload. The wiki page for streams has some pretty good examples that modify content in the HTTP_RESPONSE event.

3. The problem with the above is that it doesn't account for complex applications. Your example only shows one URI, but if that's just for illustration purposes and your environment is much more complicated than that, then I'd recommend a ProxyPass solution. The ProxyPass iRule will do exactly what you require but can handle much more complex requirements. If that's an option, do a quick search on this site for "ProxyPass".
0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER

Hi please help for Https request, what changes be there in this irule--

when HTTP_REQUEST { if { [HTTP::path] equals "/" } { HTTP::redirect "/somewhere/else.html" } }

for http request its working fine, but for https its not aking this irule...i changes http to https everywhere in irule...

0
placeholder+image
USER ACCEPTED ANSWER & F5 ACCEPTED ANSWER

@Arun, assuming that you're using separate VIPs for HTTP and HTTPS, can you confirm that the iRule has been assigned to both VIPs?

The rule as you included it above should not require any adjustments for HTTPS.

0