NGINX $request_uri 对比 $uri

NGINX $request_uri vs $uri

您如何确定何时使用 $request_uri$uri

根据 NGINX 文档,$request_uri 是原始请求(例如,/foo/bar.php?arg=baz 包含参数且无法修改)但 $uri 指的是更改后的 URI。

如果 URI 没有改变,$uri = $request_uri?

使用它是不正确的还是更好的还是更坏的:

map $uri $new_uri {
  # do something
}

map $request_uri $new_uri {
  # do something
}

$uri 不等同于 $request_uri.

$uri 变量设置为 nginx 当前正在处理 的 URI - 但它也受到规范化,包括:

  • 删除 ? 和查询字符串
  • 连续 / 个字符被单个 /
  • 字符替换
  • URL 编码字符被解码

$request_uri 的值始终是原始 URI,不受上述任何规范化的影响。

大多数时候您会使用 $uri,因为它已标准化。在错误的地方使用 $request_uri 会导致 URL 个编码字符被双重编码。

如果需要匹配 URI 及其查询字符串,请在 map 指令中使用 $request_uri

proxy_cache_key$uri$request_uri的另一个区别是$request_uri会包含anchor tags part,但$uri$is_args$args会忽略它

执行 curl 操作:curl -I static.io/hello.htm?id=1#/favor/goods

proxy_cache_key $scheme://$host$uri$is_args$args; => Cache KEY: http://static.io/hello.htm?id=1
proxy_cache_key $scheme://$host$request_uri; => Cache KEY: http://static.io/hello.htm?id=1#/favor/goods

Nginx 文档:http://nginx.org/en/docs/http/ngx_http_core_module.html#var_request_uri

  • $request_uri:完整的原始请求 URI(带参数)
  • $uri: 请求中的当前 URI,规范化 $uri 的值可能会改变 在请求处理期间,例如在进行内部重定向时,或 使用索引文件时。

代理缓存键: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_cache_key