さくらインターネット

WordPressで構築されているサイトが突然トップページしか表示されなくなってしまったという不具合の解決策は「.htaccess」の見直しから

この記事は約7分で読めます。

sslwww22553478.jpg中小機構の経営相談窓口で「WordPressで構築されているサイトが突然トップページしか表示されなくなってしまった」という不具合の相談がありました。確認してみると確かにそのとおりで、どの内部ページやリンクをURLで表示させようとしてもトップページしか開きません。404エラー表示ではないので、なんらかのリダイレクト処理が働いてトップページを表示させているような挙動です。
この不具合解決がなかなかやっかいでしたので、備忘録をかねて紹介しておきます。

ワードプレスの不具合

起きている問題はトップページしか表示されないこと

起きている現象は、そのサイトのどのページを表示させようとしてもトップページしか表示されないことです。内部のページを見ることがまったくできません。404エラーの表示もなく、ブラウザのアドレス欄もトップページが表示されているのでなんらかのリダイレクト処理が働いているようです。

この問題がみつかったのは6月29日だということでした。サーバの状況をファイルマネージャで調べてみると、6月29日に更新されているファイルやフォルダがいくつかありました。ほとんどがWordPress関連のアップデートで、とくに複数のプラグインが更新されていました。

この直後からトップページしか表示されないという現象が起きたようです。

なお、レンタルサーバはさくらインターネットでperlもPHPも適正バージョンで、WordPressのバージョンは最新バージョンになっていました。

想定される原因

見かけ上の問題があまり見当たらない状況なので、原因追求が難しかったです。

このように突然トップページが見られなくなるという不具合が起きた原因を想定すると以下のような項目があげられます。

・「.htaccess」の設定に不具合がある
・WordPressのindex.phpやwp-config.phpなどファイル記述に問題がある
・SSL設定のプラグインが不具合を起こしている
・リダイレクションなど301リダイレクトを行うプラグインになんらかの不具合がある
・その他のWordPressのプラグインになんからの不具合がある
・さくらインターネットのサーバ設定になんらかの不具合がある
・上記の要素の複合的な組み合わせで不具合がおきた

この手の問題はほとんどが「.htaccess」の内容に原因があることが多いです。

今回は、上記の複合的な要因の組み合わせで起きた不具合でした

原因はやはり「.htaccess」にありました

主要な原因はやはり「.htaccess」でした。

ただし、今回は「.htaccess」は5年前の2017年のタイムスタンプのままで、今回の各種ファイルのアップデートでは更新されていませんでした。

では、なぜこれまで正常に稼働していた「.htaccess」が突然に不具合の原因になったのか。これが問題ですね。

実は、この設定をした2017年当時のさくらインターネットでは、SSL表示をするための設定が特殊でした。SSL表示をするための専用のプラグインを使ったり、「.htaccess」を改変したりして、SSLで独自ドメインの表示をしていました。

その「.htaccess」はこれです。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://*******.co.jp/$1 [R=301,L] </IfModule>

# BEGIN WordPress
# “BEGIN WordPress” から “END WordPress” までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase /
RewriteRule ^index\.php$ – [L] RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L] </IfModule>

# END WordPress

上記の https://*******.co.jp の部分は独自ドメインになっています。

RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://*******.co.jp/$1 [R=301,L]

という部分は、SSL表示(https)を確実に行うために記述されていましたが、どうもこれがすべてのページをトップページにリライトしてしまうような挙動になってしまったようです。

特殊な設定はX-Sakura-Forwarded-For

X-Sakura-Forwarded-Forという環境変数は、他のレンタルサーバではあまり見慣れない特殊な記述方法です。この記述方法が根本的な不具合を起こす要因をはらんでいたのでしょうね。2017年当時はこのような記述をすることで無理やりSSL表示をしていたようです。

これまでは、他のプラグインとかサーバ設定とかの、合わせ技で稼働していたのでしょうが、今回のアップデートでその合わせ技が効かなくなって、不具合が前面にでてきたのではないかと思われます。

対策は「.htaccess」と「さくらインターネットのドメイン設定」を見直しすること

「.htaccess」を以下のように修正しました。

# BEGIN WordPress
# “BEGIN WordPress” から “END WordPress” までのディレクティブ (行) は
# 動的に生成され、WordPress フィルターによってのみ修正が可能です。
# これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* – [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase /
RewriteRule ^index\.php$ – [L] RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L] </IfModule>

# END WordPress

要は、
特殊な設定であるX-Sakura-Forwarded-Forに関連する部分を削除したわけです。

特殊な設定X-Sakura-Forwarded-Forの部分を削除

具体的には

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Sakura-Forwarded-For} ^$
RewriteRule ^(.*)$ https://*******.co.jp/$1 [R=301,L] </IfModule>

という部分をまるごと削除しました。

この処理で表示の不具合はなくなりました。

しかし、SSLである「https」のページにリダイレクトさせるという処理ができなくなっています。
そこで、SSLのみを表示するための別の方法を実施します。

さくらインターネットのドメイン設定を見直す

そして、さくらインターネットのサーバーコントロールパネルで、https転送とwww転送の設定を以下のように修正しました。

sakuradomainsettingsslhtaccess.jpg

HTTPS転送設定 → HTTPSに転送する

www.転送設定 → ******.co.jp に転送する

ということですね。

この2つの処理を行うことで不具合が解消しました。

まとめ

今回の不具合の原因は、これまでなんとか稼働していた「.htaccess」に問題がはらんでいました。

X-Sakura-Forwarded-Forという環境変数は、さくらインターネット独自の設定仕様のようで、今でもこの記述をしていると問題が表面化して同様の症状をひき起こす可能性があります。

このような独自の呪文のような設定は経年変化であとあと不具合が表面化することがあるということです。要注意ですね。

同様の設定をしているサイトは「.htaccess」を見直したほうがいいかもしれません。