Technical Forum
Ask questions. Discover Answers.
cancel
Showing results for 
Search instead for 
Did you mean: 

iRule match & processing exit

Stefan_Engel
Cirrus
Cirrus

Hi, 

I'm trying write an iRule for an upcoming migration where we have multiple sites (MS Sharepoint) using the same host with different URI's. Some I want to just forward to a specific pool, while the 'rest' to be redirected to a new page. The 'rest' is basically everything starting with intranet, except some of the specific URI 

 

 

when HTTP_REQUEST 
{ if 
{ ([HTTP::host] starts_with "intranet") && ([HTTP::uri] equals "/AAA/") } { pool intranet_pool 
} elseif
{ ([HTTP::host] starts_with "intranet") && ([HTTP::uri] equals "/BBB/") } { pool intranet_pool 
} elseif
{ [HTTP::host] starts_with "intranet" } { HTTP::redirect https://intranet.new
}}

 

 

I'm facing 2 issues:

  • everything ends up being redirected intranet.new, no matter if the URI is AAA, BBB
  • I'm getting too many redirects with above iRule. If i change the redirect to f5.com it works, but still redirect everything starting with intranet

Do I need to exit the iRule somehow after I got the first match? Or how do I stop further processing? 

I've tried the same with LTM Policy, but getting same results. 

Appreciate your feedback. Thanks.

1 ACCEPTED SOLUTION

Hi Stefan_Engel,

In your code, a redirect loop occurs because the redirected page always starts with "intranet". Can you try this iRule?

when HTTP_REQUEST {
	if { [HTTP::host] starts_with "intranet" && [HTTP::uri] equals "/AAA/" } {
		pool intranet_pool
		return
	} elseif { [HTTP::host] starts_with "intranet" && [HTTP::uri] equals "/BBB/" } {
		pool intranet_pool
		return
	} elseif { [HTTP::host] starts_with "intranet" && [HTTP::uri] ne "/" } {
		HTTP::redirect https://intranet.new
		return
	}
}

If the uri is not "/", it will redirect.
If the uri is "/", it will not redirect, traffic will be forwarded to the default pool.
If there is no character after the hostname in url, the uri is always "/".

 

View solution in original post

3 REPLIES 3

Hi Stefan_Engel,

In your code, a redirect loop occurs because the redirected page always starts with "intranet". Can you try this iRule?

when HTTP_REQUEST {
	if { [HTTP::host] starts_with "intranet" && [HTTP::uri] equals "/AAA/" } {
		pool intranet_pool
		return
	} elseif { [HTTP::host] starts_with "intranet" && [HTTP::uri] equals "/BBB/" } {
		pool intranet_pool
		return
	} elseif { [HTTP::host] starts_with "intranet" && [HTTP::uri] ne "/" } {
		HTTP::redirect https://intranet.new
		return
	}
}

If the uri is not "/", it will redirect.
If the uri is "/", it will not redirect, traffic will be forwarded to the default pool.
If there is no character after the hostname in url, the uri is always "/".

 

Kevin_Stewart
F5 Employee
F5 Employee

I would add some log statements to see exactly what you're getting. It could simply be a string case issue.

On the redirects, your last line is causing this. You're basically saying if the host starts with "intranet", redirect to "intranet.new". But if the same iRule processes intranet.new, then that too will start with "intranet".

when HTTP_REQUEST { 
  log local0. "Incoming: [HTTP::host][HTTP::uri]"
  if { ( [HTTP::host] starts_with "intranet" ) && ( [HTTP::uri] equals "/AAA/" ) } { 
    log local0. "Catch /AAA/ - Sending to intranet_pool"
    pool intranet_pool 
  } elseif { ( [HTTP::host] starts_with "intranet" ) && ( [HTTP::uri] equals "/BBB/" ) } { 
    log local0. "Catch /BBB/ - Sending to intranet_pool"
    pool intranet_pool 
  } elseif { ( [HTTP::host] starts_with "intranet" ) && ( [HTTP::host] ne "intranet.net" ) } { 
    HTTP::redirect https://intranet.new
  }
}

Stefan_Engel
Cirrus
Cirrus

Thank you both for the response. I've added logging which helped and the ne "/" solved the loop on redirects.