⚠この記事はブログ移転前のアーカイブです

タイトルが日本語不自由

要するにこれがしたいんです。

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に書き換えてもらうのもいいですね。