<p>使用 location ~* .(jpg|jpeg|png|gif|webp|avif)$ 可高效、准确匹配图片请求并忽略大小写;需配合 root 或 alias 指定文件路径,注意二者行为差异;正则规则应置于前缀匹配(如 ^~ /images/)之后以防被跳过;建议添加 expires 缓存与 valid_referers 防盗链提升性能与安全。</p>

直接用 location ~* 配合简洁正则,就能高效分发图片资源。重点不是写多复杂的表达式,而是让匹配准确、不冲突、不回溯,同时搭配好路径和缓存策略。
用 ~* 匹配常见图片后缀,忽略大小写
用户请求可能是 /logo.JPG、/banner.png 或 /icon.GIF,统一用不区分大小写的 ~* 最稳妥:
-
推荐写法:
location ~* \.(jpg|jpeg|png|gif|webp|avif)$ - 结尾的
$很关键——确保只匹配以这些后缀结尾的 URI,避免误伤/api.jpg/xxx这类路径 - 别用
~ \.(JPG|PNG),小写请求会跳过规则;也别用~* \.jpe?g$,问号在部分 Nginx 版本中可能引发回溯
搭配 root 或 alias 指定真实文件位置
光匹配不行,得告诉 Nginx 去哪找文件。注意 root 和 alias 行为完全不同:
-
用
root(适合静态资源集中存放):location ~* \.(jpg|png)$ { root /var/www/static; expires 30d; }
请求/upload/cat.jpg→ 对应磁盘路径/var/www/static/upload/cat.jpg -
用
alias(适合映射到独立目录):location ~* ^/cdn/(.+)\.(jpg|png)$ { alias /data/pics/$1.$2; expires 1y; }
请求/cdn/dog.jpg→ 直接指向/data/pics/dog.jpg,不拼接前缀
放在合适的位置,避免被其他规则覆盖
Nginx 不按配置顺序选 location,而是按优先级:先找 = 和 ^~,再轮到正则。所以:
- 把图片正则块放在所有
^~ /static/、^~ /images/等前缀规则之后 - 如果已有
location ^~ /images/,那/images/logo.png就不会进正则块——这是预期行为,不是 bug - 不要在同一个配置里又写
location ~ \.jpg$又写location ~* \.png$,一个~*覆盖全部更清晰、更可靠
顺手加上缓存与防盗链(可选但实用)
图片是典型静态资源,加缓存能明显减压;加 Referer 控制可防盗链:
- 缓存示例:
expires 1y;或add_header Cache-Control "public, immutable"; - 防盗链示例:
valid_referers none blocked *.yourdomain.com;<br> if ($invalid_referer) { return 403; }
其中none放行直接访问(如输入网址),blocked放行被插件清空 Referer 的情况


















