WAF・functions.php・.htaccessまで徹底解説(実体験ベース)
検証環境:Xserver/WordPress 6.x/PHP 8.1/WP Rocket使用/2025年5月時点の情報です。サーバーやプラグイン環境が異なる場合は手順が変わる可能性があります。
突然ログインできない恐怖
「ある日突然、WordPressにアクセスできなくなった。」
そんな経験ありませんか?
- サイトが真っ白に
- 「Access Denied」の文字だけが表示される
- ログイン画面が出てもパスワードが通らない
- 「500 Internal Server Error」で何も表示されない
- 「403 Forbidden」でアクセス自体を拒否される
私もまさにそんな状態に陥り、冷や汗をかきました。
しかし、ChatGPTを活用することで、専門知識がなくても無事に復旧できたのです。
この記事では、私が実際に体験したトラブルとその解決プロセスを、できるだけわかりやすく共有します。
コードを書かない私が直面する一番のデメリットはこの様なトラブルシューティングです。でも安心してください。今はChatGPTがあります。
私と状況が異なる場合でも、エラー情報をコピペしてそのままChatGPTに貼り付けてください。そうすると、的確な指示が得られます。あとはその通りに作業するだけ。
焦らず、粘り強く解決しましょう。
【最初に確認】あなたの症状はどれ?原因の切り分けフロー
📦 この記事に関連するおすすめ商品(広告)
SHIMANO プレミアムグリス
シマノ純正グリス。ハブ・BB・ペダルの定番メンテに 目安価格:約800〜1,500円
まずはパニックにならず、今の症状を確認してください。症状によって対処法が異なります。
| 症状 | 考えられる原因 | 難易度 |
|---|---|---|
| 画面が真っ白(何も表示されない) | PHPエラー、テーマ・プラグインの不具合、メモリ不足 | ★★☆(初心者でも対応可能な場合あり) |
| 「Access Denied」と表示 | WAF、.htaccess、IP制限、セキュリティプラグイン | ★★☆〜★★★ |
| 「500 Internal Server Error」 | .htaccess破損、PHPエラー、プラグイン競合 | ★★☆ |
| 「403 Forbidden」 | パーミッション不正、WAF、海外アクセス制限 | ★★☆ |
| ログイン画面は出るがID/PWが通らない | パスワード破損、DB接続の問題、Cookieの問題 | ★☆☆〜★★☆ |
| 「データベース接続確立エラー」 | wp-config.phpのDB情報不一致、DB障害 | ★★★(外注推奨の場合あり) |
| リダイレクトループ(何度もリロード) | SSL設定ミス、プラグイン競合、wp_optionsのURL不整合 | ★★☆ |
この記事では主に「Access Denied」+複合原因の実体験を扱いますが、他の症状でも切り分けの考え方は共通です。
トラブル状況:ログインできない+トップページも表示されない
- 管理画面(wp-login.php)は開くが、ログインできない
- 正しいID・パスワードでも「Access Denied」
- トップページにアクセスしても同じく「Access Denied」
まるで、WordPressそのものがサーバーにブロックされたかのような状態でした。
ちなみに「Access Denied」が出る原因は1つではありません。以下のどれかに該当している可能性があります:
- WAF(Web Application Firewall)が誤検知でブロック
- .htaccessのIP制限やリダイレクトルールの誤設定
- セキュリティプラグイン(Wordfence、SiteGuard WP Plugin等)によるロックアウト
- サーバー側のブルートフォース攻撃対策によるIP一時ブロック
- 海外アクセス制限の設定(Xserverでは管理画面への海外IPブロックがデフォルトON)
- ファイルパーミッションの異常
私の場合は、これらのうち複数が同時に発生しているという厄介なケースでした。
原因は複合的:WAF設定・.htaccess・index.php・functions.php
📦 この記事に関連するおすすめ商品(広告)
FINISH LINE チェーンルブ ドライ
汚れにくいドライタイプ。街乗り・通勤に人気 目安価格:約1,000〜1,500円
以下の複数要因が絡んでいました:
| 要素 | 問題内容 |
|---|---|
| WAF設定(PHP対策) | サーバー側の自動ブロック発動 |
| .htaccess | WP Rocketの記述との競合、ルール不整合 |
| index.php | パーミッションが「000」で読み取り不可 |
| functions.php | パスワード変更用の救出コードが残ったまま |
これだけの原因が重なるのは珍しいケースですが、実際に起こりうるということを知っておくだけでも、パニックにならずに済みます。他の上位記事では「原因は1つ」の前提で解説されていることが多いのですが、現実は複合的なことも少なくありません。
index.phpのパーミッションが「000」になっていた原因については、セキュリティプラグインの自動処理やサーバー側の保護機能が作動した可能性が考えられます。心当たりがない場合は、復旧後にサーバーのアクセスログやセキュリティプラグインのログを確認してみてください。
復旧手順:ひとつずつ順番に対応
⚠️ 作業前の最重要ルール:これから編集するファイル(.htaccess、functions.php、index.phpなど)は、必ず変更前にローカルPCへダウンロード保存してください。失敗しても元に戻せるようにするためです。
復旧にかかった時間の目安は約2〜3時間(ChatGPTとやりとりしながら)。焦らず進めれば大丈夫です。
Step 1:functions.phpで仮管理者ユーザーを追加
FTPまたはXserverファイルマネージャーで、/wp-content/themes/使用中のテーマ/functions.php を開き、以下コードを追加:
wp_create_user('仮ユーザー名', '強力なパスワード');
$user = get_user_by('login', '仮ユーザー名');
$user->set_role('administrator');
➡️ サイトにアクセスすると、自動的に管理者権限の仮ユーザーが作成されます。
⚠️ 注意点:
- functions.phpを編集する際は子テーマのfunctions.phpを使うのがベストです(親テーマだとテーマ更新時に消えるリスクがある)
- この方法が不安な場合は、phpMyAdmin経由でユーザーを追加する代替手段もあります(Xserverのサーバーパネル →「phpmyadmin」→ wp_usersテーブルにINSERT)
- コードの記述ミス(閉じタグの欠落、全角スペース混入など)があると「重大なエラーが発生しました」と表示されサイトが真っ白になります。必ず編集前のファイルをバックアップ保存してから作業してください
Step 2:WordPressにログイン → 本来のユーザー修復
仮ユーザーでログインし、本来使っていた管理ユーザー(例:ZUNAI)のパスワードを再設定します。
仮ユーザーは不要なら削除、または権限を下げましょう。
Step 3:functions.phpの救出コードを必ず削除
仮ユーザー作成コードを削除しないと、セキュリティホールになります。
ログイン成功後はすぐに削除を!
🔴 これは絶対に忘れないでください。コードが残ったままだと、第三者がそのユーザー名とパスワードでログインできてしまいます。実際に「削除し忘れて数日間放置してしまった」という失敗例もあります。復旧直後、最優先で削除してください。
Step 4:.htaccessをWordPressデフォルト構成に修正
必要なのは、これだけ👇
# BEGIN 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
ポイント:
- BEGIN/END WordPressのセットは必ず1つだけ
- WP Rocketなどのキャッシュ記述との重複禁止
.htaccessのトラブルを引き起こしやすいプラグイン例:
| プラグイン | .htaccessに追記する内容 | 競合時の症状 |
|---|---|---|
| WP Rocket | キャッシュ・圧縮・ブラウザキャッシュ関連のルール | リダイレクトループ、表示崩れ |
| Wordfence | ファイアウォール・IP制限ルール | 403エラー、Access Denied |
| SiteGuard WP Plugin | ログインURL変更・管理ページ制限 | ログインページが見つからない |
| Redirection | リダイレクトルール | 無限リダイレクト |
復旧時はまずデフォルト構成に戻し、プラグインを1つずつ有効化して.htaccessの記述が正しく追加されるか確認するのが安全です。.htaccessを変更する前は必ずバックアップを取る習慣をつけましょう。
Step 5:index.phpのパーミッション修正
FTPまたはファイルマネージャーで、
index.php のパーミッションを「644」に設定し直します。
これで読み取り・実行が正しくできるようになります。
WordPress主要ファイル・ディレクトリの正しいパーミッション一覧:
| 対象 | 推奨パーミッション | 備考 |
|---|---|---|
| ディレクトリ全般 | 755 | |
| ファイル全般 | 644 | |
| wp-config.php | 400 または 600 | DB情報が含まれるため厳しめに |
| .htaccess | 644 | |
| wp-content/uploads | 755 | 画像アップロード用 |
⚠️ 絶対にやってはいけないこと:パーミッションを「777」に設定すること。一時的に表示は回復しますが、誰でも書き換え可能な状態になり、改ざんやマルウェア設置のリスクが極めて高くなります。
Step 6:WAF(PHP対策)を一時OFF → 復旧後再ON
Xserverの「WAF(PHP対策)」を一時的にOFFにして復旧作業を実施。
その後、復旧後は必ずWAFをONに戻してセキュリティを確保!
Xserverでの操作手順:
- Xserverサーバーパネルにログイン
- 「セキュリティ」→「WAF設定」をクリック
- 対象ドメインを選択
- 各項目(XSS対策、SQL対策、ファイル対策、メール対策、コマンド対策、PHP対策)を確認
- 復旧作業中は「PHP対策」をOFFに変更(※反映まで最大1時間かかる場合あり)
- 復旧が完了したらすぐにONに戻す
⚠️ WAFをOFFにしている間はセキュリティが低下します。作業時間を最小限に抑え、OFFにしたことを忘れないようスマホのリマインダーやタイマーを設定しておくことをおすすめします。
主要レンタルサーバー別のWAF設定場所:
| サーバー | WAF設定の場所 |
|---|---|
| Xserver | サーバーパネル →「セキュリティ」→「WAF設定」 |
| ConoHa WING | コントロールパネル →「サイト管理」→「サイトセキュリティ」→「WAF」 |
| ロリポップ | ユーザー専用ページ →「セキュリティ」→「WAF設定」 |
| さくらインターネット | コントロールパネル →「セキュリティ」→「WAF」(対応プランのみ) |
| mixhost | cPanel →「ModSecurity」 |
ChatGPTを活用するコツ:エラー情報の伝え方
この記事の復旧プロセスでは、ChatGPTに何度も助けてもらいました。ただし、「サイトが見れません、助けて」だけでは的確な回答は得られません。以下の情報を伝えると、精度の高い指示がもらえます。
ChatGPTに伝えるべき情報チェックリスト:
- ☑ エラーメッセージの全文(画面に表示されている文字をそのままコピペ)
- ☑ レンタルサーバー名(Xserver、ConoHa WING等)
- ☑ WordPressのバージョン(わかれば)
- ☑ PHPのバージョン(サーバーパネルで確認可能)
- ☑ 使用テーマ名
- ☑ 直前にやった作業(プラグイン追加、テーマ更新、コード編集など)
- ☑ 使用中のプラグイン一覧(覚えている範囲で)
- ☑ いつから発生したか
⚠️ ChatGPTの回答を検証するポイント:
- 提示されたファイルパスが自分のサーバー環境と合っているか確認する
- WordPressやPHPのバージョンによって手順が異なる場合がある(特にPHP 8.x系では非推奨関数のエラーが出やすい)
- 複数の手順を一度に実行せず、1つ試す→結果を確認→次へ進むのサイクルを守る
- 判断に迷ったら「この手順を実行するリスクは?」とChatGPTに追加質問する
復旧後にやっておくべき安全対策リスト
✅ 定期バックアップ環境の整備(プラグイン&外部ストレージ)
✅ WAFの項目ごとのON/OFF検証と記録
✅ 不要な仮ユーザー・不要コードの完全削除
✅ .htaccessの記述を定期的にチェック
✅ 2段階認証・ログイン通知機能の導入
さらに以下も忘れずに:
✅ 全ユーザーのパスワードを変更(不正アクセスの可能性を排除)
✅ マルウェアスキャンの実施(Wordfenceの無料スキャンなど)
✅ サーバーのアクセスログ・エラーログを確認(改ざんの痕跡がないか)
✅ WordPress・テーマ・プラグインをすべて最新版にアップデート
✅ ブラウザキャッシュ・サーバーキャッシュをクリアして復旧を正しく確認
実際の失敗から学んだこと
functions.phpを何度も修正する中で、小さなミスをして
「このサイトで重大なエラーが発生しました」
と表示され、サイトごと真っ白になったこともありました。
そのたびにFTPで復元し、冷静にやり直す。
一歩ずつ、諦めずに進めば、必ず復旧できる。
今回、身をもって実感しました。
やりがちな失敗パターンと対策も共有しておきます:
| 失敗パターン | 何が起きるか | 対策 |
|---|---|---|
| バックアップなしでファイルを上書き | 元に戻せなくなる | 編集前に必ずローカルにダウンロード保存 |
| プラグインフォルダを丸ごと削除 | 設定が全消失、有料プラグインは再認証が必要に | フォルダ名をリネーム(例:plugins → plugins_bak)で無効化 |
| WAFをOFFにしたまま放置 | 数日間無防備状態に | スマホのリマインダーで「WAFをONに戻す」を設定 |
| キャッシュが残っていて復旧確認できない | 修正したのに表示が変わらず、さらに別の修正をして悪化 | ブラウザのシークレットモードで確認、サーバーキャッシュもクリア |
| パーミッションを777に設定 | 一時的に直るがセキュリティリスクが極大化 | 上記のパーミッション一覧表を参照して正しい値に設定 |
なお、WordPress 5.2以降には「リカバリーモード」機能が搭載されています。致命的なエラーが発生すると、管理者メールアドレスにリカバリーモードへのリンクが送信されます。メールが届いていないか必ず確認してみてください。
自力で直せるか?外注すべきか?判断基準
すべてのトラブルを自力で解決する必要はありません。以下を目安に判断してください。
| 状況 | 判断 |
|---|---|
| プラグイン無効化・テーマ変更で直る | ✅ 自力対応OK |
| .htaccessの修正・パーミッション変更 | ✅ ChatGPTと一緒に対応可能 |
| WAFの設定変更 | ✅ サーバーパネルで対応可能 |
| データベースの修復が必要 | ⚠️ phpMyAdminの操作に不安があれば外注推奨 |
| ファイルが改ざんされている疑いがある | 🔴 セキュリティ専門家に依頼すべき |
| バックアップがなく、復元手段が不明 | 🔴 サーバー会社に問い合わせ + プロに依頼 |
外注する場合の相場目安:WordPress復旧作業は、クラウドワークスやココナラで5,000円〜30,000円程度が相場です(2025年時点)。データベース修復やマルウェア除去を含む場合は50,000円以上になることもあります。
サーバー会社への問い合わせテンプレート:
「お世話になっております。ドメイン名「〇〇.com」にて、〇月〇日頃からサイトにアクセスすると「Access Denied」と表示されログインも不可能な状態です。WAF設定・.htaccess・パーミッションを確認しましたが改善しません。サーバー側のログやブロック設定に問題がないかご確認いただけますでしょうか。」
まとめ
今回の一連のトラブルは、数年前ならクラウドワークスなどで外注依頼していたかもしれません。
しかし、今は正しい情報と、ChatGPTのようなAIサポートがあれば、
自分で復旧できる時代です。
ただし、AIの回答を鵜呑みにせず「1つずつ試して確認する」姿勢と、「バックアップを取ってから作業する」基本を守ることが大前提です。それさえ守れば、コードを書けない人間でもサーバートラブルは乗り越えられます。
この記事が、同じように困っている誰かの役に立てば嬉しいです。
この記事の手順が当てはまる人:
- Xserver(または同等のレンタルサーバー)でWordPressを運営している
- WP Rocketなどキャッシュプラグインを使用している
- FTPまたはファイルマネージャーの基本操作ができる(またはChatGPTに聞きながら操作できる)
- 「Access Denied」や画面真っ白の状態で困っている
この記事の手順だけでは解決しにくいケース:
- データベース自体が破損している場合
- WordPress本体のコアファイルが改ざんされている場合
- サーバー会社側の障害が原因の場合(→ サーバー会社の障害情報ページを確認)
- バックアップが一切ない状態で複数ファイルが破損している場合
まとめ
WordPressで「Access Denied」エラーが発生した場合、WAF設定・.htaccess・index.php・functions.phpなど複数の原因が同時に絡んでいることがあります。焦らずに一つずつ切り分けて対処することが復旧への近道です。作業前には必ず対象ファイルのバックアップを取り、ChatGPTを活用すればコードの知識がなくても的確な指示を得ながら復旧作業を進められます。復旧後はセキュリティ対策の見直しと定期的なバックアップ体制の構築を忘れずに行いましょう。
よくある質問
Q. Access Deniedエラーが出たとき、最初に何を確認すべきですか?
まずはサーバーのWAF(Web Application Firewall)設定を確認してください。XserverなどではWAFが誤検知でアクセスをブロックしていることが多いため、サーバーパネルからWAFを一時的にOFFにして改善するか試してみましょう。それでも解決しない場合は.htaccessやセキュリティプラグインの設定を順番に確認していきます。
Q. functions.phpに追加した救出コードは復旧後どうすればいいですか?
復旧が完了したら必ず削除してください。仮管理者ユーザー追加やパスワード変更用のコードを残したままにすると、セキュリティ上の重大なリスクになります。FTPやファイルマネージャーからfunctions.phpを開き、追加した部分を完全に削除してから保存しましょう。
Q. 自分で復旧できるか、専門家に依頼すべきか判断する基準は?
FTPやサーバーパネルの基本操作ができ、ChatGPTなどを活用してエラー内容を調べながら作業できる方は自力復旧を試す価値があります。一方で、データベース接続エラーや原因が全く特定できない場合、バックアップがない状態で不安が大きい場合は、早めに専門家やサーバーサポートへ相談することをおすすめします。







