请教 nginx 跳转 写法

2015-03-24 14:23:32 +08:00
 ecapsul

目的就是为了用一个域名多级目录跳转到不同服务器
比如
访问www.test.com/a 跳转到内网服务器192.168.0.1:8080
访问www.test.com/b 跳转到内网服务器192.168.0.2:8080

尝试了很多次,都不成功,特来求助。

server {
 listen 80;
    server_name www.test.com;
     location /a/ {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Host $host;

          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_pass http://192.168.0.1:8080/;
        }
     location /b/ {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Host $host;

          proxy_set_header X-Forwarded-For $remote_addr;
          proxy_pass http://192.168.0.2:8080/;
        }

}

6160 次点击
所在节点    NGINX
25 条回复
hging
2015-03-24 14:54:09 +08:00
....跳转写rewrite不就行了.
location /a/ {
rewrite http://192.168.0.1:8080/;
}
ecapsul
2015-03-24 14:59:37 +08:00
这样直接报错啊nginx: [emerg] invalid number of arguments in "rewrite" directive
fising
2015-03-24 15:00:40 +08:00
@hging 他说的应该是请求转发。另外就算是rewrite,你的语法也是错误的。
ecapsul
2015-03-24 15:02:12 +08:00
@fising, 是的,主要是要跳转到不同服务器,找不到相关参考
shiny
2015-03-24 15:02:15 +08:00
你是想 30x 跳转还是反向代理?
ecapsul
2015-03-24 15:06:48 +08:00
@shiny ,是反向代理,因为url里我希望保留自己输入的内容,比如www.test.com/a ,而不是被替换掉
hging
2015-03-24 15:12:11 +08:00
之前搞定过....但是..没留下配置.....汗...
leassy
2015-03-24 15:13:54 +08:00
楼主何不直接绑定站点www.test.com
写个PHP
访问www.test.com/a 跳转到内网服务器192.168.0.1:8080
访问www.test.com/b 跳转到内网服务器192.168.0.2:8080
即可
ecapsul
2015-03-24 15:18:39 +08:00
@leassy ,条件所迫,我这些都在路由上实现,让路由做前端向后台发请求,所以希望尽可能简单
Csineneo
2015-03-24 15:33:18 +08:00
return 302 http://192.168.0.1:8080/;
shiny
2015-03-24 15:37:39 +08:00
你这种写法没有问题,要注意的是 location 这样的写法优先级是比较低的。[1] 有可能被其他配置匹配到,看上去就没生效。

我测试了你这种写法是没问题的:

location /a/ {
proxy_pass http://www.douban.com/;
}

然后我的域名测试确实被反代了:
https://www.shiguanglu.com/a/
https://www.shiguanglu.com/a/online/12121314/

1. http://wiki.nginx.org/HttpCoreModule#location
ecapsul
2015-03-24 16:04:27 +08:00
@shiny ,目标服务器里没有a b目录也行吗,我将配置最小化了,测试还是不行
shiny
2015-03-24 16:06:39 +08:00
@ecapsul proxy_pass 的值如果以 / 结尾就行,douban.com 也没有 a 目录。
你把你的步骤说下?或者有时候粗心大意比如改错配置文件、没有 reload 配置,都是有可能的。
ecapsul
2015-03-24 16:34:54 +08:00
@shiny ,确实是,以/结尾应该就可以,但我这里偏偏出问题,我再找找,有更新再来这里贴出,主要自己属于半吊子,有需要了才学,来不及啊。谢谢你
msg7086
2015-03-24 17:06:02 +08:00
「不成功」 <- 怎么个不成功?
ecapsul
2015-03-24 17:07:14 +08:00
更新一下,改成了下面的语句在访问时候到时可以添加后缀/a,刷新后被替换,有了点进步,但是还是没搞定. 目标服务器没有/a目录,浏览器输入www.test.com/a后,页面开启,浏览器地址变为www.test.com/cgi-bin/luci , 目标服务器的网页根目录有一个index.html,那个会跳转到/cgi-bin/luci
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass https://192.168.0.1:8080/;
proxy_redirect https://192.168.0.1:8080/ /a/;
}
ecapsul
2015-03-24 17:59:44 +08:00
ruanjf
2015-03-25 09:37:11 +08:00
proxy_pass少break吧
ecapsul
2015-03-25 11:30:32 +08:00
@ruanjf ,rewrite才有break的语法,proxy_pass没有的
ecapsul
2015-03-25 13:05:55 +08:00
更新一下,看来是目标服务器的问题,跳转到我目标服务器后,页面显示就不正常。如果跳转到douban等等外部网站就没问题,不折腾了,我还是维持xxx.test.com 这样的二级域名,每个写一个吧。
其实所有的一切都是为了ssl证书,因为通配符的证书太贵,为二级域名配置ssl的话每个网址都要买一个,本来想通过\a \b \c这样子目录的方式来代替,只有搁置计划了。感谢各位的帮助,虽然没有成功,还是学到了一些东西

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

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

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

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

© 2021 V2EX