前端单页应用(SPA)与后端服务分离:当你的前端应用(如使用 React、Angular 等构建的单页应用)和后端服务(如 API 服务器)是分离的,并且前端应用需要访问后端服务的 API 时,你可以使用这种配置。前端应用请求 /
(或者其他某个特定的 URL),如果这个 URL 对应的内容不存在,那么 Nginx 会将请求代理到后端服务器上,并返回后端服务器的响应。
假设你有一个前端单页应用(SPA),当用户访问应用的根 URL(例如 /
)时,你希望展示一个欢迎页面。但是,如果用户直接访问了某个具体的页面(例如 /about
),而这个页面在 SPA 中不存在,那么你应该将请求代理到后端服务器,让后端服务器根据请求的 URL 返回相应的内容。
在这种情况下,你可以使用上述的 Nginx 配置。当用户访问 /about
时,因为该页面在 SPA 中不存在,Nginx 会检查 $request_filename
变量,发现该文件不存在,然后执行 if
块中的 rewrite
和 proxy_pass
指令。
具体来说,Nginx 会将请求重写为 /api/web/about
,并将请求代理到 http://127.0.0.1:8080
。后端服务器会根据请求的 URL(在这个例子中是 /about
)返回相应的内容。
这样,即使某个具体的页面在 SPA 中不存在,用户仍然能够通过访问相应的 URL 看到相应的内容。同时,由于使用了代理,后端服务器可以处理复杂的逻辑和与数据库的交互,而前端应用只需要关注展示和与用户的交互。
下面是一段在文件不存在时才进行代理的配置
location / {
root /usr/share/nginx/html/;
index index.html index.htm;
if (!-e $request_filename) {
rewrite ^(.*)$ /api/web$1 break;
proxy_pass http://127.0.0.1:8080;
break;
}
}
这个 Nginx 配置中的 location /
块定义了对根 URL (即 /
)的请求处理方式。以下是详细的解释:
root /usr/share/nginx/html;
:这行定义了根目录,即当请求的 URL 路径没有指定具体的文件时,Nginx 会在这个目录下寻找默认的文件(如index.html
或index.htm
)。index index.html index.htm;
:这行定义了默认的索引文件。当请求的 URL 路径没有指定具体的文件时,Nginx 会按照这个列表中的顺序尝试查找文件。if (!-e $request_filename) { ... }
:这是一个if
块,用于判断请求的文件是否真实存在。$request_filename
是 Nginx 内置的变量,表示请求的文件路径。!-e
是 Nginx 的测试指令,用于检查文件是否存在。如果文件不存在(!-e
返回 true),则执行rewrite ^(.*)$ /api/web$1 break; proxy_pass http://127.0.0.1:8080; break;
这段代码。rewrite ^(.*)$ /api/web$1 break;
:这行代码使用正则表达式^(.*)$
来匹配任何 URL,并将匹配到的部分(用$1
表示)附加到/api/web
后面,生成新的 URL。例如,如果请求的 URL 是/foo/bar
,那么新的 URL 就是/api/web/foo/bar
。proxy_pass http://127.0.0.1:8080;
:这行代码将请求代理到指定的后端服务器上。这里使用的是本机的 IP 地址127.0.0.1
和端口号8080
。break;
:这是rewrite
指令的参数,用于终止rewrite
指令的处理,防止 Nginx 继续处理其他的 rewrite 指令或循环。
总的来说,这个配置的主要作用是:当请求的 URL 对应的不存在时,将其重定向到 /api/web
开头的 URL,并代理到后端服务器上。