跳到主要内容

Nginx 变量使用

介绍

在Nginx配置中,变量是一个强大的工具,它允许你动态地处理请求和响应。通过使用变量,你可以根据不同的条件或上下文来调整Nginx的行为,从而实现更灵活和高效的配置。

变量在Nginx中通常以 $ 符号开头,例如 $host$request_uri 等。这些变量可以用于各种场景,如重定向、日志记录、条件判断等。

基本语法

Nginx变量的基本语法非常简单。变量名以 $ 开头,后面跟着变量名称。例如:

nginx
$host
$request_uri
$remote_addr

这些变量可以在Nginx配置文件的任何地方使用,例如在 location 块、if 条件语句、rewrite 指令等。

常见变量

以下是一些常见的Nginx变量及其用途:

  • $host: 当前请求的主机名。
  • $request_uri: 完整的请求URI,包括查询参数。
  • $remote_addr: 客户端的IP地址。
  • $scheme: 请求的协议(如 httphttps)。
  • $args: 请求的查询参数。
  • $http_user_agent: 客户端的用户代理字符串。

代码示例

以下是一个简单的Nginx配置示例,展示了如何使用变量:

nginx
server {
listen 80;
server_name example.com;

location / {
if ($http_user_agent ~* "Mobile") {
return 301 /mobile$request_uri;
}
return 200 "Hello, $host!";
}
}

在这个示例中,我们使用了 $http_user_agent 变量来检测客户端是否为移动设备。如果是移动设备,Nginx会将请求重定向到 /mobile 路径。否则,Nginx会返回一个包含 $host 变量的响应。

实际应用场景

1. 动态重定向

假设你有一个网站,希望根据用户的地理位置将其重定向到不同的页面。你可以使用 $geoip_country_code 变量来实现这一功能:

nginx
http {
geoip_country /usr/share/GeoIP/GeoIP.dat;

server {
listen 80;
server_name example.com;

location / {
if ($geoip_country_code = "US") {
return 301 /us$request_uri;
}
if ($geoip_country_code = "CN") {
return 301 /cn$request_uri;
}
return 200 "Welcome to the global site!";
}
}
}

2. 自定义日志格式

你可以使用变量来定义自定义的日志格式,以便记录更多有用的信息:

nginx
http {
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

server {
listen 80;
server_name example.com;

access_log /var/log/nginx/access.log custom;

location / {
return 200 "Hello, $host!";
}
}
}

在这个示例中,我们定义了一个名为 custom 的日志格式,并使用 access_log 指令将其应用到服务器块中。

总结

Nginx变量是一个强大的工具,可以帮助你实现更灵活和动态的配置。通过掌握变量的基本语法和常见用途,你可以更好地控制Nginx的行为,满足各种复杂的业务需求。

附加资源

练习

  1. 修改上面的动态重定向示例,使其支持更多的国家和地区。
  2. 创建一个自定义日志格式,记录请求的处理时间($request_time)。
  3. 使用 $args 变量,实现一个根据查询参数返回不同响应的Nginx配置。
提示

在修改Nginx配置后,记得使用 nginx -t 命令测试配置文件的语法是否正确,然后使用 nginx -s reload 重新加载配置。