
UNIX Cafe | 第101回
はじめに:なぜ .htaccess でつまづくのか
WordPressサイトを運用していると、必ず一度は .htaccess の設定で悩む場面が訪れます。 特に、ルートディレクトリとサブディレクトリに別々のWordPressを設置したり、静的サイトを混在させたりすると、設定ひとつでサイトの動きがガラリと変わってしまいます。
- 「メニューを押すと404になる」
- 「リンクが正しく表示されない」
- 「突然サイトが真っ白(500エラー)になった」
こうしたトラブルの多くは、.htaccess の「継承」という仕組みによるルールの干渉が原因です。 まずは、なぜこの問題が起こるのか、その基本原理から見ていきましょう。
.htaccessの基本原理を理解する
上位設定は下位に継承される
.htaccess には、「上の階層の設定が、下の階層(サブディレクトリ)にも自動的に適用される」という特徴があります。
ルートにある設定は便利ですが、サブディレクトリで別のシステムを動かしている場合、その設定が邪魔をしてしまうのです。
RewriteEngine On は「設定の再起動」
サブディレクトリの .htaccess に RewriteEngine 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を拒否する「ブラックリスト」を定期的に更新する仕組みが有効です。
- ログ解析:不審なアクセスを特定
- IP抽出:短時間に異常な回数のアクセスがあるIPを抽出
- 自動反映:
.htaccessの拒否リスト(Require not ip XXX.XXX...)へ追記
この一連の流れをシェルスクリプトなどで自動化することで、管理者の手を煩わせることなく、サイトの防御力を高め続けることができます。
まとめ:利便性とセキュリティを両立する
.htaccess は非常に強力なツールです。仕組みを正しく理解すれば、複雑なサイト構成でも安全に運用できます。
まずは、
- 継承の仕組みを意識する
- 除外ルール(RewriteCond)を適切に配置する
- Apache 2.4の最新記述(Require)でセキュリティを固める
この3つを意識するだけで、トラブルの多くは防ぐことができます。
小さな積み重ねが、あなたのサイトを予期せぬトラブルと攻撃から守ってくれます。
編集者メモ
.htaccessを編集する際は、必ず事前にバックアップを取ってください。万が一サイトが真っ白になった場合は、ファイルを元の状態に戻すか、リネームして無効化すれば復旧します。- 自分のIPアドレスを誤ってブロックしないよう、テスト環境で確認することをお勧めします。
さらに学びたいあなたへ
📘 用途ごとに選ぶ Linux のおすすめ本

