2022/06/14

Next.js で URL に#を含むページを作成する

tl;dr

next.js で # が含まれた static page のリンクは # でなく %2325 にする必要がある。
アクセスできるようになったが、そもそも URL に # を入れないのがよい。

事象

はてなブログからの記事を移行する際に、記事のタイトルを markdown のファイル名にしていた。
/posts/Array#slice.md を元に出力した /posts/Arrray#slice ページにアクセスしようとすると 404 になってしまう。

環境

  • Next.js

解決策

普通に # だけをパーセントエンコーディングしてリンクを生成したところ、 next dev で実行する際はうまくいったが、 next export してデプロイするとアクセスできない。
実際に Next.js が出力した html を見てみると ファイル名の # が html のファイル名の時点で %25 に変換されていた。
https://github.com/wat-aro/wat-aro.github.io/blob/47a30b9d9a1d03154b7934bfde91f3809b2006cc/posts/Array%2523slice.html

アクセスする際のリンクが /posts/Array%25slice だとうまくいかないのはこのせいだった。
html 自体が /posts/Array%25slice に配置されているので、ここへアクセスするためには %25 をさらにパーセントエンコーディングしないといけない。
URL を生成する際に #%2325 に変換すると next export した際にきちんと動くようになった 😄

しかし、 next dev ではうごかない。
next export -> # が変換された html にアクセス
next dev -> # を変換していない html にアクセス
という具合の挙動になっていそう。
exportdev でファイル名が違うため環境によって分岐しないと両方で表示できるようにはならない。

# が入らないように調整するのが一番よさそうですね。


© 2022 wat-aro