我正在运行一个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级别是不可能的,我应该在应用程序层这样做吗?
1条答案
按热度按时间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/
。总之,用途:
首先,文件项
/local$uri
将在local
目录下查找文件。其次,文件项
$uri
将从根目录开始查找文件。第三,文件项
$uri/
将执行正常的索引处理,其中URL解析为目录。最后一个参数是一个URI,如果没有找到匹配的文件项,它会导致Nginx生成一个到
index.html
的内部重定向。