用的 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 才消失