nginx 不改变url 根据需求分发到不同的项目

需求一:根据页面转发

1
2
3
4
5
location /account/users/mobile_account_index {
root /opt/app/vuetest.wondercv.com/current;
index index.html;
try_files $uri /index.html $uri/;
}

ps: 要注意指向的文件夹里有没有版本库 来判定要不要current

需求二:根据user agent && url转发

1
2
3
4
5
6
7
8
location /feedbacks/new {
root /opt/app/vuetest.wondercv.com/current;
index index.html;
try_files $uri /index.html $uri/;
if ($http_user_agent !~* "Mobile|webOS|Jike") {
proxy_pass http://app_servers;
}
}

需求三:重写url

1
2
3
4
5
6
7
8
location ~ /jianlimoban/{
#url不变
# rewrite ^(.*)jianlimoban(.*)$ $1muban$2;"['"
#url改变
if ($http_user_agent !~* "Mobile|webOS|Jike") {
rewrite ^(.*)jianlimoban(.*)$ $1muban$2 redirect;
}
}

ps:
nginx 关于 rewrite 指令最后一项的参数说明:
last : 相当于apache里的 [L]标示,表示完成rewrite;

break:本条规则匹配完成后,终止匹配,不再匹配后面的规则;

redirect:返回302 临时重定向,浏览器地址栏会显示跳转后的url地址;

permanent: 返回301 永久重定向,浏览器地址会显示跳转后的url地址;

需求四:转发server (换域名)

1
2
3
4
5
location ~ /jianlimoban/{
if ($http_user_agent ~* "Mobile|webOS|Jike") {
return 301 https://m.wondercv.com$request_uri;
}
}

ps:

1
2
3
4
5
6
7
8
9
10
set $to_vue 0;
if ($http_user_agent !~* "Mobile|webOS|Jike") {
set $to_vue 1;
}
if ($http_user_agent ~* "wondercv_ios") {
set $to_vue 1;
}
if ($request_method ~* "POST") {
set $to_vue 1;
}

https://moonbingbing.gitbooks.io/openresty-best-practices/ngx/nginx_local_pcre.html

location 匹配规则
语法规则
location [=|||^] /uri/ { … }
模式 含义
location = /uri = 表示精确匹配,只有完全匹配上才能生效
location ^
/uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location ~ pattern 开头表示区分大小写的正则匹配
location ~
pattern 开头表示不区分大小写的正则匹配
location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default