タイトルが日本語不自由
要するにこれがしたいんです。
http://example.com/products?id=A1254
を
http://example.com/products/A1254/
に書き換えたいわけです。Apacheならmod_rewriteの設定方法がいろいろあったんですが、Nginxだといまいちパッとしない情報しかなかったので記事にしました。
GETクエリ文字列をrewriteする!
単純なサイトの場合、クエリ文字列はできるだけ隠したいんですよね。URLをリダイレクトする方法の一つに「rewrite」を使う手があります。
ですが、単純にリダイレクトしてしまうとブラウザのURLバーもリダイレクト先に変わっていまうわけです。
ユーザーには http://example.com/products/A1254/ でアクセスさせつつ、サーバー内部では http://example.com/products?id=A1254 として処理する
location 内で設定する
特定のディレクトリのみで動作させるようにlocation内で設定します
location /products/ { rewrite ^/products/(\w{5})$ /products/?id=$1? break; }
ロケーション「products」内で ^/products/英数字5文字 でアクセスしてきたら /products?id=英数字5文字 として処理します。ユーザ側はhttp://example.com/products/英数字5文字 でアクセスしています。
クエリ文字列付きでアクセスしてきた場合
location /products/ { rewrite ^/products/?id=(\w{5}) /products/$1? last; }
rewriteの条件を入れ替えて 末尾をbreakからlastに変更しました。breakだと、rewrite実行後はURL評価されないのですが、lastはrewrite実行後、もう一度URLの評価が行われます。
つまり、クエリ付き(http://example.com/products?id=A1254)でアクセスしてきたら、URLを書き換えてリダイレクトする(http://example.com/products/A1254/)。末尾がlastなので書き換えられたURL(http://example.com/products/A1254/)は再評価されます。
再評価されるとhttp://example.com/products/A1254/ は内部的に(/products?id=A1254)としてrewriteされます。
php内で画面変遷時にはクエリ指定で飛ばして、nginx側でディレクトリ表記のURLに書き換えてもらうのもいいですね。