简述Nginx Rewrite全局变量 ?
参考回答
在 Nginx 中,rewrite
是一种非常强大的 URL 重写机制,它允许你基于请求的 URL 对请求进行重定向或者改变。Nginx 提供了一些全局变量,可以在 rewrite
中使用,来实现动态的 URL 处理。常见的 rewrite
全局变量包括:
- $uri:当前请求的 URI(路径部分),不包含查询参数。
- $args:当前请求的查询字符串部分,不包含问号
?
。 - $query_string:与
$args
相同,表示完整的查询字符串。 - $request_uri:原始请求 URI,包含查询字符串部分。
- $remote_addr:客户端的 IP 地址。
- $remote_user:客户端提供的 HTTP 认证用户。
- $http_user_agent:请求中的
User-Agent
字段。 - $request_method:请求的方法,如
GET
或POST
。
详细讲解与拓展
1. $uri
- 定义:
$uri
变量表示当前请求的路径部分,不包含查询字符串(即 URL 中问号?
后的部分)。 - 常用场景:当我们需要根据 URL 路径来进行重写时,使用
$uri
变量。rewrite ^/oldpath$ /newpath permanent;
在这个例子中,如果请求的 URL 是
/oldpath
,Nginx 会将请求重定向到/newpath
。
2. $args 和 $query_string
- 定义:
$args
表示请求中的查询字符串部分(即问号后的部分),但不包含问号本身;$query_string
与$args
相同,通常二者可以互换使用。 -
常用场景:当你需要重写 URL 并传递查询参数时,使用
$args
或$query_string
可以保留原始的查询字符串。rewrite ^/search/newsearch?args;
如果请求
/search?query=test
,Nginx 会将请求重定向为/newsearch?query=test
。
3. $request_uri
- 定义:
$request_uri
包含请求的完整 URI,包含路径和查询字符串。它表示的是请求原始的 URL。 -
常用场景:当你需要访问原始请求的完整 URL,尤其是查询字符串时,使用
$request_uri
。rewrite ^/oldpagerequest_uri redirect;
如果请求
/oldpage?param=value
,Nginx 会将请求重定向到/oldpage?param=value
。
4. $remote_addr
- 定义:
$remote_addr
包含客户端的 IP 地址。 -
常用场景:当你需要基于客户端 IP 地址进行某些重定向或访问控制时,可以使用该变量。
rewrite ^/restricted/access_denied?ip=remote_addr;
如果客户端的 IP 地址是
192.168.1.1
,请求/restricted
会被重定向到/access_denied?ip=192.168.1.1
。
5. $remote_user
- 定义:
$remote_user
变量包含客户端在 HTTP 认证中提供的用户名。 -
常用场景:当你需要根据 HTTP 认证的用户名来进行不同的处理时,可以使用此变量。
rewrite ^/profile/user/remote_user;
如果用户登录时提供的用户名是
alice
,请求/profile
会被重定向到/user/alice
。
6. $http_user_agent
- 定义:
$http_user_agent
变量包含请求中的User-Agent
头部信息,用来标识客户端的软件(通常是浏览器的类型和版本)。 -
常用场景:当你需要基于用户的浏览器类型进行不同的处理时,使用此变量。
rewrite ^/mobile/mobile_version?browser=http_user_agent;
如果请求的
User-Agent
是Mozilla/5.0
,请求/mobile
会被重定向到/mobile_version?browser=Mozilla/5.0
。
7. $request_method
- 定义:
$request_method
变量包含当前请求的 HTTP 方法,例如GET
、POST
、PUT
等。 -
常用场景:在某些情况下,可能需要根据请求的方法来进行 URL 重写。例如,允许 POST 请求访问某个页面,而 GET 请求被重定向。
if (request_method = POST) { rewrite ^/submit /process_submission redirect; }
只有在请求方法为
POST
时,/submit
的请求才会被重定向到/process_submission
。
总结
Nginx 提供的 rewrite
全局变量可以用来处理 URL 重写时的动态数据。通过使用这些变量,Nginx 可以根据请求的路径、查询字符串、IP 地址、浏览器信息等条件进行灵活的 URL 重写和重定向。合理使用这些全局变量,可以有效地提高 Nginx 配置的灵活性和扩展性。