防盗链(Referer)是防止其他网站直接链接你的资源(如图片、视频等)的有效方法,以下是几种常见的配置方式:
server {
listen 80;
server_name example.com;
location ~* \.(jpg|jpeg|png|gif|mp4|flv)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
# 或者可以重定向到警告图片
# rewrite ^ /anti-hotlinking.jpg;
}
}
}
location /protected/ {
# 检查签名参数
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
}
location /media/ {
valid_referers none blocked example.com *.example.com;
# 允许特定国家访问
geoip_country /usr/share/GeoIP/GeoIP.dat;
if ($invalid_referer) {
if ($geoip_country_code != CN) {
return 403;
}
}
}
# 工作进程与连接数
worker_processes auto; # 自动根据CPU核心数设置
worker_rlimit_nofile 100000; # 每个worker能打开的文件描述符数量
events {
worker_connections 4096; # 每个worker最大连接数
multi_accept on; # 一次接受所有新连接
use epoll; # Linux高性能事件模型
}
http {
# 基础优化
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
keepalive_requests 1000;
# 关闭不必要的信息
server_tokens off;
# MIME类型缓存
include mime.types;
default_type application/octet-stream;
# 日志优化
access_log off; # 生产环境可关闭或限制
# 或使用缓冲日志
# access_log /var/log/nginx/access.log main buffer=32k flush=1m;
# 文件传输优化
client_max_body_size 10m;
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# 超时设置
client_body_timeout 12;
client_header_timeout 12;
send_timeout 10;
# Gzip压缩
gzip on;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private auth;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_disable "msie6";
gzip_vary on;
gzip_comp_level 6;
gzip_buffers 16 8k;
# 静态文件缓存
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
server {
# 禁用不安全的HTTP方法
if ($request_method !~ ^(GET|HEAD|POST)$ ) {
return 405;
}
# 防止点击劫持
add_header X-Frame-Options "SAMEORIGIN";
# XSS保护
add_header X-XSS-Protection "1; mode=block";
# 禁用内容类型嗅探
add_header X-Content-Type-Options "nosniff";
# CSP策略
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.trusted.com; img-src 'self' data: *.trusted.com;";
# 安全传输策略
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 防止MIME类型混淆攻击
types {
text/html html htm shtml;
text/css css;
# 其他类型...
}
}
server {
listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# 协议与加密套件优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
# 会话缓存优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP装订
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# DH参数
ssl_dhparam /path/to/dhparam.pem;
# HSTS预加载
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
}
server {
listen 80;
server_name img.example.com;
# 防盗链
location ~* \.(jpg|jpeg|png|gif|webp)$ {
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
# 缓存优化
expires 30d;
add_header Cache-Control "public, no-transform";
# WebP自动适配
if ($http_accept ~* "webp") {
rewrite ^(.*)\.(jpg|jpeg|png)$ $1.webp break;
}
}
# WebP图片服务
location ~* \.webp$ {
try_files $uri $uri/ =404;
expires 30d;
add_header Vary Accept;
}
# 访问限制
location / {
limit_req zone=img_limit burst=20 nodelay;
limit_conn img_conn 10;
}
}
server {
listen 80;
server_name video.example.com;
# HLS流媒体配置
location /hls/ {
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /var/media;
add_header Cache-Control no-cache;
# 防盗链
secure_link $arg_token,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr secret_key";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
}
# MP4视频文件
location ~* \.mp4$ {
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
# 防盗链
valid_referers none blocked example.com *.example.com;
if ($invalid_referer) {
return 403;
}
}
}
以上配置可根据实际业务需求进行调整,建议在测试环境验证后再应用到生产环境。