Nginx路径重写及访问尝试

411 阅读1分钟

需求

旧的配置出现大量重复,且转发规则不统一,每次新增项目 都要改配置,不胜其烦

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/;
}

情况分析

转换规则有如下几种情况:

  1. /app/xx/ -> /data/web/www/xx/dist/
  2. /app/xx/ -> /data/web/www/xx-admin/dist/
  3. /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;
    }
}

参考

官网文档

alias和正则一起用的问题