ここ数日、解決策を求めてサーフィンをしています。
設定ファイルにドメインをハードコーディングせずに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は、RewriteCond
のCondPattern引数で使用できません。
ホストがリファラーと一致するかどうかを確認するのはどうですか?例えば。
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
をチェックすることもできます。