技术解析

请教一个 nginx 重写问题
0
2021-06-22 13:23:59
idczone

有一个后端服务,地址是 http://127.0.0.1:8888/web-test/

nginx 配置如下

    location ^~ /web-test/ { 
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8888;
    }

访问 http://ip:port/web-test/ 是可以访问的

但我想改写成访问 http://ip:port/test/ 替代 访问 http://ip:port/web-test/ nginx 配置如下

    location ^~ /test/ { 
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8888/web-test/;
    }

重写后访问 http://ip:port/test/ 后出现问题,看到请求下面的 url 都返回 404

http://127.0.0.1:8888/web-test/resource/... 
http://127.0.0.1:8888/web-test/image/...
http://127.0.0.1:8888/web-test/system/...
http://127.0.0.1:8888/web-test/其他 URI/...

这种情况 nginx 要怎样配置重写规则?访问 http://ip:port/test/ 能返回正常的请求


试试这个:
location /test {
proxy_pass http://127.0.0.1:8888/web-test;
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}

这个需求就不再是 proxy 了, 应该是 rewrite

rewrite 再 proxy_pass

nginx 重写里面 规则的 末尾 带不带 / 不是一个意思...
参考 1 楼...

这样请求就变成 http://ip:port/web-test/test/ 了

最简化配置
```
location ^~ /test/ {
rewrite ^/test/(.*) /web-test/$1 break;
proxy_pass http://127.0.0.1:8888;
}
```

你这种跟我给出的是一样的作用
location ^~ /test/ {
proxy_pass http://127.0.0.1:8888/web-test/;
}

找到解决办法了
1、
location ^~ /test/ {
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8888/web-test/;
}
其他请求也 proxy_pass 到后端服务
location /web-test/resource/ {
proxy_pass http://127.0.0.1:8888;
}
location /其他请求 {
}
这种方式要找到所有请求到后端的 uri,一个个重写
2、
直接修改后端服务路由为 http://127.0.0.1:8888/test/,规则变为
location ^~ /test/ {
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8888;
}
就可以了

你有实际测试吗?
v2ex 没法放图,搜一个博客给你看看 https://xuexb.com/post/nginx-url-rewrite.html
请看此博客中"简单例子"的第 14 行.

一样的

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服