Nginxで画像のホットリンク保護の問題を実装しようとしていますが、助けが必要です。 StumbleUponのようなソーシャルネットワークに自分のサイトの画像が次のような直接リンクで送信されるという大きな問題があります。
http://example.com/xxxxx.jpg
これは時々hugeトラフィックを取得し、CPU使用率と帯域幅使用率を増加させます。他のリファラーからの画像への直接アクセスをブロックし、ホットリンクされないように保護したいと思います。
これが私のvhost.confからのコードです
server {
access_log off;
error_log logs/vhost-error_log warn;
listen 80;
server_name mydomain.com www.mydomain.com;
# uncomment location below to make nginx serve static files instead of Apache
# NOTE this will cause issues with bandwidth accounting as files wont be logged
location ~* \.(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css)$ {
root /home/username/public_html;
expires 1d;
}
root /home/mydomain/public_html;
}
location / {
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
# you can increase proxy_buffers here to suppress "an upstream response
# is buffered to a temporary file" warning
proxy_buffers 16 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_connect_timeout 30s;
proxy_redirect http://www.mydomain.com:81 http://www.mydomain.com;
proxy_redirect http://mydomain.com:81 http://mydomain.com;
proxy_pass http://ip_address/;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 24h;
}
}
ホットリンク保護のために、このコードを追加しました
location ~* (\.jpg|\.png|\.gif|\.jpeg)$ {
valid_referers blocked www.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
これはこのドメインの現在のnginxコードですが、機能しませんでした。
server {
access_log off;
error_log logs/vhost-error_log warn;
listen 80;
server_name mydomain.com www.mydomain.com;
# uncomment location below to make nginx serve static files instead of Apache
# NOTE this will cause issues with bandwidth accounting as files wont be logged
location ~* \.(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css)$ {
root /home/username/public_html;
expires 1d;
}
root /home/mydomain/public_html;
}
location ~* (\.jpg|\.png|\.gif|\.jpeg)$ {
valid_referers blocked www.mydomain.com mydomain.com;
if ($invalid_referer) {
return 403;
}
location / {
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
# you can increase proxy_buffers here to suppress "an upstream response
# is buffered to a temporary file" warning
proxy_buffers 16 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
proxy_connect_timeout 30s;
proxy_redirect http://www.mydomain.com:81 http://www.mydomain.com;
proxy_redirect http://mydomain.com:81 http://mydomain.com;
proxy_pass http://ip_address/;
proxy_set_header Host $Host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 24h;
}
}
どうすればこれを修正できますか?
次の質問をする必要があります: https://serverfault.com/
私の現在のサイトはこれを使用しています:
## Stop Image and Document Hijacking, alow Google, MSN PicSearch
location ~* \.(png|gif|jpg|jpeg)$ {
set $testref "";
if ($http_referer !~ ^(http://mydomain.com|http://www.google|http://images.search.yahoo|http://www.bing|http://pictures.ask)){
set $testref I;
}
if ($http_user_agent !~* (Googlebot|psbot|msnbot|Yahoo|Ask)) {
set $testref "${testref}G";
}
if ($testref = IG){
return 444;
}
}
最初の「if」部分のみを使用でき、2番目はGoogleや他のイメージスパイダーをブロックしないことです。最初の部分はmydomain(およびgoogleなど)からのリファラーを探し、それ以外の場合は444を返します。 blank.gif画像を返すように置き換えることができます。
これには、Nginxのvalid_referers
オプションを使用できます。 https://www.atulhost.com/hotlink-protection-nginx を参照してください
関連するコードは次のとおりです。
location ~* \.(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css)$ {
valid_referers none blocked example.org www.exampleorg ~\.google\. ~\.yahoo\. ~\.bing\. ~\.facebook\. ~\.fbcdn\.;
if ($invalid_referer) {
return 403;
}
root /home/username/public_html;
expires 1d;
}