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
}
159008 次浏览

$uri不等于 $request_uri

$uri变量被设置为 URI,即 nginx正在处理-但它也受到标准化的影响,包括:

  • 删除 ?和查询字符串
  • 连续的 /字符被单个 /字符替换
  • 对 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会忽略它

做一个卷曲运算:

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 的值可能发生变化 在请求处理过程中,例如进行内部重定向时,或 在使用索引文件时。

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