嗯,我会尽量清楚一点。

在用node.js编写的应用程序服务器中,我具有用于多个端口的内部代理:

我的8080端口中的

  • 我有 rest api
  • 我的3000端口中的
  • 我有推送服务器并与聊天。

  • 我使用npm包subdomain-router进行端口内部路由,在“前端”中公开子域,这些子域代理回到这些端口。
    代码演示:(显然<some-app>不是应用程序的真实名称)
    require('subdomain-router')
    ({
      host: '<some-app>.herokuapp.com',
      subdomains:
      {
        '': 8080,   // <some-app>.herokuapp.com <=> ::8080   --WORKS--
        'api': 8080,  // api.<some-app>.herokuapp.com <=> ::8080
        'chat': 3000, // chat.<some-app>.herokuapp.com <=> ::3000
        'push': 3000  // push.<some-app>.herokuapp.com <=> ::3000
      }
    }).listen(process.env.PORT || 5000);
    

    该API很好用,尽管我无法通过<some-app>.herokuapp.com:8080来访问它,而只能通过<some-app>.herokuapp.com来访问,并让内部subdomain-router模块来实现它的魔力。
    另外,我无法访问子域。当尝试访问api.<some-app>.herokuapp.com时,我从heroku中获取No such app错误页面。

    TL; DR 访问<some-app>.herokuapp.com可以工作(重定向到我的API的/v1路径),但是无法访问<some-app>.herokuapp.com:8080<some-app>.herokuapp.com:3000chat.<some-app>.herokuapp.com

    当尝试通过在URL中指定端口来访问我的API(例如:<some-app>.herokuapp.com:8080)时,在浏览器(谷歌浏览器)中出现以下错误:ERR_CONNECTION_REFUSED

    我的有根据的猜测说它可能与在heroku中打开端口有关,但是我不知道如何执行此操作(尝试使用谷歌搜索功能)。
    它没有解释为什么我不能访问子域。

    将不胜感激在这个问题上。
    我是heroku的新手,真让人感到沮丧。

    谢谢!
    阿米特

    最佳答案

    好的,在进行了一些研究之后,我发现在Heroku中打开端口是禁用,而不允许

    围绕的唯一方法是使用子域,然后在应用程序内使用代理模块(例如我使用的subdomain-router)。

    但是-Heroku不允许您在其域上创建子域,这意味着your-app.herokuapp.com是固定的,不能有子域。
    在Heroku手册中,他们要求您拥有自己的域和dns提供程序来执行此操作,方法是在域设置的dns表中创建一个A别名(CNAME),该别名将引用您的应用程序herokuapp域,然后使用命令heroku domains:add将您的域添加到允许的来源列表中。

    您可以阅读更多here。它提供了您需要的所有信息。

    希望它对一些人有所帮助。

    09-20 13:09