Forum Discussion
Irule not working as expected
- Oct 19, 2016
No need for any string command. If you don't want to normalize the case, then:
when HTTP_REQUEST { switch -glob [HTTP::uri] { ... etc ... } }
However, again, you probably want to use HTTP::path, since that's what you're actually matching on. For the case your provide, it would be something like this:
when HTTP_REQUEST { switch -glob [HTTP::path] { "*/MembershipEdit" { pool poolB } } }
For the example URL you provided, what you're trying to match is essentially "if the Target-Request path ends_with /MembershipEdit, then use poolB". With glob matching:
switch [HTTP::path] { "/foo" {...} ; means match if path is exactly /foo "*/foo" {...} ; means match if path ends with /foo "/foo/*" {...} ; means match if path starts with /foo/ "*/foo/*" {...} ; means match if path contains /foo/ }
For what it's worth, I suspect that what you really mean is:
when HTTP_REQUEST { switch -glob [HTTP::path] { "*/CustomerDetails" - "*/WebofferList" - "*/MembershipEdit" { pool poolB } } }
What I mean is, I suspect in all cases you are trying to match something at the end of the path, and since you are not normalizing the case (and generally, not normalizing the case of the path is the correct choice), then you must make sure the case matches.
A few other nuances. Firstly, you may wish to use HTTP::path, rather than HTTP::uri. The latter includes Request Parameters (i.e., the stuff starting with the ampersand (&) is a Request Target). If your glob match always ends with an asterisk (*) or you really do want to consider the Request Parameters as part of your match, then HTTP::uri is fine (or, in the latter case, required), but otherwise, HTTP::path is more correct (and, as a bonus, potentially shorter for the string comparison operation).
Secondly, unless you have a case-insensitive filesystem or are mangling the Request Target path (e.g., via Apache mod-rewrite) in a way that treats paths in a case-insensitive matter, you do not need to use string tolower (and you're spending execution cycles without value).
See this recipe for an explanation of these two points:
Finally, you do not need (and should not include) the default on the switch. You have already assigned the default pool to the Virtual Server. If the iRule doesn't change the pool selected, then that is the pool that will be used. Again, if you include this default branch, it is costing you execution cycles without value (and may be disruptive if you later change the code or the default pool attached to the Virtual Server).
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