WordPressのURLは絶対パスではなく、スラッグさえ正しければリダイレクトされる


この記事は2011年5月に掲載されたものです。
状況が変わったり、リンク先が変わっている可能性があります。

それまで静的なHTMLを書いていた人が、WordPressを使い始めていちばん驚くのが、カノニカルURL(標準URL)ではないかと思う。

これは2007年9月リリースのWordPress 2.3から実装された機能で、様々な記述方法のURLや、スラッグを変更して存在しなくなったURLを、カノニカルURLにリダイレクトしてくれるものだ。301リダイレクトを使っているので、同一コンテンツが検索エンジンに複数URLで登録されることはなく、読者が古いURLでアクセスしても404エラーは表示されない。

WordPressのデフォルトURLは、記事IDが「123」なら

http://example.com/?p=123

だが、これではわかりにくいので、管理画面の「パーマリンク設定」で投稿年月やカテゴリー、投稿名を含むURLに変えるのが一般的だ。例えば、カテゴリーと投稿名によるURLで、拡張子を「.html」に変えるには次のように設定する。

/%category%/%postname%.html

これで記事IDを使ったURLにアクセスしても、このURLにリダイレクトされる。それだけではなく、投稿年月を使ったURLやカテゴリーを間違えたURLでも正しくリダイレクトされる。例えば、2011年1月1日にカテゴリー「aaa」のサブカテゴリー「bbb」に記事「ccc.html」を投稿すると、次のいずれの場合もカノニカルURLにリダイレクトされる。

(カノニカルURL)
http://example.com/aaa/bbb/ccc.html

(正しくリダイレクトされるURL)
http://example.com/aaa/ccc.html ⇒途中が抜けてもOK
http://example.com/bbb/ccc.html ⇒途中が抜けてもOK
http://example.com/2011/01/01/ccc.html
http://example.com/2011/01/ccc.html
http://example.com/2011/ccc.html
http://example.com/01/01/ccc.html
http://example.com/01/ccc.html
http://example.com/xxx/yyy/ccc.html ⇒存在しないカテゴリーでもOK
http://example.com/1234/56/78/ccc.html ⇒存在しない年月日でもOK

要は「ccc.html」さえ正しければいい。静的なHTMLを書いていると、URLは絶対パスを表わし、1文字でも間違えてはいけないので、ここが驚きだった。WordPressで絶対なのは「ccc.html」だけで、URLの途中はどうでもいい。これは「ccc.html」がサイト内でユニークでなければならないことを意味しているので、違うカテゴリーであっても同じ投稿名は付けられない。同一の投稿名にすると、自動的に「ccc-2.html」になる。

ただし、ホスト名に続けて「ccc.html」を入れた場合は404エラーになる。パフォーマンス上の理由で、URLをpostnameのみにすることは非推奨となっており、これは使えないようになっているのだろう。

(正しくリダイレクトされないURL)
http://example.com/ccc.html ⇒404エラー

静的なHTMLだと、サブディレクトリ直下のファイル名はすべて「index.html」にするが、WordPressでは「index.html」が使える投稿はサイト内に一つだけだ。最初は理由がわからなかったが、投稿名がユニークでないといけないためだ。

「index.html」が一つだけの代わりに、URLをスラッシュで止めるとアーカイブを表示するのも、WordPressの特徴だろう。Movable Typeのようにアーカイブ用のページを意識して作成する必要がない。

http://example.com/aaa/bbb/
http://example.com/aaa/
http://example.com/bbb/
http://example.com/2011/01/01/
http://example.com/2011/01/
http://example.com/2011/

これらのアーカイブは「index.html」ではなく、「index.php」を表示している。「パーマリンク設定」で拡張子を「.html」に変えても、URLがスラッシュで終わる場合は「index.php」が動いているわけだ。このため、アーカイブURLはサイト内でユニークになる必要があり、カテゴリーとサブカテゴリーが逆になってもいけない。下記の場合は404エラーになる。

http://example.com/bbb/aaa/ ⇒順番が逆
http://example.com/01/ ⇒月なのか日なのか不明
http://example.com/01/01/ ⇒何年なのか不明

なお、「パーマリンク設定」でURLにカテゴリーを使っていない場合、カテゴリーのアーカイブを表示させるときは、ホスト名の次に「category」を補う必要がある。「category」を補わないと、投稿タイトル(スラッグではなくタイトルそのもの)が「aaa」や「bbb」で始まるものを探して表示しようとする(該当する投稿がなければ404エラー)。

http://example.com/category/aaa/bbb/
http://example.com/category/aaa/
http://example.com/category/bbb/

(「パーマリンク設定」でURLにカテゴリーを使っていない場合に、「category」を補わないときの挙動)
http://example.com/category/aaa/bbb/ ⇒投稿タイトルが「bbb」で始まるものを表示
http://example.com/category/aaa/ ⇒投稿タイトルが「aaa」で始まるものを表示

WordPressでサイト構築するには、こうしたURLの考え方を最初に知っておいたほうがいいだろう。個々の投稿名やアーカイブなどで迷わずに済む。WordPress Codex日本語版「パーマリンクの使い方」を読んでも、こうした全体像は書かれていないのでまとめておく。