Webalizer GroupAgent config

I’ve wanted Webalizer to group the UA strings for the major players in the browser market for a while now, and finally sat down this evening to poke around with things.

I don’t believe in “grouping” everything, because it just means I end up with a massive “grouping” list to maintain, and I just know I won’t be able to do that. So I’m just concentrating on the browsers who hold most market share for the browser demographic my client’s site’s are attracting. Besides, browsers with a small market share (I’m taking like less than a couple of percent here) aren’t really worth grouping.

As a developer, I’m interested in what versions of browsers visitors are using, but not that interested…and not so interested that I want to confuse the clients who are going to view the stats for their site. So I’m grouping by major version number, making sure to define a “catchall” style group for version numbers above/below any of the groups I have defined. This means that any new browsers versions released before I get a chance to update the list are still grouped.

The only problem I ran into was trying to define a GroupAgent string for IE. I wanted to match MSIE 8, MSIE 7, MSIE 6, etc. but unfortunately space characters delimit the GroupAgent string. Which is a bit of a pain. I noticed that the sample config file on the webalizer site used quotes to surround the string and encompass the space, but that didn’t work for me. Perhaps because Debian stable is still using version 2.01.10 from 2002. Gotta love Debian. I’ll revisit if they ever update the package.

Anyway, that means that I’m using just version numbers to group IE. Which isn’t great as we could potentially get some false positives…but hopefully not many as we’re matching all the other big players beforehand.

GroupAgent	Firefox/3		Firefox 3
HideAgent	Firefox/3
GroupAgent	Firefox/2		Firefox 2
HideAgent	Firefox/2
GroupAgent	Firefox/1		Firefox 1
HideAgent	Firefox/1
GroupAgent	Firefox			Firefox
HideAgent	Firefox
GroupAgent	Chrome/4		Chrome 4
HideAgent	Chrome/4
GroupAgent	Chrome/3		Chrome 3
HideAgent	Chrome/3
GroupAgent	Chrome/2		Chrome 2
HideAgent	Chrome/2
GroupAgent	Chrome/1		Chrome 1
HideAgent	Chrome/1
GroupAgent	Chrome/0		Chrome 0
HideAgent	Chrome/0
GroupAgent	Chrome			Chrome
HideAgent	Chrome
GroupAgent	iPhone			iPhone
HideAgent	iPhone
GroupAgent	Version/4		Safari 4
HideAgent	Version/4
GroupAgent	Version/3		Safari 3
HideAgent	Version/3
GroupAgent	Safari			Safari
HideAgent	Safari
GroupAgent	Opera/10		Opera 10
HideAgent	Opera/10
GroupAgent	Opera/9			Opera 9
HideAgent	Opera/9
GroupAgent	Opera/8			Opera 8
HideAgent	Opera/8
GroupAgent	Opera/7			Opera 7
HideAgent	Opera/7
GroupAgent	Opera/6			Opera 6
HideAgent	Opera/6
GroupAgent	Opera/5			Opera 5
HideAgent	Opera/5
GroupAgent	Opera			Opera
HideAgent	Opera
# TODO: When Debian finally upgrade webalizer, use "MSIE x"
GroupAgent	8.0			Internet Explorer 8
HideAgent	8.0
GroupAgent	7.0			Internet Explorer 7
HideAgent	7.0
GroupAgent	6.0			Internet Explorer 6
HideAgent	6.0
GroupAgent	MSIE			Internet Explorer
HideAgent	MSIE

MooTools Depender, Safari, etags and 412 Precondition Failed

* This replaces the default MooTools more Depender.request function to use
* HTTP "get" rather than "post".
* When sending requests for files via the depender, I was finding that Safari
* wasn't getting and re-evaluating them the second time I visited the page.
* This was because an etag was sent with each script.
* Safari responds to etags properly and adds "If-None-Match" and
* "If-Modified-Since" headers to another request for the same file. This makes
* Apache respond with a 412 status (Precondition Failed) as it should do for
* "post" requests (according to RFC 2616).
* Unfortunately Safari doesn't then deal with the 412 as it does with a 304
* (Not Modified). It doesn't grab what it has in the cache and put it in the
* response, it gives you nothing.
* For "get" requests, Apache has to respond with a 304, or 200 or whatever, but
* not 412. So we change the request method so we don't have to deal with 412.
Depender.request = function(url, callback){
    new Request.JSON({
        url: url,
        secure: false,
        onSuccess: callback,