Apache(.htaccess)で直リンクを禁止【サイトパクリ防止】



海外サイトの直リンクに対し随時画像を入れ替えていましたが、キリがないので設定しました。

.htaccessがある場所と書き方

現在はこのコードで直リンク禁止

# NO direct link
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?*****\.com [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !search?q=cache [NC]
RewriteCond %{HTTP_REFERER} !bing\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{HTTP_REFERER} !msn\. [NC]
RewriteCond %{HTTP_USER_AGENT} !(twitter|Twitterbot|facebookexternalhit|hatena) [NC]
RewriteRule \.(jpg|jpeg|png|gif|zip|pdf|wepb)$ - [NC,F,L]

注意点

「http://の前には^」「ピリオド . の前に\(バックスラッシュ)」を入れます。「*****\.com」の部分にはご自身のドメインを入力します。

コードの説明

  • RewriteEngineを ON
  • 自分のサイト、google、yahooなど設定したサイトのみ jpgなどのファイルの表示を許可
  • 参照元が自分のサイト、google、yahoo、bing、msnではない場合はファイルの表示を禁止

フラグ

  • [NC]→大文字・小文字を区別しない
  • [F]→強制的にアクセス禁止「403 Forbidden」
  • [L]→書き換えが行われたら終了

jpg だと [F] や [NC] で 403 になりますが、wepb には効き目がなかったので [NC,F,L] を指定しています。
環境によっても異なるかもしれないのでテストしてみると良いです。

アドレスバーに入力した時に画像を表示させたくない場合

この行を削除します。ある意味、右クリック禁止よりも効果的かも。

RewriteCond %{HTTP_REFERER} !^$

SNSで共有された時に画像を反映させたくない場合

この行を削除します。

RewriteCond %{HTTP_USER_AGENT} !(twitter|Twitterbot|facebookexternalhit|hatena) [NC]

直リンクされた時にリダイレクト

1番最後の行をこのコードと置き換えます。一時的なリダイレクトなので302で良いかと。

RewriteRule \.(jpg|jpeg|png|gif|zip|pdf|wepb)$ トップページなど [R=302,L]

直リンクされた時に自動的に別の画像を表示させたい場合

効果絶大ですが、サイトを AMP 対応している場合は注意が必要です。

【AMP】直リンク対策で他の画像にリダイレクトしたらえらい目にあった

SetEnvIfで設定

このコードは反応が鈍くなってしまったので現在は使っていません。

# NO direct link
<Files ~ "\.(jpg|jpeg|png|gif|css|js|zip|pdf)$">
SetEnvIf Referer "^http://*****\.com" ok_url
SetEnvIf Referer "^https://*****\.com" ok_url
SetEnvIf Referer "^http://www\.*****\.com" ok_url
SetEnvIf Referer "^https://www\.*****\.com" ok_url
SetEnvIf Referer "google" ok_url
SetEnvIf Referer "yahoo" ok_url
SetEnvIf Referer "bing" ok_url
SetEnvIf User-Agent "AmazonAdBot" ok_url
SetEnvIf User-Agent "Applebot" ok_url
SetEnvIf User-Agent "Baiduspider" ok_url
SetEnvIf User-Agent "bingbot" ok_url
SetEnvIf User-Agent "Cliqzbot" ok_url
SetEnvIf User-Agent "coccocbot" ok_url
SetEnvIf User-Agent "facebookexternalhit" ok_url
SetEnvIf User-Agent "Googlebot" ok_url
SetEnvIf User-Agent "Hatena Antenna" ok_url
SetEnvIf User-Agent "istellabot" ok_url
SetEnvIf User-Agent "Linespider" ok_url
SetEnvIf User-Agent "Mail.RU" ok_url
SetEnvIf User-Agent "MojeekBot" ok_url
SetEnvIf User-Agent "msnbot" ok_url
SetEnvIf User-Agent "Qwantify" ok_url
SetEnvIf User-Agent "SeznamBot" ok_url
SetEnvIf User-Agent "Sogou" ok_url
SetEnvIf User-Agent "Twitterbot" ok_url
SetEnvIf User-Agent "Yandex" ok_url
SetEnvIf User-Agent "Yeti" ok_url
order deny,allow
allow from env=ok_url
</Files>

Googlebot・各国の検索エンジン、Facebook・Twitterなどは一応OKにしています。
直リンクをされるとエラーログが届くので、こちらの方が分かりやすいと言えば分かりやすい。

[日付] [access_compat:error][pid ~:tid ~] [client IP] 
AH01797: client denied by server configuration: 画像URL, referer: パクリ元URL

結果

画像を直リンクしようとすると表示されない、もしくは403エラーになります。

たとえば、この海外サイトで直リンクされていましたが、

設定後、私の画像は消え代わりに他の人の画像が表示されました。早く設定しておけば良かった。

5ちゃんねるで画像URLだけ貼られても問題なし。