nginx:proxy_pass失败时回退到try_files需要不寻常的配置
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx:proxy_pass失败时回退到try_files需要不寻常的配置相关的知识,希望对你有一定的参考价值。
我正在使用nginx来管理一个单页应用程序。基本上,只要找不到匹配的文件,我们只需要提供index.html
页面即可。该位置看起来像这样,并且一直可以正常工作:
location / {
try_files $uri $uri/ /index.html
}
现在,我想查询上游服务器,并且只有在失败的情况下,才使用上面的try_files
指令
如果try_files
刚刚移至后备位置,例如
location @fallback {
try_files $uri $uri/ /index.html;
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_intercept_errors on;
error_page 400 403 502 503 504 @fallback;
}
然后-当上游服务器不可用时-客户端看到Nginx 502错误页面,而不是文件系统提供的文件。
我终于找到了一种解决方案,该解决方案可以在/index.html后备广告前面使用双斜杠。这是整个配置文件,可以与官方的nginx docker镜像一起使用进行测试
events {
}
http {
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
server {
listen 80;
root /usr/share/nginx/html/;
location / {
proxy_pass http://127.0.0.1:9990;
proxy_intercept_errors on;
error_page 400 403 502 503 504 = @fallback;
}
location @fallback {
try_files $uri?$args /index.html //index.html;
}
}
}
可以用类似的命令来运行>
docker run -v /path/to/www/folder:/usr/share/nginx/html:ro -v /path/to/config/nginx.conf:/etc/nginx/nginx.conf -d -p 8080:80 nginx
[如果在最后一个
index.html
后备广告之前没有双斜杠,例如
location @fallback { try_files $uri?$args /index.html; }
然后,nginx在文件系统上构造一个路径,例如
<root>index.html
,当请求的URL不是根URL时,该路径将缺少分隔符而不是正确的<root>/index.html
。
最后一个问题:为什么此设置在try_files指令中需要双斜杠?为什么不能只使用常规配置中的try_files部分并将其移动到拦截错误时使用的后备位置?
我正在使用Nginx来管理一个单页应用程序。基本上,只要找不到匹配的文件,我们只需要提供index.html页即可。该位置看起来像这样,并且一直可以正常工作:...
我也遇到了类似的情况,我使用common pitfalls的页面上的建议,以另一种方式解决了这一问题。也就是说,首先提供静态文件,然后回退到代理:
以上是关于nginx:proxy_pass失败时回退到try_files需要不寻常的配置的主要内容,如果未能解决你的问题,请参考以下文章
HTML 正确的方法从谷歌的CDN加载jQuery,必要时回退到本地库
JavaScript 从Google CDN加载jQuery,但如果失败则回退到本地
使用 Google 托管 jQuery 的最佳方式,但回退到我在 Google 上的托管库失败
如何解决 redux-persist 创建同步存储失败。回退到 React.js 中的 noop 存储