如何确定何时使用$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
}
答案 0 :(得分:24)
$uri
不等同于$request_uri
。
$uri
变量设置为nginx
当前正在处理的URI - 但它也需要进行规范化,包括:
?
和查询字符串/
个字符将替换为单个/
$request_uri
的值始终是原始URI,不受上述任何规范化的约束。
大多数情况下,您会使用$uri
,因为它已标准化。在错误的位置使用$request_uri
会导致URL编码字符变为双重编码。
如果需要匹配URI及其查询字符串,请在$request_uri
指令中使用map
。
答案 1 :(得分:3)
$uri
中$request_uri
和proxy_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