需求
旧的配置出现大量重复,且转发规则不统一,每次新增项目 都要改配置,不胜其烦
index index.html;
# 项目a
location ^~ /app/pa/ {
alias /data/web/www/prefix-pa-admin/dist/;
}
# 项目b
location ^~ /app/pb/ {
alias /data/web/www/prefix-pb-admin/dist/;
}
# 项目c
location ^~ /app/pc/ {
alias /data/web/www/pc-admin/dist/;
}
# 项目d
location ^~ /app/pd/ {
alias /data/web/www/pc-admin/dist/;
}
# 项目e
location ^~ /app/pe/ {
alias /data/web/www/pc/dist/;
}
情况分析
转换规则有如下几种情况:
- /app/
xx/ -> /data/web/www/xx/dist/ - /app/
xx/ -> /data/web/www/xx-admin/dist/ - /app/
xx/ -> /data/web/www/prefix-xx-admin/dist/
考虑用正则匹配处理
尝试1
先看情况1这种简单匹配 匹配目录
location ~ ^/webapp/([a-z0-9_-]+)/$ {
alias /data/web/www/$1/dist/;
}
访问/app/aa/ 会无线拼接 index.html
xx.com/app/aa/index.html/index.html/index.html...
一番google后,人家说alias用了正则,就要写完全路径,不能只写到目录
尝试2
匹配完全路径,访问/app/aa/ 可以正常访问到页面
location ~ ^/webapp/([a-z0-9_-]+)/(.*)$ {
alias /data/web/www/$1/dist/$2;
}
尝试3
兼容不同路径
index index.html;
# 正则匹配 访问 /app/aa/ 会按照顺序做如下尝试
# 1. /data/web/aa/dist
# 2. /data/web/aa-admin/dist
# 3. /data/web/prefix-aa-admin/dist
location ~ ^/app/([a-z0-9_-]+)/(?<filename>.*)$ {
# 访问路径和项目名一致,app/aa/ -> /data/web/aa/
alias /data/web/$1/dist/$filename;
# 没匹配到
if (!-e $request_filename) {
# -admin结尾 不匹配 添加 prefix-: aaa-admin -> prefix-aaa-admin
rewrite ^/app/([a-z0-9]+)-admin/(?<filename>.*)$ /app/prefix-$1-admin/$filename last;
# 没有-admin结尾的 不匹配 添加 -admin :
# aa => aa-admin
# prefix-bb => prefix-bb-admin
rewrite ^/app/([a-z0-9-]+)/(?<filename>.*)$ /app/$1-admin/$filename last;
}
}