![使用带有多个目录树的 nginx try_files](https://linux22.com/image/729528/%E4%BD%BF%E7%94%A8%E5%B8%A6%E6%9C%89%E5%A4%9A%E4%B8%AA%E7%9B%AE%E5%BD%95%E6%A0%91%E7%9A%84%20nginx%20try_files.png)
我想让 nginx 通过检查该路径/文件是否存在于几个单独的目录中来处理对特定目录的请求。例如,如果我的目录根目录有以下内容:
images/siteA/foo.jpg
images/siteB/b/bar.jpg
images/siteC/example.jpg
我想http://example.com/images/foo.jpg
归还文件foo.jpg
,http://example.com/b/bar.jpg
归还文件bar.jpg
等等。
我已经尝试了以下操作,但是它只是被锁定在重定向循环中(并且我不希望它重定向,但实际上将文件提供给该 URL):
location /images/ {
try_files /siteA/images/
/siteB/images/
/siteC/images/ =404;
}
我也尝试过使用捕获组,例如location ~/images/(.*)/
并添加$1
到 URL 末尾。我对文档有点困惑,不确定如何使用 nginx 实现这一点。
答案1
您需要使用正则表达式 location
捕获 URI 中 后面的部分/images/
。然后使用try_files
测试使用每个站点前缀的一系列 URI。
例如:
location ~ ^/images/(.*)$ {
root /path/to/docroot/images;
try_files /siteA/$1 /siteB/$1 /siteC/$1 =404;
}
您可以从周围的块继承的值root
,在这种情况下可以适当地调整参数try_files
。
答案2
作为接受答案的替代方案,您可以使用命名位置(@my_path
例如)回退到其他位置,例如:
location / {
root /etc/nginx/static;
try_files $uri @index;
}
location @index {
root /srv/http;
try_files $uri $uri.html /index.html =404;
}