Nginx使用try_files遇到的问题及解决

 更新时间:2025年10月10日 09:49:02   作者:葡萄糖o_o  
这篇文章主要介绍了Nginx使用try_files遇到的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

背景

root /some/path;
location / {
	try_files $uri $uri/ /dist/index.html;
}

使用React之类的的库来开发前端页面的时候,因为是单页应用所以需要上面的Nginx配置,用来在找不到html文件的时候内部重定向到/dist/index.html文件。

服务器上的目录结构是/some/path/dist/assetes网站的静态资源都是存在/some/path/dist/下的,而服务器的根目录是/some/path/

域名:localhost.abc.com

现象:访问localhost.abc.com/dist/正常访问,访问localhost.abc.com/dist/xxx等都正常,而直接通过域名localhost.abc.com访问页面则出现403错误。

当访问域名会被location /块捕获,这是毋庸置疑的,匹配到之后,try_files 会尝试第一个参数 / (当前的$uri是 / )也就是/app/app/下只有一个文件夹dist,也没有index.html或者index.htm文件,所以找不到,应该是404,然后继续找 // (这个 // 会被如何解析不得而知)也找不到404,所以最后会知道 /some/path/dist/index.html 这个文件是存在的,所以不应该出现403错误,应该正常展示才对。

遇到上面的问题主要是因为Nginx的匹配流程不熟悉导致的,在访问文件夹的时候,如果没有找到index配置的文件,例如index.html之类的,那么会继续调用autoIndex模块,autoIndex模块的值默认是false,所以就报没有权限查看这个文件夹的异常,异常码是403。

try_files 是不会处理403这个异常的,try_files处理的是异常码404,所以403这个异常就被直接返回出去了,也就是说在第一步匹配 / 的时候就直接返回了。

解决

即使开启autoIndex对于单页应用来说也是十分奇怪的。所以我们可以设置root: /some/path/dist/这样,即使访问的是/那么第一个匹配的也是 /some/path/dist/index.html,就不会出现访问域名直接报错的尴尬情况。

但是这个问题其实没有解决,例如/some/path/dist/xxx/这个目录通过域名访问还是存在上面说的问题,/dist/xxx/这个访问还是会报403但是这也无法避免,这其实是我们配置导致的(如上所述)。

除了修改root值的解决方案,我们还可以捕获403这个错误,然后再重定向到我们的目标文件/some/path/dist/index.html。这就从根本解决了这个问题,但是我们网站也没有了403错误,这样解决是否合适,有待商榷。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 关于lua_shared_dict的incr方法详解

    关于lua_shared_dict的incr方法详解

    这篇文章主要介绍了关于lua_shared_dict的incr方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • 一文详解nginx中的root与alias

    一文详解nginx中的root与alias

    Nginx是一款流行的高性能Web服务器和反向代理服务器,这篇文章主要给大家介绍了关于如何通过一文详解nginx中的root与alias的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • nginx 作为反向代理实现负载均衡的例子

    nginx 作为反向代理实现负载均衡的例子

    以下我们就来举例说明如何使用 nginx 实现负载均衡。因为nginx在处理并发方面的优势,现在这个应用非常常见。
    2010-12-12
  • Nginx如何自动封禁可疑Ip

    Nginx如何自动封禁可疑Ip

    这篇文章主要介绍了Nginx如何自动封禁可疑Ip问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • nginx配置history模式的使用小结

    nginx配置history模式的使用小结

    本文详细介绍了在Nginx服务器中配置history模式的方法,具体通过使用try_files指令来实现,这种配置方式主要适用于单页应用,可以确保无论访问什么URL,服务器总是返回同一个HTML文件,然后由前端路由来处理不同的页面显示
    2024-10-10
  • 查看nginx日志的实现

    查看nginx日志的实现

    在 Nginx 中,查看日志是诊断问题和监控 Nginx 服务状态的重要手段,本文主要介绍了查看nginx日志的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • nginx 开启 pathinfo的过程详解

    nginx 开启 pathinfo的过程详解

    这篇文章主要介绍了nginx 开启 pathinfo的过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Nginx实现接口复制的示例代码

    Nginx实现接口复制的示例代码

    本文主要介绍了使用Nginx的mirror指令和Lua脚本实现接口流复制,方便将请求同时转发到多个后端服务器,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01
  • Nginx 中文域名配置详解及实现

    Nginx 中文域名配置详解及实现

    这篇文章主要介绍了Nginx中 文域名配置详解及实现的相关资料,Nginx虚拟主机上绑定一个带中文域名但是不能跳转,这里给大家说下如何实现,需要的朋友可以参考下
    2016-12-12
  • 一文详解如何高效查找与管理Nginx进程

    一文详解如何高效查找与管理Nginx进程

    在Linux系统中,Nginx是一个非常流行的Web服务器和反向代理服务器,要查找和管理Nginx进程,你可以使用多种命令行工具和技巧,以下是一些常用的方法,需要的朋友可以参考下
    2025-08-08

最新评论