Browser Cookie Support Required iRule Using Modernizr
Problem this snippet solves:
Validates (using JavaScript) that the client browser supports cookies before continuing. It's a good idea to back up the Modernizr script libraries and store them locally in case something happens to them.
There is an exception for OPTIONS HTTP requests. This was a requirement in our environment, because there was an inbound application that could not accept cookies. The saving grace is that they told me they were using OPTIONS instead of GET, so I was able to create an exception to bypass the iRule. You'll want to keep this in mind in case you run into similar scenarios.
Feedback or suggestions are welcome.
How to use this snippet:
The iRule MUST be in last position of order. For some reason it doesn't work otherwise.
This site was damaging the code. You can download it as txt.zip or retrieve it from my first comment.
Shoutout to my webdev coworker for supplying the JavaScript portion, which I tweaked a bit and added the alert to. "If only there was some way to force the client to reload the page," I mused. Doh!
Code :
69783
Tested this on version:
11.5- Jer-OCirrus
author: Jer O. devcentral.f5.com/users/175899 title: Browser Cookie Support Required iRule Using Modernizr notes: PLACE THIS IRULE IN THE LAST POSITION ONLY (I suggest stating this in your iRule title) when HTTP_REQUEST { if { [HTTP::cookie count] equals 0 and not ( [HTTP::method] contains "OPTIONS" ) } { HTTP::respond 200 content { } noserver } else { return } }
The snippet looks very elegant! 🙂
Note: To make the ordering of the iRules more robust, you could tweak the iRule a little bit, so that your iRule could be assigned with the highest priority (would make much sense to check this iRule before processing other iRules, right?).
Just issue a
andevent disable all
right afterTCP::close
to stop further iRule processing on the current TCP connection and to get rid of possible "Operation not supported. Multiple redirect/respond invocations not allowed.." error messages.HTTP::respond
If you want o stick with the approach to assign the lowest priority to your iRule, then you may want to include a
check at the beginning of this iRule to see if other iRules with lower priorities had already responded the HTTP request (e.g. some Redirect) to avoid the "Operation not supported..." error messages.if { [catch {HTTP::payload replace 0 0 {}}] } then { return }
Cheers, Kai
- Jer-OCirrus
I see what you mean. I'll give that a test soon.
I'm not clear on what purpose Modernizr is serving. It seems like js.cookie is doing everything needed? I disabled it in a test scenario I built and it seems to function even if it's commented out.
- Jer-OCirrus
Hey, that's great info. I'll try the same soon.