飘在云端

东西南北,海角天涯

· 前端webServer · · 52次浏览

nginx 增加 header 不生效的一个原因

用的 Nginx,对某个站点的子路径配置了 header,结果发现没生效,server 段的 add_header 倒是继承到了子路径上面
但是我不能在 server 段直接配置 header,因为这个 header 是针对子路径设定的,不能在 server 段配置
header 名不是什么保留字符,特殊字符,而是 nginx 的内置常用 header charset utf-8
尝试改成 add_header Content-Type "charset=UTF-8";
不出意外根本就看不到,网站套了层 cdn,但是不太可能没透传,关闭 CDN 验证,证实与 CDN 无关
这里我当然可以在 CDN 上面配置修改源站的 header,但是为了统一管理和方便修改的一致性,决定在源站实现

这时想起来一件事,nginx 配置的 location 是有优先级的

我的配置是

location /temptest/ {
add_header Content-Type "text/plain; charset=UTF-8";
add_header 'Access-Control-Allow-Origin' $http_origin always;
#add_header 'Access-Control-Allow-Origin' '*' always;
add_header 'Access-Control-Allow-Headers' $http_access_control_request_headers always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
add_header 'Access-Control-Max-Age' 86400 always;
add_header 'Access-Control-Allow-Methods' 'PUT,GET,POST,DELETE,HEAD,TRACE,OPTIONS,PATCH,CONNECT,COPY,LOCK,MKCOL,MOVE,PROPPATCH,PROPFIND,UNLOCK' always;
 if ($request_method = 'OPTIONS') {
    return 204 always;
   }
}

Nginx 使用不同的 location 匹配规则来处理请求,规则的优先级决定了哪个 location 块会被应用

找到了一个介绍比较详细的文章:https://cloud.tencent.com/developer/article/1119218

实际应用中,我改成了

location ~* ^/temptest/.*\.log$

并让它保持在 server 段的靠前位置,最后重载 nginx,实时生效,header 终于出来了

然后又掉坑了,之前测试时加的 header 也出来了,Ctrl + F5 强制刷新页面,注释掉、删掉 header,重启 nginx 也没用
只能怀疑到 CDN 上面,检查发现 CDN 侧配置了离线缓存,最后使用 api 清空 CDN 缓存,自定义的测试 header 才消失

评论 (0条)