项目部署时可能有这样的情况:多个项目(前端或后端)部署在同一个域名下。这样的话就需要为每个项目单独指定 path,不同的 path 重定向到不同的项目。
重定向配置主要用到两个字段:alias
,rewrite
。
alias
译为别名,具体怎么重定向,我们来对比 root
看例子。
比如说,一个前端的地址是:www.test.com
,配置如下:
location / {root /home/demo;}
现在我们要做一个配置,当请求 www.test.com/page2
时,访问另一个前端项目 /home/demo2
。
先看 root 配置:
location /page2 {root /home/demo2;}
这样配的话,当请求 /page2
,其实会访问到 /home/demo2/page2
。因为 root 关键字的匹配规则是 root 的值(/home/demo2
) + path(/page2
)。
这可能不符合实际需求。我们想要的是请求 /page2
时直接访问 /home/demo2
。
怎么办呢?其实 alias 就可以实现:
location /page2 {alias /home/demo2;}
此时请求 /page2
,会正常访问到 /home/demo2
。
如果是 vue 或 react 工程项目部署,光这样还不行,还要在 package.json
下配置:
{"homepage": "/page2"}
这样部署后才能正常解析。
rewrite
用来实现 URL 的重写,可以在 server 或 location 中配置,语法如下:
rewrite [regex] [replacement] [flag]
比如要将 /my-api/*
重定向到 /*
,配置如下:
location /my-api/ {rewrite ^/my-api/(.*)$ /$1 break;}
上面配置中的 $1
代表前面正则表达式中第一个括号匹配的值,break
是一个 flag,表示中止后面的匹配;
flag 有如下值:
注意:break 只会终止后面的匹配,无论写在哪个位置,都会允许当前匹配执行完成。
rewrite 规则相关指令还有很多,如 if、rewrite、set、return、break 等,例子:
server {listen 8080;break;return 200 "ok";location = /testbreak {break;return 200 $request_uri;proxy_pass http://127.0.0.1:8080/other;}location /testif {set $variable "0";if ($variable) {# 不会执行,因为 "0" 为 falsebreak;}if (!-f $filename) {break;}}}
下面说一下例子中的指令:
return
如果返回 text,即普通文本,则会响应该文本;
如果返回 url,则会重定向到该 url;
set
下面列一下,做规则判断时可以用到的全局变量: