Rails3.0.3でsession_optionsの設定にcookie_only => falseを指定するとき、ちょっとした注意が必要になります。

cookie_only => false を指定すると、クッキーからセッションIDが拾えなかった場合、paramsからセッションIDを取得しようとします。 actionpack-3.0.3/lib/action_dispatch/middleware/session/abstract_store.rb

        def extract_session_id(env)
          stale_session_check! do
            request = ActionDispatch::Request.new(env)
            sid = request.cookies[@key]
            sid ||= request.params[@key] unless @cookie_only
            sid
          end
        end

paramsにアクセスするためにrequest.paramsがコールされますが、この際、 env["action_dispatch.request.parameters"]に生成したparamsが保持されます。 そして以降、paramsを取得するときはこれを使用するのですが、そのためにRack内で後ほどマージされる予定だったcontroller と action の情報が params に含まれなくなってしまいます。

解決策としてはalias_method_chainなどを使って extract_session_id をちょっと修正し、処理後に env["action_dispatch.request.parameters"]をnilにしてあげればOKです。