サーバーに画像を置いた場合、外部サイトに画像を直リンクされて埋め込まれてしまうことがあります。
大してPVの無いサイトであれば影響もないのですが、PVが大きいサイトの場合は被害が大きくなります。
かといってすべての画像を直リンク禁止にすると、OGP画像などで使う時に読み込めなくなってしまいまい不便です。
そこで特定の名称規則に合致するファイルだけ直リンクを禁止できないか?と思って調べたら出来たのでまとめておきます。
特定の名称規則のファイルだけ直リンク禁止にする
特定のリファラからのリクエストに対して、指定された画像ファイル(xyz_
で始まるもの)のアクセスを制御するものです。リファラが hoge-hoge.com
または example.com
である場合にのみ、xyz_
で始まる画像ファイルへのアクセスを許可し、それ以外のリファラからのアクセスは拒否します。
SetEnvIf Referer "^https?://hoge-hoge\.com|example\.com" my_site
<Files ~ "^xyz_.*\.(jpg|jpeg|png|gif|webp)$">
Order Allow,Deny
Allow from env=my_site
Deny from all
</Files>
1. SetEnvIf
ディレクティブ
apacheSetEnvIf Referer "^https?://hoge-hoge\.com|example\.com" my_site
SetEnvIf
: 環境変数を条件付きで設定するための指令です。Referer
: リクエストのリファラヘッダーをチェックします。このヘッダーは、どのページからリクエストが発生したかを示します。"^https?://hoge-hoge\.com|example\.com"
:^https?://
: リファラがhttp://
またはhttps://
で始まることを示します。?
は直前のs
が0回または1回出現することを意味します。hoge-hoge\.com|example\.com
: リファラがhoge-hoge.com
またはexample.com
であることを示します。|
は「または」を意味します。my_site
: この条件が満たされる場合に設定される環境変数です。
2. <Files>
ディレクティブ
apache<Files ~ "^xyz_.*\.(jpg|jpeg|png|gif|webp)$">
Order Allow,Deny
Allow from env=my_site
Deny from all
</Files>
<Files>
: 指定したファイルに対するアクセス制御を行うための指令です。~ "^xyz_.*\.(jpg|jpeg|png|gif|webp)$"
:^xyz_
: ファイル名がxyz_
で始まることを示します。.*
:xyz_
の後に任意の文字が続くことを許可します。\.(jpg|jpeg|png|gif|webp)$
: 拡張子が.jpg
,.jpeg
,.png
,.gif
, または.webp
であることを示します。$
は文字列の終わりを示します。
3. アクセス制御の順序
apacheOrder Allow,Deny
Allow from env=my_site
Deny from all
Order Allow,Deny
: アクセス制御の順序を指定します。この設定では、まずAllow
の条件が評価され、その後Deny
の条件が評価されます。Allow from env=my_site
:my_site
環境変数が設定されている場合、そのファイルへのアクセスを許可します。Deny from all
: 上記の条件が満たされない場合、すべてのアクセスを拒否します。
.htaccessはどこに置くべきか?
どこでも大丈夫ですが、wp-content/uploadsに置くのがいいと思います。