Forum Discussion
John_43161
Nimbostratus
Oct 08, 2008Replace a query string variable value
This should be pretty straight forward but am having problems finding a way to change a query string variable value. basically I have an encoded url in the query string that I need to change to a different encoded url. I tried doing a string map on HTTP:uri, which didnt seem to work for values.
If anyone can help, would be most appreciated
Thanks!
9 Replies
- James_Quinby_46Historic F5 AccountCould you post a (sanitized, if necessary) copy of one of the URLs and what you need to change in it? A regex could probably do it, though there may be more efficient methods.
- John_43161
Nimbostratus
yeah the url is horrendous but the query variable in question isTARGET=-SM-http%3a%2f%2frbweb--dev%2egerbc%2erbcmtg%2ecom%2fcar%2f
So I want to change this "TARGET" variable to the valueTARGET=-SM-http%3a%2f%2f172%2e16%2e20%2e83%2fcar%2f - James_Quinby_46Historic F5 AccountI've been playing around a little with this:
when HTTP_REQUEST { set TARGET [URI::query [HTTP::uri] "-SM-http%3a%2f%2f172%2e16%2e20%2e83%2fcar%2f"] }
...bleh, never mind. I thought I had something with this, but was seeing an artifact of my local apache instance. - Give this a shot:
when HTTP_REQUEST { HTTP::uri [string map {"rbweb--dev%2egerbc%2erbcmtg%2ecom" "172%2e16%2e20%2e83"} [HTTP::uri]] }
When you said it didn't work for values, what did you mean? I tested this out with a test URL ofhttp://myserver/foo/bar?TARGET=-SM-http%3a%2f%2frbweb--dev%2egerbc%2erbcmtg%2ecom%2fcar%2f
and it changed it and sent it to the backend server ashttp://myserver/foo/bar?TARGET=-SM-http%3a%2f%2f172%2e16%2e20%2e83%2fcar%2f
Of course, if you need to expand this, you could put the relevant URL's in a class and do a lookup and then a replace based on a match in the class but you only specified that you had one url to change.
Hope this helps...
-Joe - James_Quinby_46Historic F5 Accountstring map...beautiful. filing that one away for sure.
- John_43161
Nimbostratus
Thanks Joe. I tried the string map before but was using -nocase option.....would that make it not work for some reason?
Anyway its working for me now, thanks much.
John - hoolio
Cirrostratus
Hi John,
I know the nocase flag isn't supported with switch statements as Joe pointed out in this post (Click here). But -nocase should work for string map:when RULE_INIT { log local0. "[string map {find replace} "search in string: FIND replace"]" log local0. "[string map -nocase {find replace} "search in string: FIND replace"]" }
Log output:
Rule : search in string: FIND replace
Rule : search in string: replace replace
Maybe it was down to using a variable with curly braces? This would not work because the curly braces force a literal interpretation of the search/replace fields:... set find "abc" set replace "xyz" log local0. "[string map {$find $replace} "search in string: abc"]" ...
Log output:
Rule : search in string: abc
You could use quotes instead to allow for variable expansion:set find "abc" set replace "xyz" log local0. "[string map "$find $replace" "search in string: abc"]"
Rule : search in string: xyz
Aaron - hoolio
Cirrostratus
Ha... actually I should read the posts I'm referencing. Joe stated in that post that the -nocase flag isn't supported for any command. I think this has changed in recent versions or was only true for the switch command. It works for string map in 9.4.5 and probably earlier versions (Click here - 9.1.0).
If you test with the -nocase option, do you get a TCL error in /var/log/ltm either when you try to save the rule or when you hit that portion of the code in a request?
Aaron - John_43161
Nimbostratus
btw, thanks for all the help guys appreciate it.
Recent Discussions
Related Content
DevCentral Quicklinks
* 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
Discover DevCentral Connects
