嗯,我会尽量清楚一点。
在用node.js编写的应用程序服务器中,我具有用于多个端口的内部代理:
我的8080
端口中的
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:3000
或chat.<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。它提供了您需要的所有信息。
希望它对一些人有所帮助。