nginx $http_ 详解

652 阅读1分钟

在 Nginx 中,$http_ 变量前缀用于访问客户端请求中的任意 HTTP 头部字段。这个功能使得 Nginx 可以根据请求头的内容执行各种操作,比如重写、重定向、日志记录等。

$http_ 变量的使用

  • 格式$http_ 后面跟随请求头的名称,所有字母都转为小写,连字符(-)替换为下划线(_)。
  • 示例
    • User-Agent 头部对应的变量是 $http_user_agent
    • Referer 头部对应的变量是 $http_referer
    • Cookie 头部对应的变量是 $http_cookie

使用场景

  1. 条件重写和重定向

    • 根据请求头的内容重写 URL 或执行重定向。
    if ($http_user_agent ~* "Mobile") {
        return 301 http://m.example.com$request_uri;
    }
    
  2. 访问控制

    • 根据请求头控制访问权限。
    if ($http_referer !~* "trustedsite.com") {
        return 403;
    }
    
  3. 缓存控制

    • 使用请求头信息来决定是否缓存请求或如何处理缓存。
    location / {
        if ($http_cache_control ~* "no-cache") {
            set $no_cache 1;
        }
    }
    
  4. 日志记录

    • 在日志中记录特定的请求头信息。
    log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log /var/log/nginx/access.log custom;
    
  5. 反向代理

    • 将特定的请求头转发给后端服务器。
    location / {
        proxy_pass http://backend;
        proxy_set_header X-Custom-Header $http_custom_header;
    }
    

注意事项

  • 大小写转换:由于 HTTP 头部名称不区分大小写,Nginx 将所有头部名称转换为小写并用下划线替代连字符。
  • 安全性:请求头可以被客户端伪造,因此在使用 $http_ 变量时,特别是涉及安全和访问控制的场景中,需要进行适当的验证和处理。
  • 性能:过多地使用复杂的正则表达式匹配请求头可能会影响性能,建议在必要时使用。

通过灵活使用 $http_ 变量,Nginx 可以根据客户端请求头的内容实现更复杂和动态的响应处理,从而提升应用的灵活性和功能性。