nginx 尝试_files重定向而不是使用回退目录?

ehxuflar  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(132)

我正在运行一个nginx SPA应用程序。但是对于请求,我希望使用fallback/fallthrough方法:
我有主目录/,其中有主要的/index.html以及“默认”图标。但是,它也包含一个包含(可能)来自默认目录的值的文件夹/local/--删除那些现有的值。(这是为了允许一个docker卷,从主机操作系统提供特定的favicon.ico等,并在不重建docker的情况下修改它)。
最初我有以下代理指令:

root /var/www/html;
location / {
    # redirect everything to show the main SPA application
    try_files $uri $uri/ /index.html;
    expires 7d;
}
location = /index.html { }

这是可行的,但是它不喜欢/local下的文件,除非在请求中指定。
然后我尝试添加一个更长的try_files列表:

root /var/www/html;
location / {
    # redirect everything to show the main SPA application
    try_files $uri/local $uri/local/ $uri $uri/ /index.html;
    expires 7d;
}
location = /index.html { }

但是现在,如果我转到主页面localhost:80,会发生重定向(301)到localhost//local/
我觉得我不明白try_files函数。第二,我想知道上面是如何做到的。总之,这是我希望nginx做的查找(注意前端没有重定向):

localhost/ => ./index.html
localhost/favicon.ico => ./local/favicon.ico //IF that file exists
localhost/favicon.ico => ./favicon.ico //IF ./local/favicon does not exist
localhost/unexistingfile => ./index.html

我该怎么做?或者这在nginx级别是不可能的,我应该在应用程序层这样做吗?

new9mtju

new9mtju1#

考虑到请求//localhost/favicon.ico$uri的值被设置为/favicon.ico
文件项$uri/local将导致Nginx搜索/var/www/html/favicon.ico/local的文件,这不是你的意图。
正确的文件术语是/local$uri,这将导致Nginx搜索/var/www/html/local/favicon.ico的文件。
try_files文档:
可以通过在名称末尾指定斜杠来检查目录是否存在
当Nginx以这种方式找到一个使用try_files的目录时,它会发出一个外部重定向到一个尾部为/的URL。带有后缀/的URL解析到一个目录,然后由索引模块处理。
您的文件项$uri/local///localhost请求的目录/var/www/html/local相匹配,这会导致不必要的重定向到//localhost/local/
总之,用途:

try_files /local$uri $uri $uri/ /index.html;

首先,文件项/local$uri将在local目录下查找文件。
其次,文件项$uri将从根目录开始查找文件。
第三,文件项$uri/将执行正常的索引处理,其中URL解析为目录。
最后一个参数是一个URI,如果没有找到匹配的文件项,它会导致Nginx生成一个到index.html内部重定向

相关问题