WordPress .htaccess設定の勘所|ルートとサブディレクトリを共存させる安全設計 | UNIX Cafe

当サイトでは、コンテンツの一部に広告を掲載しています。
WordPress .htaccess設定の勘所|ルートとサブディレクトリを共存させる安全設計 | UNIX Cafe

UNIX Cafe | 第101回

目次

はじめに:なぜ .htaccess でつまづくのか

WordPressサイトを運用していると、必ず一度は .htaccess の設定で悩む場面が訪れます。 特に、ルートディレクトリとサブディレクトリに別々のWordPressを設置したり、静的サイトを混在させたりすると、設定ひとつでサイトの動きがガラリと変わってしまいます。

  • 「メニューを押すと404になる」
  • 「リンクが正しく表示されない」
  • 「突然サイトが真っ白(500エラー)になった」

こうしたトラブルの多くは、.htaccess の「継承」という仕組みによるルールの干渉が原因です。 まずは、なぜこの問題が起こるのか、その基本原理から見ていきましょう。

.htaccessの基本原理を理解する

上位設定は下位に継承される

.htaccess には、「上の階層の設定が、下の階層(サブディレクトリ)にも自動的に適用される」という特徴があります。

ルートにある設定は便利ですが、サブディレクトリで別のシステムを動かしている場合、その設定が邪魔をしてしまうのです。

RewriteEngine On は「設定の再起動」

サブディレクトリの .htaccessRewriteEngine On と記述すると、その階層から書き換えルールが新しく始まります。

しかし、これだけではルートディレクトリのルールが完全に無視されるわけではなく、条件によっては意図しないリダイレクトが発生し、「リンクが壊れる」原因になります。

ルート側ルールがサブディレクトリを壊す瞬間

例えば、ルート側で「すべてのアクセスを index.php に送る」という標準的なWordPressの設定をしていると、/subdir/ へのアクセスまでルート側のWordPressが処理しようとしてしまいます。

その結果、サブディレクトリ側のページが正常に表示されなくなります。

ルートとサブディレクトリを共存させる設計

この干渉を防ぐためには、ルート側の設定に「このディレクトリだけは除外する」という条件を加えるのが正解です。

除外条件 RewriteCond の役割

サブディレクトリが /subdir/ の場合、ルートの .htaccess に以下の一行を追加します。

RewriteCond %{REQUEST_URI} !^/subdir/

この一行を入れることで、

/subdir/ 以下のアクセスは、ルート側のルールを適用しない」

という明確な仕切りが生まれます。

【Apache 2.4対応】WordPress共存の基本パターン

以下は、サブディレクトリ(subdir)を除外しつつ、WordPressを安全に動かすための最新の記述例です。

# WordPressの基本設定の開始
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

# 【重要】特定のディレクトリをWordPressのルールから除外
RewriteCond %{REQUEST_URI} !^/subdir/

# 通常のWordPress転送ルール
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

【実録】サーバーログに残る攻撃の痕跡

「うちは小さなサイトだから狙われない」というのは誤解です。実際のサーバーログを見ると、世界中からBot(自動プログラム)による弱点探索が秒単位で行われています。

よく見かける攻撃アクセスの例:

  • POST /wp-login.php (ログイン試行)
  • GET /wp-config.php.bak (バックアップファイルの探索)
  • GET /xmlrpc.php (踏み台攻撃の準備)
  • GET /.env (環境設定ファイルの窃取)

これらはすべて、WordPressやサーバーの弱点を探すBotによるものです。

気付かずに放置すると、サーバー負荷が増大し、最悪の場合はサイトが乗っ取られるリスクもあります。

.htaccess でできる最新のセキュリティ対策

Apache 2.4以降では、従来の Order Allow,Deny よりもシンプルで強力な Require を使用します。

wp-config.php を守る

データベース情報が詰まった最重要ファイルへのアクセスを遮断します。

<Files wp-config.php>
    Require all denied
</Files>

XML-RPC を無効化する

攻撃の踏み台にされやすい xmlrpc.php を使用していない場合は、閉じておくのが鉄則です。

<Files xmlrpc.php>
    Require all denied
</Files>

ディレクトリ一覧表示の禁止

フォルダ内のファイルリストが丸見えになるのを防ぎます。

Options -Indexes

ブラックリスト運用と自動化の考え方

攻撃者はIPアドレスを次々と変えてきます。そのため、特定のIPを拒否する「ブラックリスト」を定期的に更新する仕組みが有効です。

  1. ログ解析:不審なアクセスを特定
  2. IP抽出:短時間に異常な回数のアクセスがあるIPを抽出
  3. 自動反映.htaccess の拒否リスト(Require not ip XXX.XXX...)へ追記

この一連の流れをシェルスクリプトなどで自動化することで、管理者の手を煩わせることなく、サイトの防御力を高め続けることができます。

まとめ:利便性とセキュリティを両立する

.htaccess は非常に強力なツールです。仕組みを正しく理解すれば、複雑なサイト構成でも安全に運用できます。

まずは、

  • 継承の仕組みを意識する
  • 除外ルール(RewriteCond)を適切に配置する
  • Apache 2.4の最新記述(Require)でセキュリティを固める

この3つを意識するだけで、トラブルの多くは防ぐことができます。

小さな積み重ねが、あなたのサイトを予期せぬトラブルと攻撃から守ってくれます。

編集者メモ

  • .htaccess を編集する際は、必ず事前にバックアップを取ってください。万が一サイトが真っ白になった場合は、ファイルを元の状態に戻すか、リネームして無効化すれば復旧します。
  • 自分のIPアドレスを誤ってブロックしないよう、テスト環境で確認することをお勧めします。

さらに学びたいあなたへ

📘 用途ごとに選ぶ Linux のおすすめ本

あわせて読みたい
レベル・用途別おすすめ Linux 本リスト|UNIX Cafe UNIX Cafe | 第65回 Linux の世界には、「はじめて触る人」「コマンドを覚えはじめた人」「サーバーに挑戦したい人」と、さまざまな段階があります。そんなときに、自分...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe 編集部

UNIX Cafe は、むずかしい言葉をできるだけ使わず、物語を読むような気持ちで気軽に学べる場所です。
プログラミングは、アイデアをコンピューターに伝えるための「ことば」。
簡単な単語と文法を覚えることで、誰でもターミナルから便利なコマンドを使えるようになります。
コーヒーを片手に立ち寄るような気持ちで、やさしいプログラミングの世界を、
そっとのぞいてみてください。

目次