文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

nginxで旧URLを新URLにリライトする

nginxで旧URLを新URLにリライトするお話です


f:id:treeapps:20180424102046p:plain

# 旧URL
# http://localhost/yahoo/itemSearch/?categoryId=13763&brandId=3775&brandName=%E3%83%88%E3%83%94%E3%83%BC%E3%82%AF

# 新URL
# http://localhost/yahoo/item/search/13763/?brandId=3775&brandName=%E3%83%88%E3%83%94%E3%83%BC%E3%82%AF

やりたいことはこれだけですが、QueryStringのリライト条件が何故か上手く動きません。

書き方が悪いだけかもしれませんが、最終的に以下の書き方で動作しました。

if ($args ~ "categoryId=([0-9]*)&brandId=([0-9]*)&brandName=(.*)" ) {
	set $categoryId $1;
	set $brandId $2;
	set $brandName $3;
	rewrite ^/yahoo/itemSearch/(.*)$ /yahoo/item/search/$categoryId/?brandId=$brandId&brandName=$brandName? permanent;
	break;
}

$argsはQueryStringの値が入ります。

複数の$argsはかけない(if XXXX || XXXX みたいな)ようなので、$args側ではなく、検索条件側に複数条件(categoryId・brandId・brandName)を書いています。

「set $categoryId $1;」これは、$1を$categoryId変数に保存しています。

わざわざこうしているのは、

	rewrite ^/yahoo/itemSearch/(.*)$ /yahoo/item/search/$categoryId/?brandId=$brandId&brandName=$brandName? permanent;

こっちの$1で上書きされてしまうので、一旦$categoryIdに保存しました。

今回は旧URLを新URLに置換したいだけなので、

属性を permanent(HTTPステータス301)にして、最後にbreakしてリライトを終了させています。


実を言うと、この書き方でしか動かなかったので、こういう書き方をしています。

もっといい方法というか、本来のやり方が解る方、教えて下さい。。。。