前言:如果只想看标题的答案,请看“更完整的例子”章节即可!
最近我遇到一个问题,路由地址总是访问不到页面。后来发现单页面应用(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;
}
解释
-
location /
:- 这是一个
location
块,用于匹配所有以/
开头的请求。它是 Nginx 配置文件中处理请求的主要部分。
- 这是一个
-
try_files $uri $uri/ /index.html;
:- 这是一个指令,用于尝试访问请求的文件或目录。
$uri
:尝试访问请求的 URI(例如/path/to/file
)。$uri/
:尝试访问请求的 URI 加上斜杠(通常用于目录请求)。/index.html
:如果以上两个都不存在,Nginx 会回退到index.html
文件。这个设置常用于单页应用(SPA)或服务器端渲染应用中,以便在 URL 发生变化时仍然可以返回正确的前端应用。
-
root /usr/share/nginx/html;
:- 指定了静态文件的根目录。所有的静态文件都从这里开始查找。
- 在这个例子中,Nginx 将在
/usr/share/nginx/html
目录中查找文件。
-
index index.html index.htm;
:- 这行指令指定了默认的索引文件。当请求的目录没有明确指定文件时,Nginx 将尝试加载这些文件(
index.html
或index.htm
)作为默认文件。
- 这行指令指定了默认的索引文件。当请求的目录没有明确指定文件时,Nginx 将尝试加载这些文件(
使用场景
这个配置块常用于静态网站或单页应用程序(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 将:
- 尝试找到
/usr/share/nginx/html/about
文件(失败,因为它是一个目录而不是文件)。 - 尝试找到
/usr/share/nginx/html/about/
目录(如果存在的话)。 - 如果目录和文件都不存在,Nginx 将返回
/usr/share/nginx/html/index.html
文件。
更完整的例子
在Vue单页面应用 (SPA) 中,浏览器访问路由/a/b时(完整的地址形如https://***.com/a/b) ,假如最终将渲染项目中的c.vue页面。系统的工作流程如下:
-
浏览器请求:用户在浏览器中输入 URL
/a/b
,Nginx 处理这个请求。 -
Nginx 处理:
$uri
:Nginx 首先检查是否存在/a/b
对应的文件。如果不存在,Nginx 会继续检查下一个选项。$uri/
:接下来,Nginx 检查/a/b/
是否是一个目录。如果仍然不存在,Nginx 会继续到下一个选项。/index.html
:最后,Nginx 会返回/index.html
文件。此时,Nginx 不是直接返回/a/b
或/a/b/
相关的文件,而是返回主页面文件index.html
,并把请求的 URL 保留在浏览器中。
-
前端路由处理:
- 当浏览器加载了
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 映射到相应的视图组件。