Nuxt.js初心者がAMPに挑戦!AMPページのcanonicalを正しく設定(自動と手動)

シェアする:

この記事をおすすめしたい人

  • WordPressしか知らないのにNuxt.jsを始めようとしてる人
  • Nuxt.jsでAMP対応したい人
  • つまりオレ

何も知らない超初心者が脱WordPressしたくてNuxt.jsでサイト構築していくシリーズです。

前回の記事で「@nuxtjs/amp」というNuxt.jsのAMP用モジュールを組み込んでみました。

この記事執筆時点であらかたテストは終えていて、このモジュールが素晴らし過ぎるのは知っているのですが、とりあえず導入しただけでは「canonicalが未設定」というエラーが出ました。

AMPは文法エラーがあるとGoogleがAMPとしては扱ってくれません。

なので今回はAMP用のcanonicalを設定するお話をしたいと思います。

WordPressの上でな!

※ このブログはWordPress製です

通常のcanonicalと何が違うのか

canonicalは「正規の」という意味で、検索エンジン他に「このページの正しいURL」を伝える手段です。

そんなもん、アクセスしてるURLが正しいURLやろが。

とは思うんですが、同じページが表示できるURLにはいくつかパターンが考えられます。

  • https://○○○.com/
  • https://○○○.com
  • https://○○○.com/index.html
  • https://○○○.com/index.htm
  • https://○○○.com/index.php
  • https://○○○.com/index.cgi
  • https://○○○.com/?mode=type1

などなど。

僅かにでもURLが違っていると検索エンジンは別ページとして認識するらしく、どんなアクセスのされ方をしても正しいURLを伝えてあげましょうというのがcanonicalです。

これに対し、AMPのcanonicalはちょっと意味が違います。

https://○○○.com/ (通常ページ)
https://○○○.com/amp/ (AMP版)

ハイブリッドAMPの場合、この↑ような形でAMP版のURLが生成されます。

これらは「ただのHTML」と「AMP HTML」という違いがあるだけで、中身は同じものです。

このままだと検索エンジンに「同じ内容のページが2つあるので減点!」みたいなことになります。

これを防ぐために、AMP版のcanonicalに「通常ページのURL(https://○○○.com/)」を設定しておきましょう、というのが今回のテーマです。

いきなり結論、モジュールオプションで解決

@nuxtjs/ampのマニュアルの中に何やらそれっぽいものを見つけました。

「origin」の項目です。 canonicalを追加するとかなんとかそんなことが書いてあります。

これはモジュールのオプションだそうなので、こちらの書き方に習って「nuxt.config.js」にオプションを追加してみます。
(僕はモジュールのオプション設定自体が初です)


export default {
  modules: [
    '@nuxtjs/amp',
  ],
  amp: {
    origin: 'https://dev.ore-shika.com',
  },
}

たったこれだけでcanonical問題が解決しました。 AMP Validatorのエラーもありません。


<link data-n-head="ssr" rel="canonical" data-hid="canonical" href="https://dev.ore-shika.com/">

hidの指定があるので重複も大丈夫そうです。

注意点として。

URL指定「https://dev.ore-shika.com」の末尾にスラッシュがありませんが、これは内部的に連結しているであろう「this.$route.path」という変数がスラッシュから始まるからです。 なのでスラッシュをつけると「//」となってしまいます。

詳しい原理はcanonicalの記事を読んでみてください。

AMPオンリーモードでの動作も確認

通常ページと別URLでAMP版を生成するハイブリッドではなく、両者を1本化してしまうフルAMP?AMPオンリー?モードでの動作も確認しました。

問題なくcanonicalが出力されています。

ただ、何故か以前のAMPページ(/amp/)へも変わらずアクセスができます。

一見問題はありませんが、オンリーモードにすると「/amp/」のページのcanonicalが通常ページではなくAMPページのもの(/amp/)になっていました。 GoogleにURLが見つけられた場合にはページの重複になってしまうかもしれません。

念のため「false」モードでも動作を確認

ハイブリッドでもオンリーでもない「false」モードです。

要はAMP無効化ということなんでしょう。

この場合、AMPだけを無効化というかモジュール自体が無効になっているのか、canonicalが出力されませんでした。

あえて手動でcanonicalを追加する

自分でcanonicalを設定する場合は「nuxt.config.js」に次のコードを追加します。


<script>

export default {
  head () {
    return {
      link: [
        { rel: 'canonical', href: (トップページのURL) + `${this.$route.path}` },
      ],
    }
  },
}

</script>

「head () {」以下をそのまま追加してしまうと既存のheadプロパティの設定が破棄されてしまうので、よく分からない人はcanonicalの記事を読んでください。

これを設定するとこの↓ような結果になりました。

https://dev.ore-shika.com/ (通常ページのcanonical)
https://dev.ore-shika.com/amp/ (AMP版のcanonical)

AMP版のcanonicalは「https://dev.ore-shika.com/」になってもらわないと困るので、コードを書き換えていきます。

たぶんJavaScriptが分かる人は余裕で書けるコードだと思いますが、

オレはJavaScriptがほとんど分からん!

ので、くどい書き方だったりスマートではない書き方になっている可能性大です。

えー、まず、この「head () {」という書き方。

headメソッド」という書き方だそうで、名前の通り関数みたいな格好になっています。

どうやらreturn前に処理を挟めるみたいなので、そこでURL末尾の「/amp/」を削ります。


<script>

export default {
  head () {
    //現在のページの相対パスを取得
    var path = this.$route.path
    //正規表現で末尾の「/amp/」を「/」に置換
    path = path.replace(/\/amp\/$/g, '/')
    
    return {
      link: [
        { rel: 'canonical', href: 'https://dev.ore-shika.com' + path },
      ],
    }
  },
}

</script>

無事に末尾「amp/」が削除されました。

ただ、これだとAMPでないページで末尾「/amp/」の場合も削除されてしまいます。 「そんなページ作らないようにする」ことで防げますが、人間はうっかりするものです。 うっかりしても大丈夫なように対策しておきたい。

なので、ここを参考に「AMPページなら」という条件を追加します。


<script>

export default {
  head () {
    //現在のページの相対パスを取得
    var path = this.$route.path
    //現在のページがAMPなら
    if ( this.$isAMP ) {
      //正規表現で末尾の「/amp/」を「/」に置換
      path = path.replace(/\/amp\/$/g, '/')
    }
    
    return {
      link: [
        { rel: 'canonical', href: 'https://dev.ore-shika.com' + path },
      ],
    }
  },
}

</script>

これまた無事に成功。

ちょっと感動…。

まぁ、

モジュールオプションで解決できるから意味ないんだけどな!

ちなみのこの「this.$isAMP」。 「@nuxtjs/amp」が設定している値だと思うんですが、モジュールを外した状態だと「false」と評価してくれるようです。

後からモジュールを外すようなことがあってもエラーにはならなさそう。 あまりよくはないでしょうが。

まとめ

モジュール「@nuxtjs/amp」のオプションを使えばcanonicalの設定は楽勝でした。


export default {
  modules: [
    '@nuxtjs/amp',
  ],
  amp: {
    origin: 'https://dev.ore-shika.com',
  },
}

ただ、このやり方だと直接URLを受け取れるわけではないので、OGPの「og:url」や今後構造化データを追加する際に手間になりそうです。

手動でのやり方も覚えておいて損はなさそう。

以上、WordPressからお届けしました!

Nuxt.js AMP編の目次

シェアする: