筆者がWebサイトの防衛に、そして過剰にクロールをするボットを他の場所へとご案内するために用いているmod_aliasのご紹介です。
というのも、筆者がこれから述べる対クローラー迎撃システム「Jailhouse Lock」には、このモジュールが必要だからです。
1. mod_aliasとは何か?
mod_aliasは、リクエストされたURLをファイルシステム上の特定の場所にマッピング(転送・代替)したり、別のURLへリダイレクトしたりするための、Apacheの標準モジュールです。(そのため、多くのディストリビューションではインストールと同時に機能が有効化されています)
主な役割は以下の2つです。
- エイリアス(別名)の設定:
- ドキュメントルート(公開ディレクトリ)の外側にあるフォルダを、あたかも内側にあるかのようにURLに紐付けます。
- 単純なリダイレクト:
- 特定のURLに来たアクセスを、別のURL(別ドメインなど)へ転送します。
代表的なディレクティブ
Alias /images /var/www/shared/images(URLの/imagesを特定のフォルダに対応付ける)Redirect permanent /old.html http://example.com/new.html(永続的な301リダイレクト)
2. mod_rewrite との違い
どちらも「URLを操作する」という意味では同じですが、そのアプローチと内部処理の複雑さに大きな違いがあります。
| 項目 | mod_alias | mod_rewrite |
|---|---|---|
| コンセプト | 単純なマッピングとリダイレクト | 強力なURLカスタマイズと書き換え |
| 判定基準 | 単純な前方一致(接頭辞マッチ) | 正規表現、Cookie、環境変数、時間など |
| 処理速度 | 非常に高速(軽量) | やや低速(ルール毎に正規表現エンジンが動く) |
| 設定の難易度 | 簡単(初心者向け) | 複雑(記述ミスで無限ループが起きやすい) |
| 主な用途 | フォルダの共通化、単純なサイト引っ越し | 綺麗に整形されたURL(Smart URL)の実現、複雑な条件分岐 |
最大の違い:正規表現と条件分岐の有無
mod_aliasは、URLの「先頭が一致しているか」という単純な比較しか行いません。
一方、mod_rewriteは「リクエストがGoogle Chromeから来たら」「平日の昼間なら」「Cookieに特定の文字が含まれていたら」といった、高度な条件分岐(RewriteCond)や、正規表現を使った自由自在なURLの作り替え(RewriteRule)が可能です。
3. mod_aliasが「優れているパターン」
「mod_rewriteがあれば、mod_aliasはいらないのでは?」と思われがちですが、Apache公式も「単純なタスクであれば、mod_rewriteではなくmod_aliasを使うべき」と推奨しています。
mod_aliasを選ぶべき(優れている)具体的なパターンは以下の3つです。
① サーバーのパフォーマンス(速度)を最優先したいとき
mod_rewriteは、リクエストが来るたびに複雑な正規表現エンジンを動かすため、CPUリソースを消費します。
大規模サイトやアクセスが集中する環境で、単なるURLの転送やフォルダの紐付けを行う場合、mod_aliasの方が圧倒的に処理が軽く、サーバーの負荷を抑えられます。
② ドメイン全体の引っ越しや、単純なURL変更(リダイレクト)
サイトのリニューアルで、古いページから新しいページへ1対1で転送したい場合や、古いドメインから新ドメインへ丸ごと転送したい場合は、mod_aliasの Redirect で十分対応できます。
- サイト全体を新ドメインへリダイレクト(mod_alias)
Redirect permanent / https://new-example.com/
これをmod_rewriteで書くと記述が複雑になり、設定ミスのリスク(無限ループなど)が高まります。
③ 複数サイトで画像やアセット用のフォルダを安全に共有したいとき
例えば、サーバー内の /var/www/common_assets/ というフォルダを、複数のWebサイトで /assets というURLで共通利用したい場合です。
- 安全かつ高速に共通フォルダをマッピング(mod_alias)
Alias /assets /var/www/common_assets
mod_aliasは設定がシンプルなため、ヒューマンエラーによるセキュリティホールの発生(意図しないシステムファイルの公開など)を防ぎやすいというメリットもあります。
それぞれのイメージ
1. mod_alias のシーケンス(単純・高速)
URLの書き換えは行わず、リクエストされたURLの先頭(接頭辞)だけをチェックして、即座にファイルパスへマッピングするか、リダイレクトを返すシンプルな流れです。
2. mod_rewrite のシーケンス(複雑・高機能)
リクエスト受付後、内部でループ(再エントリー)が発生する可能性や、条件判定(RewriteCond)のステップが挟まるため、柔軟ですが処理の工程が多くなります。
- mod_alias(図1):
- 判定が「前方一致のみ」の一方通行であるため、ステップ数が少なく、非常に高速に処理が終わります。
- mod_rewrite(図2):
- 条件チェックのフェーズ(薄い青枠の部分)が多く、さらに書き換えたURLでApache内部で「もう一度リクエストを処理し直す(内部リダイレクト)」という挙動が発生するため、機能性と引き換えに処理が重くなる構造が見て取れます。
まとめ:使い分けの基準
それぞれの使い分けです。
- まずは
mod_aliasで実現できないか考える。(単なる転送、単なるフォルダの紐付けなど) - 「クエリストリング(
?id=123など)を判定したい」「特定のブラウザだけ除外したい」「正規表現でURLを激しく書き換えたい」といった複雑な要件が出てきたとき初めてmod_rewriteを導入する。
どちらが優れているか、否かという問題ではなく、これは速度の問題です。
漫画『MASTERキートン』に以下のやりとりがあります。
「やめておけ」
「…………」
「拳銃の方が、ナイフよりも速いと思っているんだろう。
だが、拳銃はデリケートな道具だ。
弾が出ないかもしれないし、
思い通り的に当たるとは限らん。
おまけに拳銃は、
抜き、構え、引き金を引くまでに三動作(スリーアクション)……
その点ナイフは、一動作(ワンアクション)で終わる。
この距離なら、絶対に俺が勝つ!!
どうする? それでもやってみるかね?」
これは「至近距離でのナイフの有用性」を示したものであり、実際にその通りだという説得力があるものです。(調査結果はこの記事です)
つまり、mod_alias は「できることが少ないから速い」のではなく、「役割を絞っているから速い」のです。
mod_aliasはナイフの速度。mod_rewriteは拳銃のような強力さがあります。「適切な距離感」でこれらのツールの利用、併用を行いましょうというお話しです。