nginx静态文件由自身直接返回,动态请求交由后端处理;通过路径前缀+扩展名正则双保险匹配静态资源,精确覆盖根目录文件与各类扩展名,严格阻断静态请求转发至后端,并强化性能与安全策略。

核心思路很明确:静态文件由 Nginx 直接读取并返回,不经过任何后端;动态请求(如 /api/、/login、.php、.jsp 等)必须全部交由后端应用服务器处理,Nginx 仅作反向代理。所谓“严密”,体现在路径覆盖无遗漏、扩展名匹配无死角、缓存策略合理、安全防护到位、动静边界清晰不可绕过。
精准匹配所有静态资源路径与扩展名
不能只靠 location /static/ 这类前缀匹配——它漏掉根目录下的 favicon.ico、robots.txt,也漏掉部署在不同路径的 JS/CSS。必须组合使用路径前缀 + 扩展名正则双保险:
-
location ^~ /static/ { alias /data/web/static/; expires 1y; }—— 优先匹配以/static/开头的请求,用alias避免路径拼接错误 -
location ^~ /assets/ { alias /data/web/assets/; expires 1y; }—— 同理覆盖常见前端构建产物目录 -
location ~* \.(?:html|htm|css|js|json|txt|xml|ico|png|jpe?g|gif|webp|svg|woff2?|ttf|eot|mp4|webm|ogg)$ { root /data/web; expires 1y; add_header Cache-Control "public, immutable"; }—— 兜底匹配所有主流静态扩展名,immutable告诉浏览器永不验证(适合带哈希指纹的文件) -
location = /robots.txt { alias /data/web/robots.txt; }—— 单文件精确匹配,避免被其他正则误伤
彻底阻断静态资源经由后端处理的可能
严密性关键在于“防绕过”。即使后端(如 Tomcat)本就暴露在内网,也要确保 Nginx 层面绝不把静态请求转发过去:
- 所有
proxy_pass指令必须放在明确的动态规则块里,且该块不能被静态规则覆盖。推荐将动态入口统一收口到location /或location /api/,其余全为静态 - 显式拒绝可疑静态路径访问后端:
location ~* ^/(?:WEB-INF|META-INF|\.git|\.env|\.htaccess) { return 403; } - 禁用 Nginx 的自动索引和默认首页解析:
autoindex off;,index index.html;仅保留必要项,避免index.php被意外触发
强化静态托管性能与安全性
极速托管不只是“能返回”,还要“快、稳、省”:
-
sendfile on;+tcp_nopush on;—— 启用内核零拷贝传输,减少上下文切换 -
gzip on; gzip_types text/css application/javascript image/svg+xml;—— 对文本类静态资源压缩,节省带宽 -
add_header X-Content-Type-Options nosniff;+add_header X-Frame-Options DENY;—— 防 MIME 嗅探和点击劫持 - 静态资源目录权限设为只读,Nginx worker 进程仅需读取权限,杜绝写入风险
验证是否真正严密
配置生效后,务必通过以下方式交叉验证:
- 用
curl -I http://your.site/logo.png查看响应头:应含200 OK、Cache-Control: public, immutable、无X-Powered-By或Server: Apache类后端标识 - 访问一个已知存在的 JS 文件,同时抓包确认 TCP 层无连接后端 IP 和端口
- 尝试访问
/WEB-INF/web.xml,应返回403 Forbidden,而非后端报错页面或 404 - 用
nginx -t检查语法,并确认location匹配顺序符合预期(前缀匹配 > 正则匹配)











