この記事をおすすめしたい人
- 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編の目次
- 第1回 モジュール組み込みと動作確認
- 第2回 AMPページのcanonical設定(このページ)
- 第3回 AMP Optimizerの導入