在两个不同的目录中查找要投放的文件时,如何正确使用try_files?

时间:2018-11-28 15:33:39

标签: nginx nginx-location

我对Nginx还是很陌生,所以我可能会误解try_files可以做什么。

对于我的本地开发设置,我有多个安装,每个安装都可以通过各自的子域访问。这些安装正在迁移到新的文件夹结构中,但是我仍然希望能够同时支持这两种安装。通过git拉出时,新的完整路径如下所示:

/home/tom/git/project/v3/[installation]/public/

旧结构的目录更深1个,如下所示:

/home/tom/git/project/v3/[installation]/workspace/public

根据安装名称installation是可变的,/ public文件夹将是nginx的根目录。

根由子域确定,并通过正则表达式提取,如下所示:

server_name ~^(?<subdomain>[^.]+)\.local\.project\.test;

到目前为止,我已经设法使所有这些工作都适用于一种文件夹结构,但不能同时使用。我在本地域的Nginx配置如下所示。以下是我尝试过的方法,但似乎无法正常工作。一旦我将@workspace命名的位置作为try_files的后备传递,它总是默认为404。

index index.html index.htm index.nginx-debian.html index.php;

server_name ~^(?<subdomain>[^.]+)\.local\.project\.test;

root /home/tom/git/project/v3/$subdomain/public/;

location / {
        try_files $uri @workspace =404;
}

location @workspace {
        root /home/tom/git/project/v3/$subdomain/workspace/public/;
        try_files $uri =404;
}

我还尝试了缩短根并将以下参数传递给try_files

root /home/tom/git/project/v3/$subdomain;
location / {
        try_files /public/$uri /workspace/public/$uri =404;
}

但是它仍然默认为404,以$uri/作为第三个参数,它将发出403禁止尝试列出根目录索引。

我希望有人可以就如何解决我面临的这个问题提供一些建议或替代方案。如果我需要提供其他数据,请告诉我

谢谢。

1 个答案:

答案 0 :(得分:1)

命名位置必须是try_files语句的最后一个元素。

例如:

location / {
    try_files $uri @workspace;
}
location @workspace {
    ...
}

有关详细信息,请参见this document


$uri变量包含前导/,因此您构造的路径名包含//,这可能是它们失败的原因。

例如:

location / {
    root /home/tom/git/project/v3/$subdomain;
    try_files /public$uri /workspace/public$uri =404;
}