请教一个 nginx 重写问题

2018-11-12 02:42:30 +08:00
 awker

有一个后端服务,地址是 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/ 能返回正常的请求

2424 次点击
所在节点    Linux
10 条回复
yuikns
2018-11-12 05:49:35 +08:00
试试这个:

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;

}
beginor
2018-11-12 07:47:50 +08:00
这个需求就不再是 proxy 了, 应该是 rewrite
gstqc
2018-11-12 08:39:04 +08:00
rewrite 再 proxy_pass
imdong
2018-11-12 08:54:23 +08:00
nginx 重写里面 规则的 末尾 带不带 / 不是一个意思...
参考 1 楼...
awker
2018-11-12 09:15:11 +08:00
@yuikns 这样请求就变成 http://ip:port/web-test/test/ 了
JavaFirstMaster
2018-11-12 09:30:06 +08:00
最简化配置
```
location ^~ /test/ {
rewrite ^/test/(.*) /web-test/$1 break;
proxy_pass http://127.0.0.1:8888;
}
```
awker
2018-11-12 14:45:06 +08:00
@JavaFirstMaster 你这种跟我给出的是一样的作用
location ^~ /test/ {
proxy_pass http://127.0.0.1:8888/web-test/;
}
awker
2018-11-12 14:48:52 +08:00
找到解决办法了
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;
}

就可以了
JavaFirstMaster
2018-11-12 17:49:49 +08:00
@awker 你有实际测试吗?
v2ex 没法放图,搜一个博客给你看看 https://xuexb.com/post/nginx-url-rewrite.html
请看此博客中"简单例子"的第 14 行.
awker
2018-11-12 19:21:34 +08:00
@JavaFirstMaster 一样的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/506839

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX