Apache HTTP サーバ バージョン 2.5

このドキュメントは mod_rewrite
リファレンスドキュメントを補足するものです。
mod_rewrite を使用してさまざまなリソースへのアクセスを制御する方法と、
その他の関連テクニックについて説明します。
mod_rewrite の一般的な使用例を多数含んでおり、
それぞれの動作についての詳細な説明も含まれています。
以下のテクニックは、他のサイトがあなたの画像をそのページに インラインで含める行為を禁止します。この行為は "直リンク" と呼ばれることが多く、あなたの帯域幅が 他のサイトのコンテンツ提供のために使用される結果となります。
このテクニックは HTTP_REFERER 変数の値に
依存していますが、この値はオプションです。そのため、一部の
ユーザはこの制限を回避できます。ただし、ほとんどのユーザは
リクエスト失敗を経験し、時間の経過とともにその画像が
他のサイトから削除される結果となるはずです。
この状況に対処する方法はいくつかあります。
最初の例では、リクエストが当サイトのページから開始されたものでない
場合、単純にリクエストを拒否します。この例では、当サイトが
www.example.com であると仮定しています。
RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "-" [F,NC]
2 番目の例では、リクエストを失敗させる代わりに、 代替画像を表示します。
RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "/images/go-away.png" [R,NC]
3 番目の例では、リクエストを他のサイトの画像にリダイレクト します。
RewriteCond "%{HTTP_REFERER}" "!^$"
RewriteCond "%{HTTP_REFERER}" "!www.example.com" [NC]
RewriteRule "\.(gif|jpg|png)$" "http://other.example.com/image.gif" [R,NC]
これらのテクニックのうち、後の 2 つが画像の直リンクをやめさせる のに最も効果的です。期待していた画像が表示されなくなるためです。
リクエストを他の場所にリダイレクトするのではなく、単にリソースへの
アクセスを拒否したいだけの場合、mod_rewrite を使わずに
実現できます:
SetEnvIf Referer example\.com localreferer
<FilesMatch "\.(jpg|png|gif)$">
Require env localreferer
</FilesMatch>
このレシピでは、特定のロボットやユーザエージェントからの しつこいリクエストをブロックする方法について説明します。
ロボット排除の標準では、ウェブサイトのどの部分でロボットを
除外したいかを指定する /robots.txt というファイルが
定義されています。しかし、一部のロボットはこれらのファイルを
尊重しません。
mod_rewrite を使用しない方法もあることに注意してください。
また、クライアントの USER_AGENT 文字列に依存する
テクニックは、その文字列を変更できるため、非常に簡単に回避できる
ことにも注意してください。
保護するディレクトリと、悪意のあるまたはしつこいロボットを
識別するクライアント USER_AGENT を指定する
ルールセットを使用します。
この例では、NameOfBadRobot というロボットを
/secret/files という場所からブロックしています。
特定のソースからのみそのユーザエージェントをブロックしたい場合は、
IP アドレス範囲も指定できます。
RewriteCond "%{HTTP_USER_AGENT}" "^NameOfBadRobot"
RewriteCond "%{REMOTE_ADDR}" "=123\.45\.67\.[8-9]"
RewriteRule "^/secret/files/" "-" [F]
mod_rewrite を使わずに、次に示すような代替手段で
同じ目的を達成できます:
SetEnvIfNoCase User-Agent ^NameOfBadRobot goaway
<Location "/secret/files">
<RequireAll>
Require all granted
Require not env goaway
</RequireAll>
</Location>
上記で述べたように、このテクニックは USER_AGENT
リクエストヘッダを変更するだけで簡単に回避できます。持続的な
攻撃を受けている場合は、ファイアウォールなどのより上位のレベルで
ブロックすることを検討してください。
hosts.deny のようなホストのリストを管理し、
それらのホストがサーバにアクセスするのをブロックしたいと
考えています。
RewriteEngine on
RewriteMap hosts-deny "txt:/path/to/hosts.deny"
RewriteCond "${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}" "!=NOT-FOUND" [OR]
RewriteCond "${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule "^" "-" [F]
##
## hosts.deny
##
## 注意! これはリストではなくマップです。リストとして扱う場合でも、
## mod_rewrite はキー/値のペアとして解析するため、各エントリに
## 少なくともダミーの値 "-" が必要です。
##
193.102.180.41 -
bsdti1.sdm.de -
192.76.162.40 -
2 番目の RewriteCond は、HostNameLookups がオンになっていて、
クライアント IP アドレスが解決されることを前提としています。
そうでない場合は、2 番目の RewriteCond を削除し、最初の
RewriteCond から [OR] フラグを削除してください。
リクエストの送信元のリファラに基づいてリクエストをリダイレクトし、 リファラごとに異なるターゲットを設定します。
以下のルールセットは、マップファイルを使用して各リファラを リダイレクト先に関連付けます。
RewriteMap deflector "txt:/path/to/deflector.map"
RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "${deflector:%{HTTP_REFERER}}" =-
RewriteRule "^" "%{HTTP_REFERER}" [R,L]
RewriteCond "%{HTTP_REFERER}" !=""
RewriteCond "${deflector:%{HTTP_REFERER}|NOT-FOUND}" "!=NOT-FOUND"
RewriteRule "^" "${deflector:%{HTTP_REFERER}}" [R,L]
マップファイルには各リファラのリダイレクト先が記述されています。 単にリファラ元にリダイレクトしたい場合は、マップに "-" を配置します:
## ## deflector.map ## http://badguys.example.com/bad/index.html - http://badguys.example.com/bad/index2.html - http://badguys.example.com/bad/index3.html http://somewhere.example.com/