Page cache and query string


#1

I’ve read about the problems of using page cache when there’s a query
string, i.e. /article/list?page=1 will cache /article/list.html, then
/article/list?page=5 will retrieve /article/list.html regardless of
query string.

I’m using a workaround, it looks almost obvious but since I haven’t
found it mentioned anywhere I’m afraid there’s some equally obvious
drawback that I’m missing. If that’s the case, could anyone familiar
with caching in Rails please point it out?

Basically I’m having the web server rewrite URLs of the form
http://www.site.com/foo/bar?a=b to
http://www.site.com/foo/bar/query/a=b. Then in config/routes.rb there
is:

map.connect(‘foo/bar/query/:query_string’,
:controller => ‘foo’,
:action => ‘bar’)

In foo_controller.rb:

class FooController < ApplicationController
caches_page :bar
before_filter :merge_query_string

def bar
  render :text => "You asked for #{params.inspect}"
end

private

def merge_query_string
  params[:query_string] or return

  params.
    update(CGIMethods.parse_query_parameters(params[:query_string])).
    delete(:query_string)
end

end

When a request comes for /foo/bar?a=b, it is cached as
/foo/bar/query/a=b, and when it comes for /foo/bar?a=x, it is cached
separately as /foo/bar/query/a=x. Apparently it’s working. Where’s
the catch?

Thanks for any insight.
Massimiliano