什么是防盜鏈
防盜鏈簡而言之就是防止第三方或者未進允許的域名訪問自己的靜態資源的一種限制技術。比如A網站有許多自己獨立的圖片素材不想讓其它網站通過直接調用圖片路徑的方式訪問圖片,於是采用防盜鏈方式來防止。
nginx防盜鏈
防盜鏈基於客戶端攜帶的referer實現,referer是記錄打開一個頁面之前記錄是從哪個頁面跳轉過來的標記信息,如果別人只鏈接了自己網站的圖片或某個單獨的資源,而不是打開整個頁面,這就是盜鏈,referer就是之前的那個網站域名,正常的referer信息有以下幾種
nginx防盜鏈的代碼定義
- 定義合規的引用
valid_referers none | blocked | server_names | string ...;
- 拒絕不合規的引用:
if ($invalid_referer) {
rewrite ^/.*$ http://www.b.org/403.html
}
參數說明:
- none:請求報文沒有referer首部,比如用戶直接在瀏覽器輸入域名訪問往web網站,就是沒有referer信息
- blocked:請求報文由referer信息,但無又有效值為空
- server_names:referer首部中包含本主機及nginx監聽的server_name
- invalid_referer:不合規的feferer引用
實例演示
圖片源地址 | 調用圖片地址 |
---|---|
dev.api.dd.com | localhost |
測試頁面index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>演示nginx防盜鏈</title>
</head>
<body>
<img src="http://dev.api.dd.com/timg.jpeg" style="width: 100px;height: 100px;" />
</body>
</html>
正常配置nginx不做防盜鏈處理
server {
listen 80;
server_name dev.api.dd.com;
root /Users/lidong/Desktop/wwwroot/dd_api/public;
index index.php index.html index.htm;
access_log /Users/lidong/wwwlogs/dev.api.dd.com_access.log;
error_log /Users/lidong/wwwlogs/dev.api.dd.com_error.log;
location ~ [^/]\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
}
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
}`
運行http://localhost/index.html結果
配置限定的資源文件如果被第三方調用直接返回403
server {
listen 80;
server_name dev.api.dd.com;
root /Users/lidong/Desktop/wwwroot/dd_api/public;
index index.php index.html index.htm;
access_log /Users/lidong/wwwlogs/dev.api.dd.com_access.log;
error_log /Users/lidong/wwwlogs/dev.api.dd.com_error.log;
location ~ [^/]\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked dev.api.dd.com;
if ($invalid_referer)
{
return 403;
}
}
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
}
運行http://localhost/index.html結果
配置限定的資源文件如果被第三方調用直接返回一張404的圖片
server {
listen 80;
server_name dev.api.dd.com;
root /Users/lidong/Desktop/wwwroot/dd_api/public;
index index.php index.html index.htm;
access_log /Users/lidong/wwwlogs/dev.api.dd.com_access.log;
error_log /Users/lidong/wwwlogs/dev.api.dd.com_error.log;
location ~ [^/]\.php(/|$) {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked dev.api.dd.com;
if ($invalid_referer)
{
rewrite ^/ http://dev.api.dd.com/404.jpeg;
}
}
try_files $uri $uri/ @rewrite;
location @rewrite {
rewrite ^/(.*)$ /index.php?_url=/$1;
}
}
運行http://localhost/index.html結果
調用的圖片顯示302
用一張源站的404替換顯示