Forum Discussion
irules to rewrite old url to new url without changing the users browser url
Hi All
I am looking at the best way of performing a rewrite using an Irule, I had a google and found some examples and I haven't been able to get any to really work as expecting.
What I am trying to achieve is our devs are wanting to preserve the users browsers url (i.e. http://oldsite.test.com/test-site) but redirect the user to an alternate url (i.e. http://newsite.test.com/alternatesite/test) which is hosted via the same F5 but in a different pool.
I thought something like the below would achieve something along the lines but any pointers or suggestions would be extremely helpful:
when HTTP_REQUEST { if { [HTTP::uri] starts_with "/test-site" }{ HTTP::header replace "Host" "newsite.test.com" HTTP::path "/alternatesite/test" pool newsite-pool-HTTP } else { pool oldsite-pool-HTTP } }
Thanks in advance
7 Replies
- Arie
Altostratus
HTTP::uri is probably your best bet. It retains the URL in the browser's address bar but the LTM will send the re-written URL to the nodes.
Documentation: https://devcentral.f5.com/wiki/iRules.HTTP__uri.ashx
- Kevin_Stewart
Employee
Reformatting your iRule for discussion:
when HTTP_REQUEST { if { [HTTP::uri] starts_with "/test-site" } { HTTP::header replace "Host" "newsite.test.com" HTTP::path "/alternatesite/test" pool newsite-pool-HTTP } else { pool oldsite-pool-HTTP } }What you're basically saying is if the URI starts with /test-site, change the Host header, change the HTTP path, and send to a different pool. Otherwise send to the oldsite pool. I would start by changing HTTP::path to HTTP::uri. The HTTP::path is the part of the URI before any query strings, while HTTP::uri is the entire uri. The above iRule will work for the simplest environments, as long as the new site only ever uses the /alternatesite/test URI. If it doesn't, and it's in any way dynamic, then you have to do some more work. Depending on the complexity, you may want to take a look at the ProxyPass iRule (v11.3 and below) or the rewrite profiles in 11.4 and above.
You may also want to consider enabling a OneConnect profile.
- Arie
Altostratus
Thanks for reformatting the code, Kevin - I hadn't noticed the HTTP::path...
Regarding the Host header, it may not be necessary to replace it. Depends on the configuration of the web server.
- Annsar_Akhtar
Nimbostratus
Thanks Arie and Kevin, we are currently on v11.2.1 HF10 so will try the option of changing the path to a URI, unfortunately the URI is going to be a dynamic path but wanted to look at getting a simple rewrite working initially as a proof of concept but guess we might have to look into bringing our F5s up to at least v11.3 in order to try the ProxyPass irule option.
- Annsar_Akhtar
Nimbostratus
Thanks for that, I will give that a try I found the following article: https://devcentral.f5.com/wiki/iRules.proxypassv10.ashx so will give it a read and try
- jurgenvdmark_14
Nimbostratus
Have you considered using a HTTP_class for this purpose. Using a HTTP class you can specify using Pattern strings and apply an action such as Redirect to URL or select another pool.
- Annsar_Akhtar
Nimbostratus
Thanks, I am open to suggestions I am looking at ProxyPass iRule at the minute and suspect I haven't configured my data set correct as the request from the logs look like they are trying to redirect but back to the originating pool.
Help guide the future of your DevCentral Community!
What tools do you use to collaborate? (1min - anonymous)Recent Discussions
Related Content
* Getting Started on DevCentral
* Community Guidelines
* Community Terms of Use / EULA
* Community Ranking Explained
* Community Resources
* Contact the DevCentral Team
* Update MFA on account.f5.com