.htaccessで直リン禁止でもFacebook,Twitter,feedlyは許可する場合


// Yahoo!知恵袋で意味不明な回答しか来ないのでこちらに投稿しました。 Add Star

WordPressで画像フォルダに直リンクを拒否する.htaccessを設置するのは出来ましたが、そのままですと、Facebook、Twitterのシェア、feedlyへの画像反映が不可になってしまいます。

.htaccessを画像フォルダに設置し、

自分のドメインからは許可
Facebook、Twitterのシェア、feedlyへの画像反映
他サイト(ブログ等)からは拒否

としたい場合の.htaccessの記述方法はどのようにしたらよいでしょうか?

ちなみに、検索で直リン禁止でもFacebook等はOkにするといった記事のコードを記述してみましたが、シェアやフィードへの画像は反映されませんでした。
RewriteCond %{HTTP_USER_AGENT} !(twitter|facebookexternalhit) [NC]
です。mod_rewriteを使わない汎用的な記述も試しましたがやはりダメでした。

借りてるサーバーはエックスサーバーです。

回答の条件
  • 1人1回まで
  • 登録:
  • 終了:2018/04/05 22:20:07
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kaoato No.2

回答回数236ベストアンサー獲得回数86

ポイント450pt

<Files ~ "\.(gif|png|jpg|jpeg)$">
SetEnvIf Referer "^https://blog\.example\.com" ref_ok
SetEnvIf Referer "^https://twitter\.com" ref_ok
SetEnvIf Referer "^https://www\.facebook\.com" ref_ok
SetEnvIf Referer "^https://feedly\.com/" ref_ok
order deny,allow
deny from all
allow from env=ref_ok
</Files>


gif、png、jpg、jpegファイルを

https://blog.example.com
https://twitter\.com
https://www.facebook.com
https://feedly.com

以外から参照されたら、アクセス拒否


Referer =>参照元のURL
HTTP_USER_AGENT =>ユーザーエージェント 

よく見かけるのは上記。

# SNS からの画像参照を許可
RewriteCond %{HTTP_USER_AGENT} !(twitter|facebookexternalhit|google) [NC]


たぶんこれのことだと思うけど、
twitterとかのBotエージェントが、画像を参照にしてきたときに許可するという記述だと思う。

Twitterカードとかの画像は、たしか一旦Twitterでキャッシュされるのでそれようの記述だと思います。

この設定で、Twitterカードとかの画像は表示される可能性は高いと思う。
Twitterカードの画像のURLをみないと分からないけど。

キャッシュでなくて、直接画像を表示してたら、これだけでなくて、Referer の許可も必要

# URL 書き換え処理を ON にする
RewriteEngine on
# 画像へのリンクを許可するサイトを記載
# 複数ある場合は行を分けて書く
RewriteCond %{HTTP_REFERER} !^http(s)?://nj-clucker.com [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{HTTP_REFERER} !bing\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
# SNS からの画像参照を許可
RewriteCond %{HTTP_USER_AGENT} !(twitter|facebookexternalhit|google) [NC]
# bot のアクセスを許可
RewriteCond %{HTTP_USER_AGENT} !(|googlebot|yahoo|bingbot) [NC]
# 直リンク禁止ファイルアクセス時にエラーを返す
RewriteRule \.(jpg|png|gif)$ - [F]

https://nj-clucker.com/disable-direct-access-to-image-by-htaccess/

上記を少し書きかえて、そのまま使えば良いのでは?
上記でワンセットなので、1行だけ取り出してとかは、期待通りに動作しなくて当然だと思う。

これ以外に、直リン禁止の記述があったら、また動作が変わってくると思うけど・・。

id:candy1967

有難うございます。
私も調べてみましたら、FB、Twitter、feedlyのいずれもメディアディレクトリから読み込んでいるようです。
ですので、ファイルマッチでメディアディレクトリ内のファイルに対して許可・不許可に.htaccessを作成して試してみようと思います。

2018/04/05 22:21:32

その他の回答1件)

id:gizmo5 No.1

回答回数504ベストアンサー獲得回数141

ポイント50pt

ご覧になった記事というのが分かりませんが、HTTP_USER_AGENT ではなく HTTP_REFERER ではないでしょうか。

id:kaoato No.2

回答回数236ベストアンサー獲得回数86ここでベストアンサー

ポイント450pt

<Files ~ "\.(gif|png|jpg|jpeg)$">
SetEnvIf Referer "^https://blog\.example\.com" ref_ok
SetEnvIf Referer "^https://twitter\.com" ref_ok
SetEnvIf Referer "^https://www\.facebook\.com" ref_ok
SetEnvIf Referer "^https://feedly\.com/" ref_ok
order deny,allow
deny from all
allow from env=ref_ok
</Files>


gif、png、jpg、jpegファイルを

https://blog.example.com
https://twitter\.com
https://www.facebook.com
https://feedly.com

以外から参照されたら、アクセス拒否


Referer =>参照元のURL
HTTP_USER_AGENT =>ユーザーエージェント 

よく見かけるのは上記。

# SNS からの画像参照を許可
RewriteCond %{HTTP_USER_AGENT} !(twitter|facebookexternalhit|google) [NC]


たぶんこれのことだと思うけど、
twitterとかのBotエージェントが、画像を参照にしてきたときに許可するという記述だと思う。

Twitterカードとかの画像は、たしか一旦Twitterでキャッシュされるのでそれようの記述だと思います。

この設定で、Twitterカードとかの画像は表示される可能性は高いと思う。
Twitterカードの画像のURLをみないと分からないけど。

キャッシュでなくて、直接画像を表示してたら、これだけでなくて、Referer の許可も必要

# URL 書き換え処理を ON にする
RewriteEngine on
# 画像へのリンクを許可するサイトを記載
# 複数ある場合は行を分けて書く
RewriteCond %{HTTP_REFERER} !^http(s)?://nj-clucker.com [NC]
RewriteCond %{HTTP_REFERER} !google\. [NC]
RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
RewriteCond %{HTTP_REFERER} !bing\. [NC]
RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
# SNS からの画像参照を許可
RewriteCond %{HTTP_USER_AGENT} !(twitter|facebookexternalhit|google) [NC]
# bot のアクセスを許可
RewriteCond %{HTTP_USER_AGENT} !(|googlebot|yahoo|bingbot) [NC]
# 直リンク禁止ファイルアクセス時にエラーを返す
RewriteRule \.(jpg|png|gif)$ - [F]

https://nj-clucker.com/disable-direct-access-to-image-by-htaccess/

上記を少し書きかえて、そのまま使えば良いのでは?
上記でワンセットなので、1行だけ取り出してとかは、期待通りに動作しなくて当然だと思う。

これ以外に、直リン禁止の記述があったら、また動作が変わってくると思うけど・・。

id:candy1967

有難うございます。
私も調べてみましたら、FB、Twitter、feedlyのいずれもメディアディレクトリから読み込んでいるようです。
ですので、ファイルマッチでメディアディレクトリ内のファイルに対して許可・不許可に.htaccessを作成して試してみようと思います。

2018/04/05 22:21:32
  • id:hi-Roki
    私はSNSとbotの制御だけができなかったのですが、上記コードの間違いに気付きました。


    ×間違いは:RewriteCond %{HTTP_USER_AGENT} !(|googlebot|yahoo|bingbot) [NC]
    ◎正しくは:RewriteCond %{HTTP_USER_AGENT} !(googlebot|yahoo|bingbot) [NC]

    googlebotの先頭に「|」が入っており、
    この記号が入るだけで全ての制御ができなくなります。
    他にも以下サイトでも間違い(ゴミ付き)コードが公開されています。
    https://webllica.com/disable-direct-access-to-image-by-htaccess/

    以下コードで制御できると思います。
    ↓↓↓↓↓

    # URL 書き換え処理を ON にする
    RewriteEngine on
    # 画像へのリンクを許可するサイトを記載
    # 複数ある場合は行を分けて書く
    RewriteCond %{HTTP_REFERER} !^http(s)?://nj-clucker.com [NC]
    RewriteCond %{HTTP_REFERER} !google\. [NC]
    RewriteCond %{HTTP_REFERER} !yahoo\. [NC]
    RewriteCond %{HTTP_REFERER} !bing\. [NC]
    RewriteCond %{HTTP_REFERER} !search\?q=cache [NC]
    # SNS からの画像参照を許可
    RewriteCond %{HTTP_USER_AGENT} !(twitter|facebookexternalhit|google) [NC]
    # bot のアクセスを許可
    RewriteCond %{HTTP_USER_AGENT} !(googlebot|yahoo|bingbot) [NC]
    # 直リンク禁止ファイルアクセス時にエラーを返す
    RewriteRule \.(jpg|png|gif)$ - [F]


    ※サーバによっては別の記述もあるので、こちらで解決しなければもう一方をお試しを。
  • id:candy1967
    コメントいただきまして有難うございます。
    掲載していただいた記述を元に当方の環境に合わせていくつか.htaccessで制御しているうちSNSが関係してくる画像のフォルダにあった.htaccessと差し替えてみました。
    実のところWordPressで運営しているブログでの画像の取扱でしたので、TwitterやFacebookはどうやらWordPressのメディアファイルの画像(アイキャッチ)のをシェア等で使用するようでしたので、そっちのほうはシェア等されたくないファイルの一律の接頭語を付けて正規表現でシェア出来ないようにしたのですが、今回差し替えたフォルダはbot、とくにGoogleの画像検索で検索Okとしたい意図がありましたのでまだ今の所Google画像検索に反映されない為、ちょっと様子を見ている状況です。
    ※以前の.htaccessだとbotのことが念頭になくGoogle画像検索に反映されてもよい画像フォルダの画像をすべて検索から消えてしまったので、ご教示いただいたコードを元に差し替えた次第です。

    いずれにしましてもとても有意義なコメントをいただきまして感謝しています。
    本当に有難うございました。
    ポイントを、と思ったのですけれど、大変残念なのですがコメントにはそれが出来ないようでした(回答のみのようでした)。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません