V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DoraJDJ
V2EX  ›  Node.js

Koa 如何在后端里显示服务器的主机名(或域名)?

  •  
  •   DoraJDJ · 2016-07-01 13:54:06 +08:00 · 5522 次点击
    这是一个创建于 3059 天前的主题,其中的信息可能已经有所发展或是发生改变。

    标题可能写的不怎么好。

    我想给自己用 Koa 写的 API 程序里弄一个和GitHub API 一样的 API 目录之类的东西,可是我不知道如何在后端里获取自己服务器的域名。

    比如我的服务器的域名为 example.com ,那么内容应该是这样的:

    {
      'example1': 'http://example.com/api/example1/',
      'example2': 'http://example.com/api/example2/'
    }
    

    而别人在使用我的项目时,域名为 qwertyu.io ,那么应该是这样的:

    {
      'example1': 'http://qwertyu.io/api/example1/',
      'example2': 'http://qwertyu.io/api/example2/'
    }
    

    可是就在这域名上我不知道该怎么做,是要人工配置定义域名还是有其它的轮子可以这么做?

    18 条回复    2016-07-01 15:28:15 +08:00
    rekulas
        1
    rekulas  
       2016-07-01 14:01:33 +08:00
    黑色主题怎么实现的
    DoraJDJ
        2
    DoraJDJ  
    OP
       2016-07-01 14:02:32 +08:00
    @rekulas 好像有的节点主题会不一样。
    rekulas
        3
    rekulas  
       2016-07-01 14:02:41 +08:00
    koa 不了解,不过域名不是可以动态获取么
    rekulas
        4
    rekulas  
       2016-07-01 14:03:32 +08:00
    @DoraJDJ 哦 我还以为 v2 的黑科技
    sfree2005
        5
    sfree2005  
       2016-07-01 14:12:26 +08:00   ❤️ 1
    这个吗?
    request.headers.host
    for8ever
        6
    for8ever  
       2016-07-01 14:15:59 +08:00
    你意思是服务器的域名和别人使用的域名不一样?
    DoraJDJ
        7
    DoraJDJ  
    OP
       2016-07-01 14:17:47 +08:00
    @for8ever 就是在域名不同的情况下显示的域名也跟着变。
    rekulas
        8
    rekulas  
       2016-07-01 14:21:01 +08:00
    @DoraJDJ nodejs 不熟悉 request.rawHeaders[1] 貌似可以获取到
    bigfei
        9
    bigfei  
       2016-07-01 14:21:25 +08:00   ❤️ 1
    使用 request.origin /request.host 都可以。
    see http://koajs.com/#request
    learnshare
        10
    learnshare  
       2016-07-01 14:21:59 +08:00
    写配置文件也可以吧,毕竟对外服务的时候,域名也都是外部程序管理的
    kamikat
        11
    kamikat  
       2016-07-01 14:31:09 +08:00
    读 Host 头域是可以的 https://github.com/koajs/koa/blob/master/docs/api/request.md#requesthost

    感觉还是写配置文件比较稳… 不同的域名的时候开不同的服务器实例用 nginx 做反向代理。
    DoraJDJ
        12
    DoraJDJ  
    OP
       2016-07-01 14:33:40 +08:00
    @sfree2005
    @bigfei
    刚才按照你们的方法试了一下,确实可以达到我的要求。
    另外我想问一下,按照这样的方法在生产环境中使用会不会出现一些可能会发生的问题?
    DoraJDJ
        13
    DoraJDJ  
    OP
       2016-07-01 14:34:52 +08:00
    @kamikat 我用 Host 头获取域名的情况:
    无反代:
    ```json
    {"code":0,"links":{"get_blacklist":"http://localhost:8388/api/v0/blacklists"}}
    ```

    Nginx 反代:
    ```json
    {"code":0,"links":{"get_blacklist":"http://ako.yudachi/api/v0/blacklists"}}
    ```
    sfree2005
        14
    sfree2005  
       2016-07-01 14:39:26 +08:00
    @DoraJDJ 写入官方文档了 应该不会有什么问题。如果真有问题,你可以提交 bug 的~
    kamikat
        15
    kamikat  
       2016-07-01 14:41:39 +08:00
    @DoraJDJ 也许是 nginx 配置在 server 块里有 proxy_set_header Host $host; 这样的话会把访问 nginx 的时候用的 host 设置到 Host 头域上,从 req.host 获取到的就是访问 nginx 的时候用的 Host 了(我觉得这个是期望的行为,理解有问题么?)
    DoraJDJ
        16
    DoraJDJ  
    OP
       2016-07-01 14:43:17 +08:00
    @kamikat 是的,我在本机里弄 Nginx 反代的时候确实有设置 Host 头:
    ```
    server {
    listen 80;
    server_name ako.yudachi;

    location / {
    proxy_pass http://127.0.0.1:8388;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    }
    }
    ```
    说起来很奇怪,真的有人弄反代的时候不设置 Host 头吗?
    kamikat
        17
    kamikat  
       2016-07-01 14:45:04 +08:00
    @DoraJDJ 给一个第三方的站点做反代的时候… 一般是不设置的(之前的回复是期望的效果么?)
    whimsySun
        18
    whimsySun  
       2016-07-01 15:28:15 +08:00   ❤️ 1
    this.origin
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2818 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:46 · PVG 13:46 · LAX 21:46 · JFK 00:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.