我想知道 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;
}
....
问题是,第一个正则表达式现在会占用本来要转到其他location
s 的 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;
}