web-dev-qa-db-ja.com

サイト上のファイルへのホットリンクと直接リンクを無効にするにはどうすればよいですか?

さて、私は数時間壁に頭をぶつけましたが、これはうまくいきません。以下は私の.htaccessファイルの内容です。私がやろうとしているのは、ユーザーが私のサイトのページ上のリンクからこれらのファイルにクリックスルーしない限り、私のサイト上の一連のpdfファイルとmp3ファイルへのアクセスをブロックすることです。

どこを見ても、コードは基本的に私が使用しているものと同じであり、機能していません。私の質問は次のとおりです。

1)私は何か間違ったことをしていますか? 2)そうでない場合、これをデバッグするにはどうすればよいですか?

# BEGIN CustomRedirects
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www\.)?mydomain.com/.*$ [NC]
RewriteRule \.(mp3|pdf)$ - [F,NC,L]
# END CustomRedirects

Mp3とpdfは大文字と小文字を区別せず、mod_rewriteが有効になっています。私のサイトにはWordpressがインストールされていますが、この.htaccessファイルよりもツリー内の上位のディレクトリにあります。ドキュメントからの私の印象は、.htaccessファイルが配置されているため優先する必要があるということです。この書き換えを実行したいディレクトリにあります。この.htaccessファイルをひどく台無しにすると、エラー500が発生するため、ある時点で読み込まれているとしか想定できません。

また、別のserverfaultの質問から見つけた次のことも試しましたが、これも機能しませんでした。

SetEnvIf Referer . hotlink=1
SetEnvIfNoCase Referer ^http://(www\.)?mydomain\.com/.*$ !hotlink
<LocationMatch *.pdf>
      Order allow,deny
      Deny from env=hotlink
      Allow from all
</LocationMatch>

誰かアイデアはありますか?

更新: RewriteRuleに対して次のことも試しましたが、効果はありませんでした。

RewriteRule .*\.(mp3|pdf)$ - [F,NC,L]

私が見つけた1つのことは、RewriteCond %{HTTP_REFERER} !^$の部分を省略しても、誰かがURLを直接入力してファイルにアクセスできるという事実を除いて、正常に機能することです。それは私が防ぎたい他の何かです。

1
Mike Taber

最初の抜粋の問題は、RewriteRule行である可能性があります。

あなたが持っている場所:

RewriteRule \.(mp3|pdf)$ - [F,NC,L]

おそらくあなたが望む:

RewriteRule .*\.(mp3|pdf)$ - [F,NC,L]

現状では、特定のファイル「.mp3」または「.pdf」と一致していると思います。 'foo.mp3'または 'bar.pdf'(fooとbarを変更するため)に一致させたい。

2番目の抜粋で..スタートは疑わしいようです。 SetEnvIfとSetEnvIfNoCaseの組み合わせが必要な理由がわかりません。おそらく、次のようなものを試してください。

SetEnvIf Referer "^http://(www\.)?mydomain.com/.*$" legit_referal
SetEnvIf Referer "^$" legit_referal
<LocationMatch "\.(pdf|mp3)$" >
   Order Deny,Allow
   Deny from all
   Allow from env=legit_referal
</LocationMatch>
2
user30579

あなたが説明していることは間違いなく可能です。リファラーが自分のドメインと一致しない場合は、403forbiddenステータスを簡単に返すことができます。

このオプションを検討することもできます: http://www.alistapart.com/articles/hotlinking/

現在のコードに関して、をエスケープするためにバックスラッシュ\を誤って見逃していることに気づきました。 inmydomain.com

1
mr-euro