浏览器访问地址/a/b时,如何最终渲染到项目中的c.vue页面的?

67 阅读3分钟

前言:如果只想看标题的答案,请看“更完整的例子”章节即可!

最近我遇到一个问题,路由地址总是访问不到页面。后来发现单页面应用(SPA)的nginx.config文件往往需要配置这一行:

   try_files $uri $uri/ /index.html;

我的完整 Nginx 配置文件中的 location 块如下,通常用于配置静态文件的服务。让我们详细解释一下每一部分的作用:

location / {
    try_files $uri $uri/ /index.html;
    root   /usr/share/nginx/html;
    index  index.html index.htm;
}

解释

  1. location /:

    • 这是一个 location 块,用于匹配所有以 / 开头的请求。它是 Nginx 配置文件中处理请求的主要部分。
  2. try_files $uri $uri/ /index.html;:

    • 这是一个指令,用于尝试访问请求的文件或目录。
    • $uri:尝试访问请求的 URI(例如 /path/to/file)。
    • $uri/:尝试访问请求的 URI 加上斜杠(通常用于目录请求)。
    • /index.html:如果以上两个都不存在,Nginx 会回退到 index.html 文件。这个设置常用于单页应用(SPA)或服务器端渲染应用中,以便在 URL 发生变化时仍然可以返回正确的前端应用。
  3. root /usr/share/nginx/html;:

    • 指定了静态文件的根目录。所有的静态文件都从这里开始查找。
    • 在这个例子中,Nginx 将在 /usr/share/nginx/html 目录中查找文件。
  4. index index.html index.htm;:

    • 这行指令指定了默认的索引文件。当请求的目录没有明确指定文件时,Nginx 将尝试加载这些文件(index.htmlindex.htm)作为默认文件。

使用场景

这个配置块常用于静态网站或单页应用程序(SPA)的服务。特别是对于 SPA,当用户直接访问深层 URL 时,服务器需要返回主 HTML 文件(index.html),以便前端 JavaScript 可以处理路由。

例子

假设你在 /usr/share/nginx/html 目录中有以下文件结构:

/usr/share/nginx/html/
    index.html
    about.html
    contact.html

如果用户访问 http://example.com/about,Nginx 将:

  1. 尝试找到 /usr/share/nginx/html/about 文件(失败,因为它是一个目录而不是文件)。
  2. 尝试找到 /usr/share/nginx/html/about/ 目录(如果存在的话)。
  3. 如果目录和文件都不存在,Nginx 将返回 /usr/share/nginx/html/index.html 文件。

更完整的例子

在Vue单页面应用 (SPA) 中,浏览器访问路由/a/b时(完整的地址形如https://***.com/a/b) ,假如最终将渲染项目中的c.vue页面。系统的工作流程如下:

  1. 浏览器请求:用户在浏览器中输入 URL /a/b,Nginx 处理这个请求。

  2. Nginx 处理

    • $uri:Nginx 首先检查是否存在 /a/b 对应的文件。如果不存在,Nginx 会继续检查下一个选项。
    • $uri/:接下来,Nginx 检查 /a/b/ 是否是一个目录。如果仍然不存在,Nginx 会继续到下一个选项。
    • /index.html:最后,Nginx 会返回 /index.html 文件。此时,Nginx 不是直接返回 /a/b/a/b/ 相关的文件,而是返回主页面文件 index.html,并把请求的 URL 保留在浏览器中。
  3. 前端路由处理

    • 当浏览器加载了 index.html 文件后,Vue 应用开始运行。Vue Router 在初始化时会读取当前的 URL 路径(即 /a/b)。
    • Vue Router:根据配置的路由规则,Vue Router 会匹配路径 /a/b 并将其映射到相应的组件 c.vue
    • 组件渲染:Vue Router 动态加载和渲染 c.vue 组件,显示在应用的页面中。

关键点

  • Nginx:通过将所有非静态资源请求都重定向到 index.html,使得所有的路由请求都由前端路由处理。
  • Vue Router:在 index.html 加载完成后,Vue Router 根据 URL 动态渲染相应的组件,如 c.vue

Nginx 处理的是服务器端的请求重定向,而 Vue Router 处理的是客户端的路由和组件渲染,确保 SPA 应用可以正确地根据 URL 映射到相应的视图组件。