web-dev-qa-db-ja.com

Apache構成ファイルにドメインをハードコーディングせずにホットリンク保護を有効にするにはどうすればよいですか?

ここ数日、解決策を求めてサーフィンをしています。

設定ファイルにドメインをハードコーディングせずにApacheホットリンク保護を有効にすると、設定ファイルを毎回更新しなくてもコードを他のドメインに移植できますか?

これは私がこれまでに持っているものです:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.(com|net|org) [NC]
RewriteRule \.(gif|ico|jpe|jpeg|jpg|png)$ - [NC,F,L]

...そしてこれはApacheが提案するものです:

SetEnvIf Referer example\.com localreferer
<FilesMatch \.(jpg|png|gif)$>
    Order deny,allow
    Deny from all
    Allow from env=localreferer
</FilesMatch>

...どちらもルールにドメインをハードコードします。

これをカバーする情報を見つけるのに最も近いのは ここServerFaultで ですが、結論はそれができないということでした。私の調査によると、それは本当のように見えますが、この質問に専念する質問や解説は見つかりませんでした。

興味があれば、 ここにリンクがあります このトピックをカバーするApache2ドキュメントへ。

Apache環境変数(例:%{HTTP_REFERER}cannotは、RewriteCondCondPattern引数で使用できません。

4
Jeff

ホストがリファラーと一致するかどうかを確認するのはどうですか?例えば。

RewriteCond %{HTTP_REFERER} !%{HTTP_Host}

編集

OPが述べているように、これは機能しません。 Apache 2.4の場合、次を使用できます。

RewriteCond expr "! %{HTTP_REFERER} -strmatch '*://%{HTTP_Host}/*'"

2.2の場合、mod_Perlまたはmod_pythonに小さなハンドラーを記述して、比較を実行し、403エラーを発行することができます。

Mod_pythonでこれを実現するには:

Docroot(私の場合は/ var/www /)にhotlink.pyというファイルを作成します

from mod_python import Apache

def headerparserhandler(req):
    if req.headers_in.get("Host") != req.headers_in.get("Referer"):
            return Apache.HTTP_FORBIDDEN
    return Apache.OK

あなたのApache設定では:

 <Directory /var/www/>
   ...
   AddHandler mod_python .jpg
   AddHandler mod_python .gif
   PythonHeaderParserHandler /var/www/hotlink.py
   #PythonDebug On
 </Directory>

これで、.jpgと.gifのすべてのリクエストは、最初にhotlink.pyによってチェックされます。 mod_pythonを使用すると、req.server.server_hostname属性をチェックして、着信Hostヘッダーの代わりにServerNameをチェックすることもできます。

2