NGINX $ request_uri vs $ uri

时间:2018-02-09 14:46:59

标签: nginx uri

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

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

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

使用时是不正确,更好还是更差:

map $uri $new_uri {
  # do something
}

VS

map $request_uri $new_uri {
  # do something
}

2 个答案:

答案 0 :(得分:24)

$uri不等同于$request_uri

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

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

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

大多数情况下,您会使用$uri,因为它已标准化。在错误的位置使用$request_uri会导致URL编码字符变为双重编码。

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

答案 1 :(得分:3)

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

执行卷曲操作: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