Skip to content

部署防盗链

实战-Nginx实现图片防盗链-20241204(测试成功)

目录

[toc]

背景

自己在浏览其它网站文章时,发现这个小伙伴的网站文章里图片的url竟然还是我的网址,哈哈🤣

这怎么能够被允许?😁

果断给自己图床加上防盗链,此时就nice了

只有自己网站才能引用自己图床里的图片,别人网站是无法直接引用的。😂

推荐:一般在持久化网上文章时,最好把图片都下载起来,不然那天源站图片迁移了,那么自己的文章不是废了😜(友情提示:typora可以实现批量下载图片并上传到自己图床功能哦,很不错)

前言

什么是图片盗链

首先我们聊聊什么是图片盗链?

盗链指的是其他网站不经过你的许可直接通过链接使用你网站上的资源,从而消耗你的带宽和资源,这不仅会影响你网站的性能,还有可能会导致资源被滥用。

简单来说,直接从你的网站上右键复制链接,粘贴到他自己的网站使用,实际请求的是你的服务器。

图片你直接在浏览器打开用可以,但是如果图片url出现在你的网站里(img标签里),将是不被允许的。

今天我们就来说说nginx如何实现配置静态资源服务器及防盗链实现。

1、准备一张防盗链提示图片

  • 首先准备一张防盗链提示图片(来源于百度)

图片下载地址:防盗链图片

下载后,将其重命名为1.png

  • 执行如下命令,并把防盗链图片上传到/FdangDaoLianImages/路径:
bash
[root@docusaurus-wiki res]# mkdir /FdangDaoLianImages
[root@docusaurus-wiki res]# cd /FdangDaoLianImages/
[root@docusaurus-wiki FdangDaoLianImages]# rz ##将防盗链图片1.png 上传到此路径
rz waiting to receive.**[root@docusaurus-wiki FdangDaoLianImages]# ll
total 152
-rw-rw-rw- 1 root root 154676 Dec 15 06:26 1.png
  • 配置下nginx,让我们能访问到这个防盗链图片

vim /etc/nginx/conf.d/onedayxyy.cn.conf

bash
    location /error {
        autoindex on; # 启用目录索引
        alias /FdangDaoLianImages;
        index index.html;   # 默认显示index.html文件,如果没有则列出目录内容
    }
注意:此段代码是配置如下位置的
bash
server {
    listen 80;
    server_name onedayxyy.cn;
    #配置https重定向
    return 301 https://$host$request_uri;
}

server {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;


    listen  443 ssl;
    server_name  onedayxyy.cn;

    root /root/rsync/rsync-vitepress/dist;    
    location / {
        index index.html index.htm;
        try_files $uri $uri.html $uri/ =404;

        # non existent pages
        error_page 404 /404.html;

        # a folder without index.html raises 403 in this setup
        error_page 403 /404.html;

        # adjust caching headers
        # files in the assets folder have hashes filenames
        location ~* ^/assets/ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    } 

    location /images {
        alias /images;
        index index.html;
      valid_referers none blocked *.onedayxyy.cn onedayxyy.cn *.gitee.com gitee.com localhost 127.0.0.1;
      if ( $invalid_referer ) {
           # 如不满足,指定访问如下资源
           rewrite ^/ https://onedayxyy.cn/error/1.png;
           return 403;
      }
    }
    
……

    location /error {
        autoindex on; # 启用目录索引
        alias /FdangDaoLianImages;
        index index.html;   # 默认显示index.html文件,如果没有则列出目录内容
    }   
    

    ssl_certificate             /etc/letsencrypt/live/onedayxyy.cn/fullchain.pem;
    ssl_certificate_key         /etc/letsencrypt/live/onedayxyy.cn/privkey.pem; 

    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000";
    
    access_log /var/log/nginx/onedayxyy.cn.https.log;
}

  • 重启服务:
bash
[root@docusaurus-wiki FdangDaoLianImages]# systemctl restart nginx
  • 验证:

https://onedayxyy.cn/error/1.png

2、配置nginx

  • 我的图床图片资源存放于服务器的/images目录下

vim /etc/nginx/conf.d/onedayxyy.cn.conf

具体代码:
json
server {
    listen 80;
    server_name onedayxyy.cn;
    #配置https重定向
    return 301 https://$host$request_uri;
}

server {
    gzip on;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;


    listen  443 ssl;
    server_name  onedayxyy.cn;

    root /root/rsync/rsync-vitepress/dist;    
    location / {
        index index.html index.htm;
        try_files $uri $uri.html $uri/ =404;

        # non existent pages
        error_page 404 /404.html;

        # a folder without index.html raises 403 in this setup
        error_page 403 /404.html;

        # adjust caching headers
        # files in the assets folder have hashes filenames
        location ~* ^/assets/ {
            expires 1y;
            add_header Cache-Control "public, immutable";
        }
    } 

    location /images {
        alias /images;
        index index.html;
      valid_referers none blocked *.onedayxyy.cn onedayxyy.cn *.gitee.com gitee.com localhost 127.0.0.1;
      if ( $invalid_referer ) {
           # 如不满足,指定访问如下资源
           rewrite ^/ https://onedayxyy.cn/error/1.png;
           return 403;
      }
    }
    
    
    location /home {
    alias /root/home3.0/;
        index index.html index.htm;
    }



    location /wiki {
    alias /root/rsync/rsync-docusaurus/build;
        index index.html index.htm;
    }

    location /newyear {
    alias /root/rsync/rsync-qianduan-demo/qianduan-demo/newyear;
        index index.html index.htm;
    }


    location /error {
        autoindex on; # 启用目录索引
        alias /FdangDaoLianImages;
        index index.html;   # 默认显示index.html文件,如果没有则列出目录内容
    }   
    

    ssl_certificate             /etc/letsencrypt/live/onedayxyy.cn/fullchain.pem;
    ssl_certificate_key         /etc/letsencrypt/live/onedayxyy.cn/privkey.pem; 

    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=31536000";
    
    access_log /var/log/nginx/onedayxyy.cn.https.log;
}

image-20241205223257599

语法说明:

bash
valid_referers none | blocked | server_names | strings ….;

--none:允许没有http_refer的请求访问资源,检测 Referer 头域不存在的情况,则可以访问。
--blocked:检测 Referer 头域的值被防火墙或者代理服务器删除或伪装的情况。
--server_names :只允许指定ip/域名来的请求访问资源(白名单)。可设置一个或多个 URL ,检测 Referer 头域的值是否是这些 URL 中的某一个。在生产环境中尽量使用域名,不使用ip。
  • 重启ngix服务
bash
systemctl restart nginx

3、验证

  • 导链的小伙伴网站此时已经废了哈哈🤣

https://hydoc.netlify.app/blog/VM-Network-IP

image-20241204060538636

image-20241204060603494

image-20241204060641154

  • 自己typora里图片是可以正常显示的

image-20241204060731974

  • 浏览器也是可以直接访问图片的

image-20241204060755366

参考

https://blog.51cto.com/u_64214/8577766

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 个人网站

image-20250109220325748

🍀 微信二维码

x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号

《云原生架构师实战》

image-20230107215126971

🍀 csdn

https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎

https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

如果你还有疑惑,可以去我的网站查看更多内容或者联系我帮忙查看。

如果你有更好的方式,评论区留言告诉我。谢谢!

好了,本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

最近更新