遇到的坑
今天遇到个小坑,当 nginx 目录级别的代理使用了变量之后,目录代理则只会代理到拼接完的目录,不会目录递归代理。
http {
server {
listen 80;
server_name example.com;
location /topic/ {
proxy_pass https://nba.com/abc/topic/;
}
}
}
比如当我们访问 https://example.com/topic/abc 则会代理请求 https://nba.com/abc/topic/abc
当想通过变量来控制域名的时候,发现 https://example.com/topic/abc 则会代理请求 https://nba.com/abc/topic/
http {
server {
listen 80;
server_name example.com;
set $b_host "nba.com";
if ($host = "pre-example.com") {
set $b_host "pre-nba.com";
}
location /topic/ {
proxy_pass https://$b_host/abc/topic/;
}
}
}
优化方案
问题还是因为代理规则不够规范,换成^/topic/(.*)
来匹配目录,则可以解决问题
http {
server {
listen 80;
server_name example.com;
set $b_host "nba.com";
if ($host = "pre-example.com") {
set $b_host "pre-nba.com";
}
location ~ ^/topic/(.*) {
proxy_pass https://$b_host/abc/topic/$1;
}
}
}