【问题标题】:Nginx try_files (folders + files) fallbackNginx try_files(文件夹+文件)回退
【发布时间】:2012-02-15 00:34:29
【问题描述】:

鉴于此文件夹结构:

root folder
    + default
        + settings1.txt
        + settings2.txt
        ...
        + settingsN.txt
    + user00001
        + settings1.txt
        ...
    ...
    + userN
        + settings1.txt
        ...

还有这个示例网址:

domain.com/user00009/settings1.txt

或者

domain.com/xavi/somefile.txt

我想写一条规则让我这样做:

folder exists ? check file : 404

file exists ? serve users file : serve default file

我尝试使用 try_files,但我认为我只能使用 $uri 来获取整个 url,如果我可以使用 slug($1 = user00009 & $2 = settings1.txt)会很棒

那么也许我可以说:

location / {
   root /...
   try_files $1/$2 default/$2 =404;
}

有什么想法吗?

注意:我知道我可以从 nginx 外部(在本例中为 django)提供文件,但我试图加快速度

【问题讨论】:

    标签: nginx


    【解决方案1】:
    location ~ ^(/[^/]+)(/.+)$ {
      root ...;
      if (!-d "$document_root$1") {
        return 404;
      }
      try_files $1$2 /default$2 =404;
    }
    

    【讨论】:

    • 谢谢@Alexander,我知道这可能与正则表达式有关,但如果文件夹和文件名没有用模式命名怎么办?而不是 user0001:alexanderazarov 而不是 settings1.txt:finance.txt?
    • 似乎这一行: if (! -d $document_root$1) { 给我一个错误:S
    • 是否存在使正则表达式不那么具体的问题?请查看我的编辑。我也将条件的参数用双引号括起来,但坦率地说,我不确定 nginx 在这种情况下是否允许 $document_root。您最好尝试这些编辑,但可能您必须改写 /var/root$1
    • 部分工作,我不得不删除 !和 -d (之前:!_-d 现在:!-d )在第一个条件中并添加一个“;” = 404之后。 try_files 不工作......有没有机会我可以看到 nginx 在做什么? (一步一步)看起来它无法到达文件夹......也许 $1 和 $2 是错误的?他们需要斜线吗? $1/$2/
    • 谢谢!我已经确定了答案。不,您不需要斜杠,因为正则表达式会捕获它们。我的建议是至少将error_log 保持在notice。如果你将error_log 严重性设置为debug,Nginx 会在每个请求中写入大量的调试信息。
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 2019-12-24
    • 2020-02-25
    • 2015-06-18
    • 2018-12-19
    相关资源
    最近更新 更多