请教一个 nginx 转发 tomcat 的配置问题

2019-08-24 22:27:35 +08:00
 Newyorkcity

我想要针对所有向 wangzhan.com/api/{something} 发起的请求,然后把它变成 wangzhan.com/{something} (也就是说把 /api 给去掉) 发给监听 8080 端口的 tomcat 该如何做呢?

我自己其实之前写了一个,还以为成功了,然而这个其实非常坑爹。如果有大佬有兴趣可以看一下我的这个代码看看能不能直接看出遇上啥问题

    server {
        listen  80 default_server;
        server_name 这行没啥问题,自己小破站的网址就不贴了

        if ( $request_uri !~ ^/api/.*$ ){
            rewrite ^/(.*)$ https://$server_name/$1 permanent;
        }

        location ~ ^/api/(.*)$ {
            echo $1; #为什么能用 echo ?因为我安装了 echo-nginx-module 这个模块
            # proxy_pass http://127.0.0.1:8080/$1; 这个是我原来写的,后来我觉得哪里不对于是用 echo 进行测试,才注释掉了这一行有了上面一行
        }
    }
要是有大佬找乐子 要决定直接看出问题


所以我这里


空几行


大佬喝茶

问题如下:

root@VM-133-145-debian:~# curl localhost/api/hello
hello
root@VM-133-145-debian:~# curl localhost/api/hello?a=b
hello
1169 次点击
所在节点    问与答
8 条回复
nieqibest
2019-08-25 00:26:58 +08:00
location ^~ /api/ {
proxy_pass http:127.0.0.1:8080/;
}
直接这样就可以了,少用 if
hardwork
2019-08-25 08:23:48 +08:00
意思是漏了参数吗
Newyorkcity
2019-08-25 10:29:33 +08:00
@hardwork 是的
Newyorkcity
2019-08-25 10:29:45 +08:00
@nieqibest 额,这样 /api 没有被删掉啊
zw1one
2019-08-25 10:46:59 +08:00
location /api {
if ($request_uri ~* "/api/(.*)") {
proxy_pass http://java-api/$1;
}
}
Newyorkcity
2019-08-25 11:09:53 +08:00
@zw1one 诶,有效果了!请问是因为 location 的匹配字符串会自动删去后面的请求参数么?你是怎么了解到这个知识点的啊?
nieqibest
2019-08-25 15:24:51 +08:00
@Newyorkcity 你试验了?
zw1one
2019-08-26 10:05:35 +08:00
@Newyorkcity "$1"是指~* "/api/(.*)"中匹配的第一个段,即(.*)的匹配。

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

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

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

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

© 2021 V2EX