記事リダイレクトでの記事ID(フラグメント識別子)の扱い

はてなブログからはてなダイアリーをインポートすると記事URLのリダイレクトが設定できるのだが、ここで疑問が1つ出てきた。

はてなダイアリーブログモードができる前は個別記事のURLは例えば http://d.hatena.ne.jp/rna/20050505#p1 のように {日付URL}#{記事ID} の形式になっていた。このようなURLでもちゃんと記事に「リダイレクト」してくれるだろうか?

この場合、記事IDはフラグメント識別子(fragment identifier)なので通常のリダイレクトでは処理されずブラウザにそのまま渡されてブラウザ側に処理が委ねられる。通常は当該IDのある要素の位置にスクロールするが、ページ内の JavaScriptフラグメント識別子を検知して独自の処理を行うものもある。

ということで、既にはてなブログに移行してリダイレクト設定をしている人のブログで試してみた。試してみたのは飯田泰之さんのブログ。たまたま過去記事に旧形式のURLで参照するリンクがあったので… 飯田さん失礼します!

上のリンクを辿ってみると以下のことがわかる(Firefox 61.0.1 で確認)。

これはちょっと不満。古いリンクをジャンプすると「シンポジウム生中継」(記事ID p1 の記事)の方が見えてしまってリンクの張り間違いかと思ってしまう。

開発ツールで確認すると、ブラウザが日付URLで要求して301で当該日付の記事を列挙したページを返して、それをブラウザが開いている。Firefox の場合リダイレクト後のページの document.location.hash に元のフラグメント識別子を付けてくれるようだが、付けてくれないブラウザもあるらしい。*1

しかし今時のブラウザでは付けてくれるのだから、付いていたらスクロールする、ぐらいのことはやってもらえるとありがたいのだが。というか、記事IDを見出しのid属性に設定したらブラウザが勝手にスクロールしてくれないかな?

*1:Safari5とIE9まででは付けてくれないらしい。参照: https://code.i-harness.com/ja/q/22e342