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