Forum Discussion
Leslie_South_55
Oct 17, 2008Nimbostratus
Using LB_FAILED and change the URI w/o 302
I am trying to use the 'when LB_FAILED' to send requests a pool just for apologies. The issue is that the requests coming into the VS have crazy long URI strings like '/ABC/def/g/hij/klmno/' and my sorry server is running a simple HTML page at '/apologies/apologies.htm' I have configured this directory and page to be the default, so I can hit the server directly at 'http://host.domain.com/' and get the correct content. I have tried a few different variations, and can't seem to be able to change the URI after 'when LB_FAILED' before the request goes to the apologies pool.
Rev 1, I added some logging to see what was being passed
when LB_FAILED {
log local0. "URI is [HTTP::uri]"
log local0. "$poolname has [active_members [LB::server pool]] members"
log local0. "URI is [HTTP::uri]"
pool pool_apologies_http
log local0. "Directed to pool [LB::server pool]"
}
Rev 2, tied the HTTP::uri command
when LB_FAILED {
log local0. "URI is [HTTP::uri]"
log local0. "$poolname has [active_members [LB::server pool]] members"
HTTP::uri "/"
log local0. "URI is [HTTP::uri]"
pool pool_apologies_http
log local0. "Directed to pool [LB::server pool]"
}
Can I do this with the 'when LB_FAILED' command, or does it have to be HTTP_REQUEST??
Thanks,
-L
- hooleylistCirrostratusHi lsouth,
- Leslie_South_55NimbostratusChanging to LB::reselect works, but I am having the same issue as DJ-Boston, no images....
- hooleylistCirrostratusCan you try this then? I assume HTTP::referer should work in LB_FAILED if HTTP::uri does, but haven't tested this before.
when LB_FAILED { log local0. "[IP::client_addr]:[TCP::client_port]: Request to pool failed, [LB::server pool]" Check if this request was not generated from the maintenance page using the HTTP referer header if {not ([HTTP::header value referer] ends_with "/maintenance_page.html")}{ log local0. "[IP::client_addr]:[TCP::client_port]: Referer wasn't the maintenance page. Rewriting URI to maintenance page." HTTP::uri "/maintenance_page.html" } Send request to the apologies pool LB::reselect pool pool_apologies_http log local0. "[IP::client_addr]:[TCP::client_port]: Reselecting member from the apologies pool" }
- Leslie_South_55NimbostratusHere is the rule with mods for my environment
when LB_FAILED { log local0. "[IP::client_addr]:[TCP::client_port]: Request to pool failed, [LB::server pool]" Check if this request was not generated from the maintenance page using the HTTP referer header if {not ([HTTP::header value referer] ends_with "/apologies.htm")}{ log local0. "[IP::client_addr]:[TCP::client_port]: Referer wasn't the maintenance page. Rewriting URI to maintenance page." HTTP::uri "/" } Send request to the apologies pool LB::reselect pool pool_apologies_http log local0 "[IP::client_addr]:[TCP::client_port]: Reselecting member from the apologies pool" }
- Leslie_South_55Nimbostratusno images yet
- Leslie_South_55NimbostratusI also checked the HTTP headers and I am not seeing a referrer, but I am seeing
- hooleylistCirrostratusIn order to work, the URI you check for in the Referer header and what you set the URI should be the same value in both places in the rule. And it should be different from normal pages that a user would request (so not something like "/" or "index.htm"). Can you test by renaming the maintenance page on the sorry pool server to something like /maintenanace.htm and use the rule below with more logging?
when LB_FAILED { log local0. "[IP::client_addr]:[TCP::client_port]: Request for [HTTP::uri] from [HTTP::header Referer] to pool failed, [LB::server pool]" Check if this request was not generated from the maintenance page using the HTTP referer header if {not ([HTTP::header value referer] ends_with "/maintenance.htm")}{ log local0. "[IP::client_addr]:[TCP::client_port]: Referer wasn't the maintenance page. Rewriting URI to maintenance page." HTTP::uri "/maintenance.htm" } Send request to the apologies pool LB::reselect pool pool_apologies_http log local0. "[IP::client_addr]:[TCP::client_port]: Reselecting member from the apologies pool" }
- Leslie_South_55NimbostratusSorry about the type-o in the log statement..I have renamed the site to maintenance.htm and it has an associated maintenance_files folder for all the "stuff" (images, css, js) I see now that the request is for my full app path "/Library/controller/e/web/Portal/en/maintenance_files/c.gif" for all the images, etc. ideally we would want "/maintenance_files/c.gif"..any way around this that you can think of? The maintenance page is provided by our customer, so we can't really change the content, hence all the JS and CSS files.
- hooleylistCirrostratusOf course... the client never knows about the maintenance URI as it's not being sent a redirect. So the Referer header value still shows the original URI it was making the request from. How about checking for the string "/maintenance_files/" in the requested URI and not rewriting those requests? Is it safe to assume that only the maintenance files will have that in the URI?
when LB_FAILED { log local0. "[IP::client_addr]:[TCP::client_port]: Request for [HTTP::uri] from Referer '[HTTP::header Referer]' to pool failed, [LB::server pool]" Check if this request was not generated from the maintenance page using the HTTP referer header if {not ([HTTP::path] contains "/maintenance_files/")}{ log local0. "[IP::client_addr]:[TCP::client_port]: Referer wasn't the maintenance page. Rewriting URI to maintenance page." HTTP::uri "/maintenance.htm" } Send request to the apologies pool LB::reselect pool pool_apologies_http log local0. "[IP::client_addr]:[TCP::client_port]: Reselecting member from the apologies pool" }
- Leslie_South_55NimbostratusNow I am getting 404's for all the images
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