静态提供在自定义端口上打开的内部(apache 服务器)NodeJS api 并将其转发到公共 url
Posted
技术标签:
【中文标题】静态提供在自定义端口上打开的内部(apache 服务器)NodeJS api 并将其转发到公共 url【英文标题】:Statically serve internal (apache server) NodeJS api open on a custom port and forward it to the public url 【发布时间】:2021-09-02 12:39:09 【问题描述】:简介
我有一个大学管理的服务器,它不允许学生访问开放端口以进行互联网流量,但学生仍然可以打开端口(例如 4040 用于他们的 NodeJS 应用程序以进行内部访问)。
每个学生的帐户都有一个public_html
文件夹(类似于/var/www/
),该文件夹以静态方式(或由php 呈现)提供此URL(使用Apache 服务器)上public_html
中的所有文件:
http://mi-linux.wlv.ac.uk/~studentid/
问题
但是,就我而言,我想使用 postman 公开一个用于外部测试的 API,并将其添加到 React 应用程序中。问题是,它使用 NodeJS 和 express,并在端口 4040
上创建自己的服务器。
我可以在内部使用来自 ssh 的 curl 命令访问 API,例如:
studentid@csl-student:~$ curl http://localhost:4040
"message": "Hey! The backend is working. Explore routes from the code"
现在,由于学生不能允许针对 HTTP 流量的公开帖子,人们根本无法从服务器外部访问我的 NodeJS API(我必须这样做)。
我查过的东西
我广泛搜索了诸如如何静态地为 nodejs 应用程序提供服务、如何将端口从 8080(https 端口)转发到 4040(我的 NodeJS 端口)等主题,但其中大多数 需要 sudo 访问权限 ,其中一些根本不起作用。
我提出的解决方案
我想我仍然可以访问我的public_html
文件夹,该文件夹是静态服务的,并且可以呈现PHP
。我知道我可以创建一个index.html
(或index.php
)文件,该文件将在内部获取http://localhost:4040
,并简单地转发结果,因为API 端口在内部是打开的,并且index.html
文件可以在外部提供。
文件可以做什么
在加载文件时使用
http://mi-linux.wlv.ac.uk/~studentid/index.html
该文件可以在服务器本身内部加载来自localhost:4040
的响应(因为 API 可在内部访问),然后将结果连同状态代码和标头一起发送。
但是,我的 API 有多个路由,我无法对每个路由进行硬编码。必须有更有效的方法来做到这一点。
我在寻找什么
如果有人可以将我引导到一个已经制作的包,我将非常感激,该包是为了转发静态文件以及从内部 API 预加载的响应。
或者我可以有一个 php
脚本,它可以完成我需要的所有转发并将 API 公开。
PS:我知道这应该在 Server Fault 上问,但是因为我认为这可以通过使用脚本或其他东西来完成,所以我在这里问了。
【问题讨论】:
我想说您需要询问负责这些限制的人员。他们应该能够为您的要求命名一个解决方案,如果它是合法的...... @arkascha 我很想这样做,但这是我必须部署网站的任务的一部分,剩下不到 18 小时。我需要一个临时解决方案,或者如果我得到足够好的答案,我可以稍后编辑我的作业提交。考虑为这个问题增加赏金,但它说我需要等待 2 天,如果您可以投票或做类似的事情来获得更多关注,我们将不胜感激。谢谢... 【参考方案1】:解决方法是将您的 NodeJs 代码托管在第三方平台上,例如 Heroku。
并创建一个 PHP 脚本,充当中间件代理并向您的 Heroku-Hosted-NodeJs API 端点执行 curl 请求。
【讨论】:
是的,我知道我可以做到这一点(在其他地方托管),这就是我在答案中包含的内容,但我不知道该怎么做,我正在寻找一个脚本可以做到这一点,同时仍然保留状态代码...顺便说一句,感谢您的时间,如果您可以编辑答案以包含这样的脚本,将不胜感激。再次感谢。【参考方案2】:服务器上是否启用了 Apache 的插件 mod_rewrite
和 mod_proxy
?
如果是这样,也许您可以在 .htaccess
文件中使用带有 mod_rewrite 的 P 标志 的 ProxyReverse,如 in this post 所述:
RewriteEngine On
RewriteRule ^/node/(.*)$
http://localhost:4040/$1 [L,P]
ProxyPassReverse /node http://localhost:4040
(我现在无法测试,所以我的回答纯属推测,抱歉。)
另一个选项,如果服务器配置无法修改,可以使用mod_headers
和位置,但我不确定它是否透明:
Header edit Location ^http://internal\.example\.com/(.*) http://example.com/$1
【讨论】:
也相关:***.com/questions/23027847/…以上是关于静态提供在自定义端口上打开的内部(apache 服务器)NodeJS api 并将其转发到公共 url的主要内容,如果未能解决你的问题,请参考以下文章
我的 ngrok Tunne 状态显示正在重新连接在自定义端口上运行 (4901)