Nginx子目录反向代理的配置问题
  • Blog
  • 2019-10-30
  • (122) Views
  • (0) Comments

想通过127.0.0.1/play/ 访问127.0.0.1:9000 实际访问时127.0.0.1/play/时,它却访问了127.0.0.1:9000/play/,问题是为什么没有直接访问9000端口,而是在后面带上了目录名呢?

location / {
root F:\Personal\ck;
index index.html;
}
location ~ ^/play/ {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
}

问题点:请求了 /play/ 而这个请求给pass到了 http://127.0.0.1:9000. 这个请求的path同样也会pass过去。

解决方案:

location ~ ^/play(/?)(.*){
proxy_pass http://127.0.0.1:9000/$;
}

这个代码的意思是,把 /play/xx 的请求 给我pass 到 http://127.0.0.1:9000/xx

更好的方式

location /play {
proxy_pass http://127.0.0.1:9000/;
proxy_set_header Host aaa;
proxy_set_header Accept-Encoding "";
sub_filter "aaa" "aaa/bbb";
sub_filter_once off;
}

其他解决思路:
因为proxy_pass只是反向代理,没法重写URL规则,它只是修改主机名而已。想去掉后面的东西,得用rewrite

location ~^/play/ {
proxy_pass http://127.0.0.1:9000;
rewrite "^/play(.*)$" $1 break;
...
}

Comments

Top