Regex 不带参数的Nginx请求\u uri

Regex 不带参数的Nginx请求\u uri,regex,nginx,Regex,Nginx,如何在末尾没有附加参数的情况下获取request\u uri的值。我知道有一个uri变量,但我需要原始值,因为Nginx文档说明: 请求\u uri 此变量等于从接收到的原始请求URI 包括args的客户端。它不能被修改。请查看$uri以了解更多信息 重写/更改后的URI。不包括主机名。例子: “/foo/bar.php?arg=baz” 您正在查找$uri。它没有$args。事实上,$request_uri几乎等同于$uri$args 如果您确实想要完全去掉args的$request\u ur

如何在末尾没有附加参数的情况下获取
request\u uri
的值。我知道有一个
uri
变量,但我需要原始值,因为Nginx文档说明:

请求\u uri

此变量等于从接收到的原始请求URI 包括args的客户端。它不能被修改。请查看$uri以了解更多信息 重写/更改后的URI。不包括主机名。例子: “/foo/bar.php?arg=baz”


您正在查找$uri。它没有$args。事实上,$request_uri几乎等同于$uri$args

如果您确实想要完全去掉args的$request\u uri,您可以这样做

local uri = string.gsub(ngx.var.request_uri, "?.*", "")

您需要有可用的lua,但这将完全满足您的要求。

我使用此地图,它在没有lua的情况下工作:

map $request_uri $request_uri_path {
  "~^(?P<path>[^?]*)(\?.*)?$"  $path;
}
map$request\u uri$request\u uri\u路径{
“~^(?P[^?]*)(\?*)?$”$path;
}

公认的答案为我指明了正确的方向,但经过一段时间的调查,我发现
set\u by\u lua\u block

set_by_lua_block $request_uri_path {
    return string.gsub(ngx.var.request_uri, "?.*", "")
}

我希望它能为来到这里的人节省一些时间。

但正如问题所说,$uri可能会被nginx修改(比如发生错误重定向时)。那么,如何在没有args的情况下获取原始请求(例如$request)呢?这个答案是不正确的,尽管lua片段是正确的。在重写或
try_文件
等情况下,
$uri
将更改为nginx当前正在测试/评估的路径。我正在构建自定义代理缓存密钥,这很有用。您能解释一下这里发生了什么吗。我第一次看到这样的正则表达式。~(表示这是一个正则表达式)^(锚定到url的开头)((组/捕获)?P(将此组捕获到变量$path中)[^?]*(0个或多个字符不是“?”)(结束组)(\?*)?(可能是一个查询字符串,以“?”开头,之后可能还有更多字符)$(url的锚定端)这很有趣,不知道nginx已经命名了regex捕获组,这与使用
$1
IMO不同,这是一个更好的答案,因为它不需要lua脚本,而且出于同样的原因,我怀疑这是更快的编辑:刚刚意识到你已经提出了这一点,但我认为这足够重要,让钢筋站起来