我在这里遇到了一些使用这种语法的问题和答案:
location @default {
# ...
}
location /somewhere {
try_files $uri @default;
}
我在 Google 上搜索了好久,但似乎找不到任何相关文档。它是什么意思?它有哪些实际用途?它是某种变量声明和赋值吗?抱歉,这是新手的问题。
答案1
答案就在官方文档。
“@”前缀定义命名位置。此类位置不用于常规请求处理,而是用于请求重定向。它们不能嵌套,也不能包含嵌套位置。
答案2
在您在问题中引用的例子中:
location @default {
# ...
}
location /somewhere {
try_files $uri @default;
}
如果传入请求是在http://你的域名/某处,则位置与 /somewhere 匹配,它会按顺序在两个地方尝试查找响应,如 try_files 指令所指定,并以第一次成功的尝试进行响应。
- 首先,它测试位置 /somewhere 处是否存在文件,如果该文件存在,则在响应中返回该文件。
- 如果失败,它会尝试 try_files 后备选项 @default,它被称为命名位置. 对此的回应命名位置由指令指定
location @default
。命名位置永远不会匹配传入的请求,并通过引用来指定其他位置指令中的响应。
通过这种方式,如果语句可以避免(如果文件存在,则使用它,否则按照 location @default 指令中的指定进行响应)。因此它可以用作 if 条件的简写。“If”语句绝对是 nginx 作者“不赞成”的(if 是邪恶的) 因为它们有一些局限性并且可能无法产生预期的结果。