Forum Discussion
Direct HTTP request from an IP to specific pool members
We have an iRule works OK as below. HTTP requests are directed to coresponding pools respectively according to URI.
Rule_1:
when HTTP_REQUEST {
switch -glob [HTTP::uri] {
"/video/*" { pool VIDEO }
"/audio/*" {pool AUDIO}
"/text/*" {pool TEXT}
default {pool default_pool}
}
}
Now we want to divert all HTTP requests coming from IP 1.2.3.4 to the first member of each pool.
I add a new rule Rule_2 above Rule_1.
Rule_2:
when HTTP_REQUEST {
if { [HTTP::header "True-Client-IP"] equals "1.2.3.4"} {
log local0. " Requests from 1.2.3.4"
switch -glob [HTTP::uri] {
"/video/*" { pool VIDEO member video_a}
"/audio/*" {pool AUDIO member audio_a}
"/text/*" {pool TEXT member text_a}
default {pool default_pool member default_a}
}
}
}
It doesn't work. I can see the log " Requests from 1.2.3.4" though, but HTTP request can still land on other pool members.
Any hits or advise are much appreciated.
17 Replies
- Mohamed_Lrhazi
Altocumulus
Not how persistence works with an iRule "pool" command... but am wondering if it is not sending a request to a different pool member because if persistence. - nathe
Cirrocumulus
tqu
I'd either combine the 2 irules into 1 or due to the fact that it's the same event then you may want to use a priority to double ensure the irule no.2 fires the http_request event firstpriority 100 when HTTP_REQUEST { switch -glob [HTTP::uri] { "/video/*" { pool VIDEO } "/audio/*" {pool AUDIO} "/text/*" {pool TEXT} default {pool default_pool} } } priority 10 when HTTP_REQUEST { if { [HTTP::header "True-Client-IP"] equals "1.2.3.4"} { log local0. " Requests from 1.2.3.4" switch -glob [HTTP::uri] { "/video/*" { pool VIDEO member video_a} "/audio/*" {pool AUDIO member audio_a} "/text/*" {pool TEXT member text_a} default {pool default_pool member default_a} } } }
Hope this helps,
N - nathe
Cirrocumulus
tqu
Thought I'd repost back with my 1 iRule for this:when HTTP_REQUEST { if { [HTTP::header "True-Client-IP"] equals "1.2.3.4"} { log local0. "Requests from 1.2.3.4" switch -glob [HTTP::uri] { "/video/*" { pool VIDEO member video_a} "/audio/*" {pool AUDIO member audio_a} "/text/*" {pool TEXT member text_a} default {pool default_pool member default_a} } } else { switch -glob [HTTP::uri] { "/video/*" { pool VIDEO } "/audio/*" {pool AUDIO} "/text/*" {pool TEXT} default {pool default_pool} } } }
Also, according to https://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/130/iRules-101--05--Selecting-Pools-Pool-Members-and-Nodes.aspxYou can also choose a specific pool member using the pool command: pool HTTP_pool member 10.10.10.1 80
So if you haven't you may bee to add the port number after video_a etc..
Hope this helps,
N - nathe
Cirrocumulus
tqu
Apologies, messed up my last post:
Thought I'd repost back with my 1 iRule for this:when HTTP_REQUEST { if { [HTTP::header "True-Client-IP"] equals "1.2.3.4"} { log local0. "Requests from 1.2.3.4" switch -glob [HTTP::uri] { "/video/*" { pool VIDEO member video_a} "/audio/*" {pool AUDIO member audio_a} "/text/*" {pool TEXT member text_a} default {pool default_pool member default_a} } } else { switch -glob [HTTP::uri] { "/video/*" { pool VIDEO } "/audio/*" {pool AUDIO} "/text/*" {pool TEXT} default {pool default_pool} } } }
And, according to "https://devcentral.f5.com/Tutorials/TechTips/tabid/63/articleType/ArticleView/articleId/130/iRules-101--05--Selecting-Pools-Pool-Members-and-Nodes.aspx" you need to add the pool member port after the member (pool HTTP_pool member 10.10.10.1 80) e.g. video_a (if you haven't already of course).
Hope this helps,
N - tqu_93931
Nimbostratus
Thank you for your responses.
@ Mohamed. the virtual server is cookie persistant. I cannot change it for business reasons. But does it mean persistance can override an iRule?
@ Nathan, prioritize two rules doesn't solve it either. I haven't tried to put two rules into one yet, do you mean cut rule_2 and paste it to the top of rule_1, and apply only one rule? will it change the flow ? - Mohamed_Lrhazi
Altocumulus
I don't know about who wins, the pool command in an iRule or the persistence table. You could ask Support.
Nathan gave you the full combined iRule to use. He also said you need to specify the port number in the "pool" command. Maybe that will fix it? - tqu_93931
Nimbostratus
@Nathan, thank you so much. It looks like your proposed script works! - tqu_93931
Nimbostratus
Hi guys, sorry. It still doesn't work, when I test it massively with automated testing. :( - What_Lies_Bene1
Cirrostratus
It might be wise to enable OneConnect for the Virtual Server and retest, this should stop persistence and the iRule conflicting. - tqu_93931
Nimbostratus
OneConnect Profile is enabled. but still not working.
I'm wondering how soon the updated iRule will be effective? I often test it after 2 minutes, maybe too soon?
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
