try_files
' 签名是try_files file ... uri;
,因此人们通常使用它来执行类似如果文件 1 存在则提供文件 1,否则如果文件 2 存在则提供文件 2,否则将决定传递给不同的location
块(针对上述的块uri
)。
我可以以某种方式仅使用最后一部分吗?这意味着,不要尝试提供任何文件,只需将请求传递给不同的location
块。不提及任何文件的简单想法会失败nginx: [emerg] invalid number of arguments in "try_files" directive
。
一种解决方法是写入try_files /does/not/exist.html /some/uri;
,但它看起来很丑陋并且可能会因检查不存在的文件的存在而受到惩罚。
就上下文而言,我为什么需要这个?
我有一个像这样的配置
location /path/ {
try_files $uri $uri/index.html =404;
alias /some/dir/;
expires 604800;
}
不幸的是,这不匹配/path
(没有尾随/
)。你可以简单地写location /path
,但它据说导致路径遍历。
我的想法是再添加一个处理程序
location = /path {
<do the same as for /path/>
}
我当然可以复制alias
和try_files
那里,但这样我还必须复制expires
指令和可能的其他指令并使它们保持同步。
答案1
是的,rewrite
这里很好,只需添加一个块location
/path
并使用重写将请求重定向到/path/
块,就像这样
location = /path {
rewrite ^ /path/ last;
}
location /path/ {
try_files $uri $uri/index.html =404;
alias /some/dir/;
expires 604800;
}