Next.js(< 13)で次のようなルーティングを行いたい
/a-Japan
でアクセスされたらlocale=en
、country=Japan
としてパラメータを受け取る/ja/a-Japan
でアクセスされたらlocale=ja
、country=Japan
としてパラメータを受け取る/a-Japan/a-Tokyo
でアクセスされたらlocale=en
、country=Japan
、city=Tokyo
としてパラメータを受け取る/ja/a-Japan/a-Tokyo
でアクセスされたらlocale=ja
、country=Japan
、city=Tokyo
としてパラメータを受け取る/a-Japan/s-Tokyo
でアクセスされたらlocale=en
、country=Japan
、station=Tokyo
としてパラメータを受け取る/ja/a-Japan/s-Tokyo
でアクセスされたらlocale=ja
、country=Japan
、station=Tokyo
としてパラメータを受け取る
上記はすべて同じページで異なるパラメータを使って取得するデータを変える
いろいろ調べたがよい方法が見つからなかったので独自に考えた
パスの最初の階層によるlocale
の取得は、いわゆる国際化対応でNext.jsでは標準対応しているため簡単にできる
次にcountry
やcity
、station
であるが、これはrewrites機能を使った
/pages/area
を作成し、
/a-Japan
でアクセスされたら/area?country=a-Japan
になるように/a-Japan/a-Tokyo
でアクセスされたら/area?country=a-Japan&city=a-Tokyo
になるように/a-Japan/s-Tokyo
でアクセスされたら/area?country=a-Japan&station=s-Tokyo
になるように
こうなるように、next.config.jsにrewrite設定をした
async rewrites() { return [ { source: "/:country(a-[A-Z]+[a-zA-Z-]*)/:city(a-[A-Z]+[a-zA-Z-]*)", destination: "/area?country=:country&city=:city" }, { source: "/:country(a-[A-Z]+[a-zA-Z-]*)/:station(s-[A-Z]+[a-zA-Z-]*)", destination: "/area?country=:country&station=:station" }, { source: "/:country(a-[A-Z]+[a-zA-Z-]*)", destination: "/area?country=:country" } }
あとはgSSP
でa-
などのプレフィックスを処理することで、やりたいルーティングにすることができた