Nginx try_files 或者继续匹配位置?

Nginx try_files 或者继续匹配位置?

我想知道 Nginx 是否可以做到这一点:我刚刚添加了一个目录,其中包含一堆 HTML 文件(foo.html、bar.html),我想通过 /foo、/bar 等来提供服务。如果 URL 与文件名不匹配,我想恢复到下一个最佳匹配location

所以我有:

  # This block is newly added.
  location ~ ^/([^/]+)$ {
    default_type text/html;
    alias /blah/$1.html;
  }

  # Our long list of existing subsystems below....
  location /subscribe {
    proxy_pass http://127.0.0.1:5000;
  }

  location /upload {
    proxy_pass http://127.0.0.1:8090;
    proxy_read_timeout 99999;
  }

  location ~ /(data|garbage|blargh).* {
    proxy_pass http://127.0.0.1:8090;
    proxy_read_timeout 99999;
    auth_basic text;
    auth_basic_user_file /etc/nginx/htpasswd;
  }

  ....

问题是,第一个正则表达式现在会占用本来要转到其他locations 的 URL,正如 的记录行为一样location

一种方法是在第一个块中维护完整的显式文件列表location,但这个列表非常大并且总是在变化。有没有办法先检查文件是否存在,如果不存在,则继续查找下一个最佳location匹配项?

我尝试过try_files(包括使用 @fallback 并location在其中嵌套 s),但我认为它无法做到这一点。不过,我想在这里问一下,以防我遗漏了什么。(或者也许还有另一种更好的方法。)

答案1

location /无论如何都有最低优先级,所以我会使用try_files这个技巧:

    root /ngx/html/s;
    location / {
        try_files $uri.html /s$uri;
    }
    location /s {
        internal;
        root /ngx/html;
    }

相关内容