问题描述
比如我想通过127.0.0.1/play/ 访问127.0.0.1:9000我现在的配置是这样:
location / {root F:Personalck;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;}
当我实际访问时127.0.0.1/play/时,它却访问了127.0.0.1:9000/play/ 我很疑惑,没什么没有直接访问9000端口,而是在后面带上了目录名呢?
问题解答
回答1:因为你请求了 /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/;}
注意结尾的’/’
看这里http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
回答2:因为proxy_pass只是反向代理,没法重写URL规则,它只是修改主机名而已。想去掉后面的东西,你得用rewrite
location ~^/play/ { proxy_pass http://127.0.0.1:9000; rewrite '^/play(.*)$' $1 break; ... }