🛬
Next.jsでサブドメインに特定のパスを割り当てる
やりたいこと
複数のプロジェクトを作ることなく、サブドメインは異なるページを割り当てたいときってありますよね!
たとえば、通常は/
を返し、
https://example.com
→ /
特定のサブドメインからのアクセスでは
https://dashboard.example.com
→ /dashboard
という感じです
source
にURLは書けない
こういうときにはNext.jsのRewritesという機能を使うことで解決できます。
参考: https://nextjs.org/docs/api-reference/next.config.js/rewrites
module.exports = {
async rewrites() {
return {
beforeFiles: [
{
source: 'https://dashboard.example.com:path*',
destination: '/dashboard:path*',
},
],
};
},
}
つまり、source
からアクセスがあったらdestination
の値を返してもらうのです。
うまくいかない
ところが、これでデプロイすると、
Error: Invalid redirect found
と怒られます。
source
に設定できる値はパスのみであり、URLを直接貼り付けることは許されいていないのです。
どうする
先述の通り、sourceにはパスのみしか設定できません。
なので、「ホスト名がdashboard.example.com
であった場合」 という条件を使うことにしましょう。
このようなときは、has
を使うと追加で条件を設定できます。
module.exports = {
async rewrites() {
return {
beforeFiles: [
{
source: '/:path*',
has: [
{
type: 'host',
value: 'dashboard.example.com',
},
],
destination: '/dashboard:path*',
},
],
};
},
async redirects() {
return [
{
source: '/dashboard:path*',
destination: 'https://dashboard.example.com/:path*',
permanent: false,
basePath: false,
},
];
},
};
おわり
今回はhostを使用しましたが、他にもheader
、cookie
などが設定できます。
このように、rewritesの機能を利用することで、URLなどに基づき、返すべページのルールを指定することができました。
Discussion