cancel
Showing results for 
Search instead for 
Did you mean: 

HTTP::redirect doesn't work for multiple conditions, URL redirect doesn't work using iRule

Sabir_Alvi
Altocumulus
Altocumulus

So I have 2 types of redirects to handle, based on 2 types of URI. When a URI in the HTTP_REQUEST matches the value in Datagroup 1, I want to redirect to a certain URL by retaining a certain part of the URI.

When the URI does not match the value in Datagroup 1, it should move to the next Datagroup and look for matches in Datagroup 2. If matches, then redirect to another type of URL.

 

I have below iRule, but only the first part of the iRule is getting executed when it matches the URI. It doesn't go to the second part to look for matches. Please advise fixing this. Basically, I want to invoke the command multiple times while processing a single HTTP request.

 

when HTTP_REQUEST {     set url_hosts [class match -value -- [HTTP::uri] starts_with DATAGROUP_1]     if { $url_hosts ne "" } {       set redirected "true"       set LinkID [URI::query [HTTP::uri] id]       HTTP::redirect "https://$url_hosts/links/$LinkID"     }     if { $redirected ne "true" } {     set url_hosts [class match -value -- [HTTP::uri] starts_with DATAGROUP_2]       if { $url_hosts ne "" } {         set redirected "true"         HTTP::redirect "https://$url_hosts"       }   }   if { $redirected ne "true" } {     HTTP::respond 404 content "<Some HTML Code for error page>"   } }
1 ACCEPTED SOLUTION

Hi Sabir Alvi,

 

"redirected" variable must be defined before running code for line 8 and line 15.

If the first if does not match, iRule will give an error, because the "redirected" variable is not defined.

when HTTP_REQUEST { set redirected "false" set url_hosts [class match -value -- [HTTP::uri] starts_with DATAGROUP_1] if { $url_hosts ne "" } { set redirected "true" set LinkID [URI::query [HTTP::uri] id] HTTP::redirect "https://$url_hosts/links/$LinkID" } if { $redirected ne "true" } { set url_hosts [class match -value -- [HTTP::uri] starts_with DATAGROUP_2] if { $url_hosts ne "" } { set redirected "true" HTTP::redirect "https://$url_hosts" } } if { $redirected ne "true" } { HTTP::respond 404 content "<Some HTML Code for error page>" } }

 

View solution in original post

2 REPLIES 2

Hi Sabir Alvi,

 

"redirected" variable must be defined before running code for line 8 and line 15.

If the first if does not match, iRule will give an error, because the "redirected" variable is not defined.

when HTTP_REQUEST { set redirected "false" set url_hosts [class match -value -- [HTTP::uri] starts_with DATAGROUP_1] if { $url_hosts ne "" } { set redirected "true" set LinkID [URI::query [HTTP::uri] id] HTTP::redirect "https://$url_hosts/links/$LinkID" } if { $redirected ne "true" } { set url_hosts [class match -value -- [HTTP::uri] starts_with DATAGROUP_2] if { $url_hosts ne "" } { set redirected "true" HTTP::redirect "https://$url_hosts" } } if { $redirected ne "true" } { HTTP::respond 404 content "<Some HTML Code for error page>" } }

 

Thanks a lot, this just worked the way I wanted to!