link_to() でパス形式ではなく QUERY_STRING(?形式)で書く

symfony で link_to() 使ってて、突然リンク先が 404 NotFound になることがあってアセった。
GET のクエリパラメタがあるんだけど、そこを ?arg=val 形式にすると大丈夫。パス形式(/区切り)のままでも値を変更すると大丈夫。
んん?と思って、いろいろ値を試してみると、どうやらURLに「.(ピリオド)」が含まれていると 404 NotFound になっちゃうみたい。

symfony のデフォルトのリライトルールである以下が悪さをしてる模様。

  # we skip all files with .something
  RewriteCond %{REQUEST_URI} \..+$
  RewriteCond %{REQUEST_URI} !\.html$
  RewriteRule .* - [L]

本来はここのルールで対処すべきなんだろうけど、影響範囲をいろいろと探るのがメンドイので、今回はとりあえず「 ?arg=val 形式にすると大丈夫」という方向で回避。

link_to() で URL を生成すると、普通は全てのパラメタと値がスラッシュ区切りでつなげられる。
今回のようにスラッシュ区切りではなく、query_string にしたければ、第3引数で指定できる。

link_to('label', 'module/action?param='.$value);    // module/action/param/value

って書いてたのを

link_to('label', 'module/action', array('query_string' => 'param='.$value)); // module/action?param=value

とした。

こちらのページを参考にさせていただきました → http://d.hatena.ne.jp/kuroppaz/20070705/1183625068