nginx无法直接返回纯文本占位文字,最实用方案是用内嵌“禁止盗链”文字的png/jpg降级图(如/assets/banned.png),通过rewrite ... break重写非法图片请求至该图路径,保持url不变且体验自然。

直接返回占位文字在 Nginx 中不可行,因为 Nginx 本身不支持动态生成纯文本响应体(如“禁止盗链”四个字);它只能返回状态码、重定向、或静态文件内容。所谓“占位文字”,实际需通过一张含文字的图片(如 PNG)、一个 HTML 提示页,或配合后端返回文本——但若坚持纯 Nginx 方案,最实用、最轻量的做法是用一张内嵌文字的降级图。
用一张带文字的图片作为降级资源
这是最常见也最稳妥的方式:提前准备一张尺寸合适、背景简洁、文字清晰的 PNG 或 JPG(例如 /assets/banned.png),里面写明“禁止盗链”或公司标识等提示信息,放在 Nginx 可访问的目录下(如 /usr/share/nginx/html/assets/)。
- 确保该图片能被直接访问,比如浏览器打开
https://yourdomain.com/assets/banned.png可正常显示 - 在防盗链 location 块中用
rewrite或return指向它,而非尝试输出纯文本 - 推荐使用
rewrite ... break,避免外部重定向,保持 URL 不变、体验更自然
配置示例:匹配图片请求并降级到提示图
以下配置放在 server 或对应 location 块内(注意作用域一致):
location ~* \.(jpg|jpeg|png|webp|gif|bmp)$ {
valid_referers none blocked yourdomain.com *.yourdomain.com;
if ($invalid_referer) {
rewrite ^(.*)$ /assets/banned.png break;
}
}
说明:
-
valid_referers none blocked ...表示允许空 Referer(直接输入地址访问)、被代理屏蔽 Referer 的情况,以及你自己的域名和子域名 -
if ($invalid_referer)是 Nginx 内置判断,值为 1 即触发 -
rewrite ^(.*)$ /assets/banned.png break;把所有非法请求重写为提示图路径,break表示在当前 location 内完成,不重新匹配其他 location
替代方案:返回简单 HTML 提示页
如果希望显示可读性更强的文字(如带链接、样式、多行说明),可用一个极简 HTML 文件代替图片:
- 新建
/usr/share/nginx/html/deny.html,内容例如:<h2>⛔ 禁止盗链</h2> <p>该资源仅限本站使用</p> - 将 rewrite 改为:
rewrite ^(.*)$ /deny.html break; - 注意 MIME 类型会自动识别为
text/html,浏览器可正确渲染
为什么不建议用 return + text/plain?
Nginx 的 return 指令仅支持返回状态码、重定向 URL 或极简响应体(如 return 403 "Forbidden";),但该响应体默认无 Content-Type,且无法设置字符集、换行、样式;浏览器可能乱码或不渲染。更重要的是,多数 CDN 和浏览器对纯文本 403 响应缺乏友好展示,用户体验差。相比之下,一张图或一个 HTML 页可控性强、兼容性好、视觉明确。











