最彻底的静态资源cookie剥离是通过独立域名或路径隔离:用static.example.com子域或/static/路径,配合nginx独立server/location块、严格cookie domain设置、禁用set-cookie及冗余响应头,确保请求头无cookie、响应头精简。

核心思路很明确:让静态资源走独立域名或路径,彻底隔离 Cookie 传输。浏览器只在匹配 domain 和 path 的请求中自动携带 Cookie,所以只要静态资源不落在带 Cookie 的域下,HTTP 请求头里根本就不会出现 Cookie 字段——这才是最彻底的“剥离”,不是靠服务端过滤,而是从源头消除。
用独立子域完全隔离 Cookie
把所有静态资源(js/css/img/fonts 等)统一放在 static.example.com 这类专用子域下,主站 www.example.com 负责动态内容并设置登录态 Cookie。Nginx 配置一个单独的 server 块监听 static.example.com,且该块里不设任何 set_cookie 指令、不代理后端应用、不读取 session。这样浏览器对 static.example.com 的每次请求,请求头里自然没有 Cookie。
- 主站 Cookie 设置时必须指定 domain=example.com(而非 .example.com),避免被 static 子域继承
- 若业务强制要求所有子域共享登录态,那就换方案:买一个全新域名如 cdn-yourbrand.com 专供静态资源,彻底物理隔离
- 检查前端资源引用地址,确保所有
<link>、<script></script>、<img>的 src/href 都是 //static.example.com/ 开头
用路径前缀 + location 分离,零 DNS 成本
如果暂无法配置子域,可用 /static/ 或 /assets/ 这类固定路径前缀区分静态资源,并在 Nginx 中用独立 location 块处理:
- location ~ ^/static/ { root /var/www/static; expires 1y; add_header Cache-Control "public, immutable"; }
- 关键点:这个 location 块内不 proxy_pass 到任何带 Session 的后端,也不调用 auth 模块;同时确保主 server 块里设置的 Cookie domain 不匹配 /static/ 路径(例如 Cookie path=/,但 domain=www.example.com,则 /static/ 请求不会自动带上)
- 配合前端构建工具,把所有静态资源打包路径统一改为 /static/ 开头,避免混入 /api/ 或 /user/ 等带 Cookie 的路径
彻底禁用响应头中的 Set-Cookie 并校验透传
即使走了独立 server 或 location,也要防止意外透传。在静态资源 server 块中显式关闭所有可能触发 Cookie 的行为:
- add_header Set-Cookie ""; —— 清空响应头(部分旧客户端仍会识别空值)
- underscores_in_headers off; —— 防止恶意 header 名含下划线被误解析为 Cookie 相关字段
- fastcgi_hide_header Set-Cookie; proxy_hide_header Set-Cookie; —— 若上游用了 PHP-FPM 或反向代理,必须加这两行
- 用 curl -I https://static.example.com/main.css 实测响应头,确认无 Set-Cookie,再用浏览器开发者工具 Network 标签页查看实际请求头,确认无 Cookie 字段
配套优化:让首部体积进一步压缩
剥离 Cookie 只解决请求头,响应头也要精简才能真正降低首部开销:
- server_tokens off; —— 隐藏 Nginx 版本号
- etag off; —— 静态资源强缓存下 ETag 无意义,还占字节
- add_header Cache-Control "public, max-age=31536000, immutable"; —— 用 immutable 替代 Last-Modified,减少条件请求
- 若已编译 headers-more-nginx-module,用 more_clear_headers 'X-Powered-By' 'X-AspNet-Version'; 彻底删掉冗余头











