<-
Apache > HTTP サーバ > ドキュメンテーション > バージョン 2.5 > Rewrite

mod_rewrite を使ったアクセス制御

翻訳済み言語:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn 

このドキュメントは mod_rewrite リファレンスドキュメントを補足するものです。 mod_rewrite を使用してさまざまなリソースへのアクセスを制御する方法と、 その他の関連テクニックについて説明します。 mod_rewrite の一般的な使用例を多数含んでおり、 それぞれの動作についての詳細な説明も含まれています。

これらの例の多くは、特定のサーバ設定ではそのまま 動作しないことに注意してください。そのため、単にコピー&ペーストするのではなく、 内容を理解することが重要です。

参照

top

画像の "直リンク" の禁止

説明:

以下のテクニックは、他のサイトがあなたの画像をそのページに インラインで含める行為を禁止します。この行為は "直リンク" と呼ばれることが多く、あなたの帯域幅が 他のサイトのコンテンツ提供のために使用される結果となります。

解決方法:

このテクニックは 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>
top

ロボットのブロック

説明:

このレシピでは、特定のロボットやユーザエージェントからの しつこいリクエストをブロックする方法について説明します。

ロボット排除の標準では、ウェブサイトのどの部分でロボットを 除外したいかを指定する /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 リクエストヘッダを変更するだけで簡単に回避できます。持続的な 攻撃を受けている場合は、ファイアウォールなどのより上位のレベルで ブロックすることを検討してください。

top

拒否リストのホストの拒否

説明:

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] フラグを削除してください。

top

リファラに基づくデフレクタ

説明:

リクエストの送信元のリファラに基づいてリクエストをリダイレクトし、 リファラごとに異なるターゲットを設定します。

解決方法:

以下のルールセットは、マップファイルを使用して各リファラを リダイレクト先に関連付けます。

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/

翻訳済み言語:  de  |  en  |  es  |  fr  |  ja  |  ko  |  tr  |  zh-cn