Hugoで301リダイレクトはやっぱりhtaccess

テクニック
記事内に広告が含まれています。

WordPressからHugoに乗り換える場合、以前のパーマリンク(permalink)を保持したいですよね。特にアクセスがそれなりにあってGoogleの検索結果も上位の時は尚更です。

HugoのURLフロントマター

HugoのFrontMatterには、URLが指定できます。すると、リダイレクトできるように新たにHTMLを作ってくれます。但し、これがrefreshなんですよ。

<meta http-equiv="refresh" content="0; url=https://example.org/posts/new-file-name/">

リダイレクトにはしてくれますが、Google検索エンジンは推奨していません。上記だと0秒で指定のURLへ切り替えてくれます。

加えて、仮にドメイン/スラッグのURLだった場合、Public_HTML直下にフォルダ/ファイルを作成してしまい一覧性が良くありません。
間に日付けやカテゴリ系があってなら、思うように指定できると思います。

△ https://settrigger.jp/slug
○ https://settrigger.jp/topics/slug

ファイル構成として、post以下に納めたかったこともあり、リダイレクトはやはり.htaccessで設定するしかないな、という結論に達しました。

試行錯誤したのですけど、ディレクトリ構成がめちゃめちゃになる方が面倒に思えたためです。設定方法によっては上手く行くかも知れません。ファイルが増えて面倒に思いました。

htaccessで301リダイレクト転送

サーバーによって多少異なるかも知れません。エックスサーバーで説明します。

Apache2.4移行だとディレクティブで書くようになりました。以前の形式でも動作するならそれでも良いでしょう。

Redirect permanent〜を使う

例えば、このサイト例だと次のように書けます。

Redirect permanent /pp https://settrigger.jp/privacy-policy/

数が少ないなら、これをズラッと書けば済みます。

ディレクティブと正規表現

ディレクティブなら、正規表現を使って書きます。

# 301Redirect
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^blogging/wordpress/973$ /posts/wp-plugin8/ [R=301,L]
</IfModule>

こんな感じになり、簡単に言えば、^が先頭で$が末として、その間に以前までのURLを記載しています。
スペースを空けて、新しいURLを記載、またスペースを空けて[R=301,L]とします。

私の場合、20〜30個だったので、まぁ、どちらでも良かったです。
決まった形式であれば、元URLが必ず年月だったりカテゴリー名など、それも正規表現で記載することになります。すると1行で済みます。(ここでは省略します)

今回はあまり数が多くないURLのリダイレクトです。一応、他もディレクティブで記載していることもあり、RewriteRuleを使いました。

リダイレクトのテスト

簡単に確かめるには、古いURLを入力してみれば分かります。一瞬で新しいURLに転送し、ちゃんと希望のページが表示されれば成功です。

404エラーなどの場合は、正規表現の書き方が違っているのでしょう。

先の場合、”RewriteBase /”なので、RewriteRule冒頭のスラッシュは要りません。(^/ではなく^で良い)

文字・改行コードなど注意

エディタで修正したりすると、文字コードや改行コードのケアレスミスも発生します。
エックスサーバーにはhtaccessの編集画面が用意されていますので、そちらからの方が無難でしょう。念のため、修正する前にはhtaccessのバックアップを取ることをオススメします。

あと、htaccessは最後の行は空行にする改行が必要です。

やっておいた方がいい

このサイトは特にドメインパワーもなく、アクセスも少ないため、301リダイレクトしなくてもデメリットはあまりありません。

だとしても、引き継いでくれた方が嬉しいですよね。少ないとはいえ、せっかく検索されているページもあるわけですから。

FrontmatterのURLは使いこなせていません。より良い方法があるかも知れませんが、今回は通常の手法(htaccess)で対応しました。