如何将Nginx请求头校验逻辑移入公共文件并实现复用?
Nginx虚拟主机请求头校验公共配置解决方案
方案1:直接在server块中引入完整location校验配置
这是最直接的复用方式,确保公共文件内容符合Nginx的server子指令规则:
- 创建
common_header_check.conf文件,内容如下:
location / { if ($http_my_request_header_name != "<mytoken>") { return 406; } }
- 在需要校验的虚拟主机
server块内引入该文件:
server { listen 80; server_name your-domain.com; # 引入公共校验配置 include /etc/nginx/snippets/common_header_check.conf; # 其他虚拟主机配置(如站点根目录、反向代理等) root /var/www/html; index index.html; }
- 验证配置并重启Nginx:
nginx -t systemctl reload nginx
若之前报错,优先检查文件路径是否正确,或用nginx -t查看具体语法错误提示。
方案2:用map指令优化校验逻辑(推荐)
Nginx的map指令更适合变量映射,能避免if在location中的潜在兼容性问题:
- 创建
common_header_map.conf文件,用于定义校验变量:
map $http_my_request_header_name $is_header_valid { default 0; # 请求头缺失/无效时为0 "<mytoken>" 1; # 请求头匹配时为1 }
- 在
nginx.conf的http块中引入该map配置:
http { include /etc/nginx/mime.types; default_type application/octet-stream; # 引入map配置 include /etc/nginx/snippets/common_header_map.conf; # 其他HTTP级配置... }
- 创建
common_header_check.conf文件,存放校验逻辑:
if ($is_header_valid != 1) { return 406; }
- 在需要的虚拟主机
location块内引入校验逻辑:
server { listen 80; server_name your-domain.com; location / { # 引入校验逻辑 include /etc/nginx/snippets/common_header_check.conf; # 其他location配置 root /var/www/html; } }
这种方式可在多个location或server中复用$is_header_valid变量,扩展性更强。
排查注意事项
- 优先使用绝对路径指定include文件,避免相对路径导致的找不到文件问题。
- 任何配置修改后必须执行
nginx -t验证,错误信息会明确指出问题位置。 - 公共配置文件中不要嵌套多余的
server块,server只能作为http块的子指令存在。
内容的提问来源于stack exchange,提问作者Lajos Arpad
相关产品推荐
相关产品推荐

