add_header
指令不会自动继承父作用域的头部设置add_header
覆盖add_header
可能导致预期外的行为server {
# 父作用域的头部
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
location / {
# 子作用域需要重新声明所有需要的头部
add_header X-Frame-Options "DENY";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
# 其他配置...
}
}
location / {
# 合并多个值到同一个头部
add_header Cache-Control "public";
add_header Cache-Control "max-age=3600"; # 这会覆盖上面的设置
# 正确做法是合并到一行
add_header Cache-Control "public, max-age=3600";
}
location / {
# 避免在if块中直接使用add_header
set $add_header "";
if ($request_method = POST) {
set $add_header "X-Custom-Header: Value";
}
# 在if块外应用头部
add_header X-Custom-Header $add_header if_not_empty;
}
使用 include 文件:将常用头部配置放在单独文件中
include /etc/nginx/security_headers.conf;
使用 map 指令处理复杂逻辑
map $http_user_agent $x_frame_options {
default "DENY";
"~*MSIE 8\." "ALLOW-FROM https://example.com";
}
server {
add_header X-Frame-Options $x_frame_options;
}
考虑使用 headers_more 模块:提供更灵活的头部控制
load_module modules/ngx_http_headers_more_filter_module.so;
more_set_headers 'Server: Custom';
curl -I
检查实际返回的头部nginx -T
测试配置通过以上方法,可以有效解决 Nginx 中 add_header
的各种配置问题。