V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
ecapsul
V2EX  ›  NGINX

请教 nginx 跳转 写法

  •  
  •   ecapsul · 2015-03-24 14:23:32 +08:00 · 6123 次点击
    这是一个创建于 3292 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目的就是为了用一个域名多级目录跳转到不同服务器
    比如
    访问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/;
            }
    

    }

    第 1 条附言  ·  2015-03-24 15:09:28 +08:00
    抱歉,太激动,忘记说了,目标服务器里本身不含有a b目录,我只想在主域名那里/a /b这样区别不同应用
    25 条回复    2015-08-05 12:32:16 +08:00
    hging
        1
    hging  
       2015-03-24 14:54:09 +08:00
    ....跳转写rewrite不就行了.
    location /a/ {
    rewrite http://192.168.0.1:8080/;
    }
    ecapsul
        2
    ecapsul  
    OP
       2015-03-24 14:59:37 +08:00
    这样直接报错啊nginx: [emerg] invalid number of arguments in "rewrite" directive
    fising
        3
    fising  
       2015-03-24 15:00:40 +08:00
    @hging 他说的应该是请求转发。另外就算是rewrite,你的语法也是错误的。
    ecapsul
        4
    ecapsul  
    OP
       2015-03-24 15:02:12 +08:00
    @fising, 是的,主要是要跳转到不同服务器,找不到相关参考
    shiny
        5
    shiny  
       2015-03-24 15:02:15 +08:00
    你是想 30x 跳转还是反向代理?
    ecapsul
        6
    ecapsul  
    OP
       2015-03-24 15:06:48 +08:00
    @shiny ,是反向代理,因为url里我希望保留自己输入的内容,比如www.test.com/a ,而不是被替换掉
    hging
        7
    hging  
       2015-03-24 15:12:11 +08:00
    之前搞定过....但是..没留下配置.....汗...
    leassy
        8
    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
        9
    ecapsul  
    OP
       2015-03-24 15:18:39 +08:00
    @leassy ,条件所迫,我这些都在路由上实现,让路由做前端向后台发请求,所以希望尽可能简单
    Csineneo
        10
    Csineneo  
       2015-03-24 15:33:18 +08:00
    return 302 http://192.168.0.1:8080/;
    shiny
        11
    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
        12
    ecapsul  
    OP
       2015-03-24 16:04:27 +08:00
    @shiny ,目标服务器里没有a b目录也行吗,我将配置最小化了,测试还是不行
    shiny
        13
    shiny  
       2015-03-24 16:06:39 +08:00
    @ecapsul proxy_pass 的值如果以 / 结尾就行,douban.com 也没有 a 目录。
    你把你的步骤说下?或者有时候粗心大意比如改错配置文件、没有 reload 配置,都是有可能的。
    ecapsul
        14
    ecapsul  
    OP
       2015-03-24 16:34:54 +08:00
    @shiny ,确实是,以/结尾应该就可以,但我这里偏偏出问题,我再找找,有更新再来这里贴出,主要自己属于半吊子,有需要了才学,来不及啊。谢谢你
    msg7086
        15
    msg7086  
       2015-03-24 17:06:02 +08:00
    「不成功」 <- 怎么个不成功?
    ecapsul
        16
    ecapsul  
    OP
       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/;
    }
    ruanjf
        18
    ruanjf  
       2015-03-25 09:37:11 +08:00
    proxy_pass少break吧
    ecapsul
        19
    ecapsul  
    OP
       2015-03-25 11:30:32 +08:00
    @ruanjf ,rewrite才有break的语法,proxy_pass没有的
    ecapsul
        20
    ecapsul  
    OP
       2015-03-25 13:05:55 +08:00
    更新一下,看来是目标服务器的问题,跳转到我目标服务器后,页面显示就不正常。如果跳转到douban等等外部网站就没问题,不折腾了,我还是维持xxx.test.com 这样的二级域名,每个写一个吧。
    其实所有的一切都是为了ssl证书,因为通配符的证书太贵,为二级域名配置ssl的话每个网址都要买一个,本来想通过\a \b \c这样子目录的方式来代替,只有搁置计划了。感谢各位的帮助,虽然没有成功,还是学到了一些东西
    lujiajing1126
        21
    lujiajing1126  
       2015-03-25 13:30:12 +08:00
    @hging rewrite至少需要两个参数。。第一个参数是你要把哪部分改写。。
    晕- -
    ksupertu
        22
    ksupertu  
       2015-03-27 17:04:45 +08:00
    a 和b那里把最后一个斜杠删了
    location /a {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    rewrite ^/openvpnmonitor/(.*)$ /$1 break;
    proxy_pass http://192.168.5.198:81;
    }
    ksupertu
        23
    ksupertu  
       2015-03-27 17:06:03 +08:00
    上一条rewrite那里写错了,是a,忘记改了……

    a 和b那里把最后一个斜杠删了
    location /a {
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    rewrite ^/a/(.*)$ /$1 break;
    proxy_pass http://192.168.5.198:81;
    }
    ecapsul
        24
    ecapsul  
    OP
       2015-04-22 14:33:22 +08:00
    最后变相搞定了,我把nginx换了,也不用路由做反向代理了,而是转到内网一台机器上的apache做了反代,目前一切工作如预期的,完全满足了自己的要求,再次感谢各位
    ruanjf
        25
    ruanjf  
       2015-08-05 12:32:16 +08:00
    location /
    {

    proxy_redirect off;
    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_pass http://192.168.0.1:80;

    }



    location /fileCenter
    {

    proxy_redirect off;
    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_pass http://192.168.0.2:80/fileCenter;


    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2852 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:20 · PVG 23:20 · LAX 08:20 · JFK 11:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.