V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LeungJZ
V2EX  ›  程序员

api.example.com 如何代理到 www.example.com/api/ 下?

  •  
  •   LeungJZ ·
    JZLeung · 2018-03-05 12:07:32 +08:00 · 4208 次点击
    这是一个创建于 2447 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我想要实现的结果是:

    访问 api.example.com/hello/world

    就相当于访问 www.example.com/api/hellp/world

    这样。就是 url 看起来好看一点。

    这是 nginx 的配置

    然后访问,nginx 报错:no resolver defined to resolve

    18 条回复    2018-03-24 22:34:02 +08:00
    9200
        1
    9200  
       2018-03-05 14:35:04 +08:00
    首先你要把域名绑定服务器的 ip 地址

    api.example.com 绑定 /api 这个目录就好了。

    你这 nginx 配置文件好像写错了,
    barble
        2
    barble  
       2018-03-05 14:36:53 +08:00
    这个 rewrite 就能办到,不用 proxy
    oonnnoo
        3
    oonnnoo  
       2018-03-05 15:59:45 +08:00
    # 供参考

    location @redirect {
    rewrite ^/api/(.*)$ http://api.example.com/$1 redirect;
    }

    location /api/ {
    proxy_set_header Host $host;
    proxy_pass http://api.example.com/;
    proxy_connect_timeout 3s;
    error_page 500 502 504 @redirect;
    }
    oonnnoo
        4
    oonnnoo  
       2018-03-05 16:04:43 +08:00
    @oonnnoo #3 额。。。上一楼,我好像是弄反了,我再想想
    580a388da131
        5
    580a388da131  
       2018-03-05 16:05:40 +08:00
    绑定子目录就好了
    menduo
        6
    menduo  
       2018-03-05 16:20:42 +08:00
    没看出有什么总理 。location 换成 / 就行了吧。
    menduo
        7
    menduo  
       2018-03-05 16:21:02 +08:00
    没看出有什么问题 。location 换成 / 就行了吧。
    JHerschel
        8
    JHerschel  
       2018-03-05 16:54:03 +08:00
    在 proxy_pass 前面添加一条: " resolver 8.8.8.8; " 试试?
    LeungJZ
        9
    LeungJZ  
    OP
       2018-03-05 16:57:35 +08:00
    @9200 /api 是个路由,并非真实文件夹。

    @barble 我记得以前是 rewrite 但是我试过 rewrite,却跳转了。
    @menduo 不行吧,我一开始就是 location / 还是无限重定向。

    @JHerschel 我试试。
    alvinbone88
        10
    alvinbone88  
       2018-03-05 17:46:23 +08:00
    nextvay
        11
    nextvay  
       2018-03-05 17:52:34 +08:00
    root /home/xxxx/api;
    beginor
        12
    beginor  
       2018-03-05 19:36:11 +08:00 via Android
    可以用 proxy_pass 或者 rewrite 都可以解决, 仔细看一下 nginx 的文档就行。

    不过搭车问一下, 如果 api 中返回 http 重定结果向该怎么处理?
    LeungJZ
        13
    LeungJZ  
    OP
       2018-03-05 22:43:28 +08:00
    @beginor
    rewrite 好像也会 302 跳转到 rewrite 后的 url,能不能不让他跳呢?
    yankebupt
        14
    yankebupt  
       2018-03-05 23:54:36 +08:00
    为什么我觉得这样写会不会 www.example.com/api/api/api/api......无限循环...
    是不是错觉
    tomczhen
        15
    tomczhen  
       2018-03-06 00:25:24 +08:00 via Android
    客户端支持的话可以考虑用 307 跳转
    https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status/307
    qiayue
        16
    qiayue  
       2018-03-06 00:32:46 +08:00
    最省事的做法是把 api.example.com 也指向到 www.example.com
    然后 api 这样访问 api.example.com/api/hello/world
    LeungJZ
        17
    LeungJZ  
    OP
       2018-03-06 09:04:44 +08:00
    @qiayue 就是不想这么访问啊。

    @yankebupt 不是错觉,就是会。

    @tomczhen 这个好像可以有,先试试。
    LeungJZ
        18
    LeungJZ  
    OP
       2018-03-24 22:34:02 +08:00
    顶顶。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   972 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:39 · PVG 04:39 · LAX 12:39 · JFK 15:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.