WordPressのサイトを運営していると、時々エラーメッセージが表示されることがあります。
その中でも、以下のようなメッセージが出たことはありませんか?
この記事では、同じ症状に困っている人のために、わたしが調べたこととわかったことを詳しく説明していきます。
このエラーが何を意味するのか、どうやって解決できるのか、ぜひ参考にしてください。
canonical.php のエラー
ある日、自分のサイトの上部に、このようなエラーが表示されていることに気が付きました。
「/page/1」にアクセスするとエラーが出る
自分なりに調べた結果、このエラーは「/page/1」にアクセスした時に出ることがわかりました。
通常、「/page/1」にアクセスすると、サイトのトップページにリダイレクトされますが、何らかの原因で、その処理がうまく行っていないようです。
自分のサイトだけじゃない
このエラーをGoogleで検索すると、同じ問題を抱えたサイトがたくさん見つかります。
/public_html/wp-includes/canonical.php on line 594
/public_html/wp-includes/canonical.php on line 606
最後の3桁の番号は、入っているプラグインなどで変わるようですが、どれも同じエラーです。
検索結果に出てくるサイトにはどれも共通点があって、ページのURLが「/page/1」や「&paged=1」になっていました。
エラーが出る条件
このエラーが出る条件は、PHP8以上で、末尾にスラッシュがないことです。
PHPを8に上げるとエラーが出る
わたしはこのエラーが出る前に、PHPのバージョンを7.4.33から、8.1.22に変更していました。
PHPを再び7.4.33に戻すと、エラーが出なくなったので、とりあえずの原因はPHPのバージョンを8に上げたことで間違いありません。
末尾にスラッシュがない
PHPを8に上げた以外にも原因はあります。それはパーマリンクの設定です。
パーマリンク設定で、末尾の「/」がないと、このエラーが出ます。
わたしは「投稿名(%postname%)」で、末尾にスラッシュを入れていませんでした。
しかし、
このように末尾にスラッシュを入れて、「/page/1」にアクセスすれば、ちゃんとトップページにリダイレクトされ、エラーが表示されなくなります。
WordPressの新規インストールを試す
より詳しい原因を探るため、使っていなかったドメインを使って、新規でデータベースとWordPressをインストールしました。
まっさらな状態で、PHPを8.1.22に、パーマリンクを「/%postname%」に設定し、「/page/1」にアクセスしたところ、やはり、PHPエラーが出てしまいました。
この結果から、PHPのバージョンを8に上げたことと、末尾のスラッシュがないことが直接的な原因であることが確認できました。
「末尾スラッシュなし」はすべてエラーになる
パーマリンクの設定をすべて試したところ、末尾にスラッシュがないパーマリンクは、すべてPHPエラーが出ました。逆にスラッシュがあればエラーは出ません。
あとは「.html」でもエラーが出ました。ただし、基本の「/?p=123」は、404ページが表示されて、PHPエラーは出ませんでした。
対処法
このエラーの対処法としては、以下のような方法が考えられます。
1.何もしない
普段のサイトの表示には問題ないので、何もしないで修正を待つのもありです。
ただし、随分前からある不具合のようなので、いつ直るかわかりませんし、このままずっと直らない可能性もあります。
また、検索結果にエラーページがインデックスされるのは嫌ですよね。
2.PHPを7に戻す
PHPを7.4.33に戻せば大丈夫ですが、すでにサポートが切れているため、セキュリティ面での不安が残ります。
PHPのサポートが切れているということは、セキュリティ脆弱性の修正が行われないことを意味します。
そのため、攻撃者によって悪用される可能性があり、セキュリティ上のリスクとなります。
3.リダイレクト設定する
応急処置になりますが、「.htaccess」や「functions.php」で、「/page/1」にアクセスしたときに、301リダイレクトするという方法があります。
詳しいやり方は、こちらのサイトに載っていました。
4.末尾にスラッシュを入れる
わたしは、もうあきらめて末尾にスラッシュを入れました。
WordPressのパーマリンク設定で、「/%postname%」を「/%postname%/」にするだけでOKです。
エックスサーバーの場合、「スラッシュなし」にアクセスすれば、自動で「スラッシュあり」に301リダイレクトしてくれます。
内部リンクも、外部に貼られたリンクも、ちゃんと301リダイレクトされますし、記事の評価も引き継がれます。
サーチコンソールは、最初だけ重複のエラーが出ますが、徐々にスラッシュありに切り替わっていきます。
おわりに
WordPressを使っていて、PHPが8以上で、末尾にスラッシュがなければ、どのサイトでも同じ現象になると思われます。
しかし、ネットで調べてもあまり情報が出ないのは、このエラーに気づいていないのか、まだPHP7を使っているからでしょうか?
パーマリンクの変更は、できれば避けたいです。しかし、現状では根本的な解決策が見つからず、苦肉の策として変更を検討せざるを得ない状況です。
こんなことなら、はじめから末尾にスラッシュを入れて運用すればよかったなと思います。