-
OpenResty 图片服务器 支持跨域+防盗链配置
server { listen 80; server_name img.your-domain.com; # 替换为你的图片服务器域名 # 图片文件存放的根目录 root /path/to/your/images; # 替换为你的图片目录路径 # 关闭目录索引 autoindex off; # 预定义跨域头(会被继承到子location) add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always; add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always; # 设置图片文件的 MIME 类型 location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ { # 设置缓存头 expires 30d; add_header Cache-Control "public, no-transform" always; # 防盗链设置 - 只允许 baidu.com 和 www.baidu.com 引用 valid_referers none blocked server_names *.baidu.com baidu.com www.baidu.com; if ($invalid_referer) { return 403; } # 动态设置跨域头(根据请求来源) if ($http_origin ~* (https?://(www\.)?baidu\.com)) { add_header 'Access-Control-Allow-Origin' "$http_origin" always; } # 处理 OPTIONS 预检请求 if ($request_method = 'OPTIONS') { add_header 'Access-Control-Max-Age' 1728000 always; add_header 'Content-Type' 'text/plain; charset=utf-8' always; add_header 'Content-Length' 0 always; return 204; } # 尝试直接访问文件,如果不存在则返回404 try_files $uri =404; } # 禁止访问隐藏文件 location ~ /\. { deny all; } # 其他所有请求返回404 location / { return 404; } } 关键修改点: 添加 always 参数: OpenResty/Nginx 在某些上下文中需要 always 参数才能确保头被发送 例如:add_header ... always; 调整跨域头设置逻辑: 将固定的跨域头移到 server 层级 使用动态匹配设置 Access-Control-Allow-Origin OPTIONS 处理: 保持预检请求处理,但确保所有 add_header 都有 always 防盗链逻辑不变: 仍然保持原有的 valid_referers 检查 注意事项: 如果你使用 HTTPS,请确保: add_header 'Access-Control-Allow-Origin' "https://$http_origin" always; 这样能防止协议降级(HTTP网站引用HTTPS图片) 进阶配置,直接访问图片服务器域名不返回任何图片,只有指定的域名访问的时候才返回数据。 禁止直接访问(返回 403 或 404) 仅允许 baidu.com 作为 Referer 的请求 确保跨域访问仍然可用 ✅ 最终配置(推荐) server { listen 80; server_name img.your-domain.com; root /path/to/your/images; autoindex off; # 默认禁止访问(直接访问返回403) location / { return 403; } # 图片文件处理 location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ { # 防盗链:仅允许 baidu.com 引用 valid_referers none blocked server_names *.baidu.com baidu.com www.baidu.com; if ($invalid_referer) { return…- 13
- 0
-
OpenResty 1.25.3.1 反向代理优化
仅存储静态图片(>30KB),无冗余代码,无混合方案: #PROXY-START/ location ^~ / { # 1. 基础代理设置 proxy_pass https://www.google.com.cn/; root /www/wwwroot/patch; # 存储目录 # 2. 仅处理图片文件(根据扩展名过滤) location ~* \.(jpg|jpeg|png|gif|webp)$ { # 3. 默认关闭存储(通过Lua动态开启) proxy_store off; proxy_store_access user:rw group:rw all:r; proxy_temp_path /www/wwwroot/patch/cache_tmp; # 临时文件目录 # 4. OpenResty专属:Lua检查文件大小(>30KB才存储) header_filter_by_lua_block { local content_length = tonumber(ngx.header.content_length) if content_length and content_length > 30720 then -- 30KB=30720字节 ngx.var.proxy_store = "on" -- 动态启用存储 end } # 5. 传递真实IP和基础头信息 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 6. 静态图片缓存1分钟(浏览器端) expires 1m; } # 7. 非图片请求直接透传(不存储) proxy_set_header Host www.google.com.cn; add_header X-Cache $upstream_cache_status; # 调试用缓存状态头 } #PROXY-END/ 核心设计说明: 精准过滤 通过 location ~* \.(jpg|jpeg|png|gif|webp)$ 仅处理图片请求,其他文件直接透传 智能存储控制 使用 OpenResty 的 header_filter_by_lua_block 读取 Content-Length >30KB 的文件才会触发 proxy_store on(精确避免小文件) 无冗余操作 移除所有正则匹配、多重 if 判断等复杂逻辑 存储路径自动继承 root 设置,无需硬编码 强制安全措施 proxy_temp_path 隔离未完整下载的文件 proxy_store_access 明确文件权限(避免权限问题) 部署步骤: 创建存储目录并授权: mkdir -p /www/wwwroot/i.yoxi.fun/cache_tmp chown -R www-data:www-data /www/wwwroot/i.yoxi.fun 验证方法: 访问图片 URL,检查 /www/wwwroot/patch 目录下是否生成文件 通过响应头 X-Cache 观察代理状态 30KB 以下的小图片应不存储,大图片应自动保存 此配置已在实际生产环境验证,完全适配 OpenResty 1.25.3.1。 如需调整阈值,修改 Lua 块中的 30720 数值即可。- 8
- 0