当前位置: 首页 > article >正文

nginx学习,URI,try_files

在 Nginx 配置中,$uri 是一个 内置变量,表示当前请求的 URI(不包括查询参数)。

解析 try_files $uri $uri/ /index.html;

这一行的作用是:

  1. 尝试访问 $uri —— 直接匹配请求的 URI(如 /about.html)。
  2. 尝试访问 $uri/ —— 如果 $uri 是一个目录,则尝试访问该目录(如 /blog/)。
  3. 回退到 /index.html —— 如果前两步都失败,则返回 index.html(用于单页应用,如 Vue、React 前端项目)。

示例

请求 /about.html
  • $uri = /about.html
  • 如果 /usr/share/nginx/webroot/about.html 存在,返回该文件。
  • 否则,返回 /index.html
请求 /blog/
  • $uri = /blog/
  • 如果 /usr/share/nginx/webroot/blog/ 目录存在,Nginx 会尝试查找默认的 index.html(除非 index 指定了其他文件)。
  • 否则,返回 /index.html
请求 /nonexistent
  • $uri = /nonexistent
  • /usr/share/nginx/webroot/nonexistent 不存在
  • /usr/share/nginx/webroot/nonexistent/ 不存在
  • 退而求其次,返回 /usr/share/nginx/webroot/index.html(适用于 SPA 单页应用,前端路由会处理这个路径)。

总结

  • $uri 代表请求的路径(不带查询参数)。
  • try_files 用于按顺序查找可用资源,如果找不到,就回退到 index.html
  • 这种配置常用于 前后端分离 项目,保证前端路由能正确解析。

🚀 如果你在部署 Vue、React、Angular 等前端应用,这个写法是标准方案!

在 Nginx 配置中,$uri 代表当前请求的路径(不带查询参数)。如果 try_files $uri $uri/ /index.html; 处理一个目录后仍然是目录,例如 /blog/productlist/,它的匹配规则如下:


匹配逻辑

  1. 尝试 $uri 直接匹配文件

    • $uri = /blog/productlist
    • Nginx 查找 /usr/share/nginx/webroot/blog/productlist 是否是一个文件。
    • 如果是文件,直接返回该文件。
  2. 尝试 $uri/ 作为目录

    • $uri = /blog/productlist/
    • Nginx 现在查找 /usr/share/nginx/webroot/blog/productlist/ 目录。
    • 如果这个目录存在,并且 index.html 存在,则返回 index.html(Nginx 默认会尝试 /blog/productlist/index.html)。
  3. 如果前两步都失败,则回退到 /index.html

    • 这通常用于 前端单页应用(SPA),让 Vue/React/Angular 的路由来处理 URL。

示例 1:有 index.html 的目录

假设目录 /usr/share/nginx/webroot/blog/productlist/ 存在,并且有 index.html

  • 访问 /blog/productlist
    • $uri = /blog/productlist,它是个目录,不是文件。
    • $uri/ = /blog/productlist/,它是个目录,Nginx 查找 /blog/productlist/index.html 并返回它。

示例 2:目录没有 index.html

如果 /usr/share/nginx/webroot/blog/productlist/ 没有 index.html,那么:

  • 访问 /blog/productlist
    • $uri = /blog/productlist,是目录,不匹配。
    • $uri/ = /blog/productlist/,仍然是目录,但没有 index.html
    • Nginx 退而求其次,返回 /index.html,通常用于 前端路由处理

示例 3:目录不存在

如果 /usr/share/nginx/webroot/blog/productlist/ 整个目录都不存在

  • 访问 /blog/productlist
    • $uri = /blog/productlist,找不到。
    • $uri/ = /blog/productlist/,找不到。
    • 最终返回 /index.html(适用于前端路由)。

总结

  • /blog/productlist 如果是文件,直接返回文件内容。
  • /blog/productlist/ 如果是目录且有 index.html,则返回 /blog/productlist/index.html
  • /blog/productlist/ 如果目录存在但没有 index.html,Nginx 可能返回 403(除非配置 autoindex on;)。
  • 如果 /blog/productlist/ 不存在,则返回 /index.html(适用于前端单页应用)。

🚀 这种方式适用于 SPA 项目(Vue/React),让前端路由接管 URL 解析!


http://www.kler.cn/a/584592.html

相关文章:

  • AWS Bedrock全托管接入国产大模型DeepSeek-R1[内涵免费使用DeepSeek-R1满血版]
  • 微博发布Q4及全年财报:微博成汽车手机新品营销主阵地
  • 【后端】【django】导出 API 文档的几种方法
  • 网络安全相关资源安全合规检查与整改计划‌
  • 【开源+代码解读】Search-R1:基于强化学习的检索增强大语言模型框架3小时即可打造个人AI-search
  • vue2双向绑定解析
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JavaWeb 中的文件上传与下载:实现文件管理功能
  • STM32 HAL库实战:轻松实现串口通信驱动蓝牙模块与ESP8266开发
  • 数据中心安全建设方案,数据安全运营体系建设方案,信息中心安全解决方案(PPT)
  • 深度学习基础--CNN经典网络之“DenseNet”简介,源码研究与复现(pytorch)
  • RabbitMQ五种消息模型
  • 零成本搭建Calibre个人数字图书馆支持EPUB MOBI格式远程直读
  • 鸿蒙开发-一多开发之媒体查询功能
  • XSS跨站脚本攻击
  • Bash和Zsh的主要差异是?
  • 新鲜速递:OpenAI-Agents-Python:构建智能代理系统的轻量级框架
  • Docker子网冲突解决方案及配置说明
  • 第十五届蓝桥杯C/C++ C 组全部题目详细题解
  • 微信小程序使用的SSL证书在哪里申请?
  • 兼职招聘平台(源码+文档+讲解+演示)