在 Nginx 中,$http_ 变量前缀用于访问客户端请求中的任意 HTTP 头部字段。这个功能使得 Nginx 可以根据请求头的内容执行各种操作,比如重写、重定向、日志记录等。
$http_ 变量的使用
- 格式:
$http_后面跟随请求头的名称,所有字母都转为小写,连字符(-)替换为下划线(_)。 - 示例:
User-Agent头部对应的变量是$http_user_agentReferer头部对应的变量是$http_refererCookie头部对应的变量是$http_cookie
使用场景
-
条件重写和重定向:
- 根据请求头的内容重写 URL 或执行重定向。
if ($http_user_agent ~* "Mobile") { return 301 http://m.example.com$request_uri; } -
访问控制:
- 根据请求头控制访问权限。
if ($http_referer !~* "trustedsite.com") { return 403; } -
缓存控制:
- 使用请求头信息来决定是否缓存请求或如何处理缓存。
location / { if ($http_cache_control ~* "no-cache") { set $no_cache 1; } } -
日志记录:
- 在日志中记录特定的请求头信息。
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; -
反向代理:
- 将特定的请求头转发给后端服务器。
location / { proxy_pass http://backend; proxy_set_header X-Custom-Header $http_custom_header; }
注意事项
- 大小写转换:由于 HTTP 头部名称不区分大小写,Nginx 将所有头部名称转换为小写并用下划线替代连字符。
- 安全性:请求头可以被客户端伪造,因此在使用
$http_变量时,特别是涉及安全和访问控制的场景中,需要进行适当的验证和处理。 - 性能:过多地使用复杂的正则表达式匹配请求头可能会影响性能,建议在必要时使用。
通过灵活使用 $http_ 变量,Nginx 可以根据客户端请求头的内容实现更复杂和动态的响应处理,从而提升应用的灵活性和功能性。