当前位置: 代码网 > it编程>数据库>Redis > Nginx中try_files指令的实现示例

Nginx中try_files指令的实现示例

2024年10月27日 Redis 我要评论
1. 简介try_files是nginx中一个非常强大且常用的指令,其用于按顺序检查文件是否存在,并将请求传递给第一个找到的文件,或者在所有文件都未找到时,执行一个回退uri。该指令在配置静态网站或单

1. 简介

try_files是nginx中一个非常强大且常用的指令,其用于按顺序检查文件是否存在,并将请求传递给第一个找到的文件,或者在所有文件都未找到时,执行一个回退uri。该指令在配置静态网站或单页面应用(spa)时特别有用,因为其可以确保nginx优先服务静态文件,而只有在静态文件不存在时才将请求转发给后端应用或提供回退页面。

2. 基本语法

try_files file ... uri;
  • file ... : 一个或多个要检查的文件路径。nginx会按照提供的顺序检查这些文件是否存在;
  • uri:若所有指定的文件都不存在,则执行回退uri,该uri可以是一个静态页面(如404页面),也可以是一个请求处理程序(如一个处理所有前端路由的php脚本或node.js应用的入口点);

try_files使用示例:

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

这里的 $uri 是客户端请求的原始 uri。

让我们逐步解释这条指令:

1)$uri: nginx 会首先尝试直接从请求的 uri 中查找文件。例如,如果用户请求 /about, nginx 会尝试查找 /about 文件。
2)$uri/: 如果第一步没有找到文件,nginx 会尝试将请求的 uri 视为目录,并在后面添加斜杠 /。例如,如果用户请求 /about, nginx 会尝试查找 /about/ 目录。
3)/test/index.html: 如果前两步都没有成功找到文件或目录,nginx 会尝试返回 /test/index.html 文件。

则:

  • 如果用户请求的是一个存在的文件(如 /about),nginx 将直接返回该文件。
  • 如果用户请求的是一个目录(如 /about/),nginx 将尝试返回该目录下的默认文件。
  • 如果上述两种情况都没有发生,nginx 最终会尝试返回 /test/index.html。
  • 这样的配置非常适合单页应用(spa)或那些希望为所有未找到的路由提供一个默认页面的应用程序。例如,如果你有一个前端应用托管在 /test/ 下,并且所有的页面都在 /test/index.html 中呈现,那么这个配置就能确保无论用户请求什么路径,都能看到应用的首页。

3. 案例

3.1 静态网站

假设有一个静态网站,其html、css和js文件都存放在/data/www目录下,并希望nginx首先尝试直接服务这些静态文件,若文件不存在,则返回404错误。

server {  
    listen       80;  
    server_name  example.com;  
  
    root   /data/www;  
  
    location / {  
        try_files $uri $uri/ =404;  
    }  
}

在该例子中,$uri表示请求的uri(不包括主机名和端口),若$uri指向的文件或目录存在,nginx将直接服务它,若$uri指向的文件不存在但目录存在,nginx会尝试在末尾添加斜杠并重试请求,若仍未找到文件,则nginx将返回404错误。

3.2 单页面应用

对于单页面应用,希望无论请求什么url,都返回同一个html文件(通常是index.html),然后让前端路由处理这些url,这可以通过将try_files指令的回退设置为该html文件来实现。

server {  
    listen       80;  
    server_name  myapp.com;  
  
    root   /usr/share/nginx/html;  
  
    location / {  
        try_files $uri $uri/ /index.html;  
    }  
}

该配置中,nginx首先尝试服务请求的文件或目录,若找不到,则会回退到/index.html,这允许前端路由接管并显示正确的页面,这种方法特别适用于react、vue或angular等现代前端框架构建的单页面应用。

到此这篇关于nginx中try_files指令的实现示例的文章就介绍到这了,更多相关nginx try_files指令内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com