将 localhost:3280/some/long/url 镜像到 localhost:3000

将 localhost:3280/some/long/url 镜像到 localhost:3000

我有一个在 localhost 3280 上运行的 Web 服务,它在/some/long/url.我想从本地主机的端口 3000 访问 Elasticsearch。

我可以通过端口转发、镜像、代理来做到这一点吗?最好的办法是什么?

编辑:我的意思是该服务正在 3280 上运行,并且希望从已关闭的 3000 上访问它。

答案1

与 slm 的答案相比,必须维护两个不同的位置(iptables 和 apache),并且还会产生无法访问 localhost:3280 上的 / 的副作用,我将仅使用 Apache 来实现结果。这将通过 3000 上的 / 为 ElasticSearch 提供服务(而不是将用户“重定向”到 localhost:3280/some/long/url - 更改浏览器上显示的 url)。该解决方案一次性处理步骤 #4 和步骤 #7(#7 处的应用程序可以将流量重定向到级别 #4 的不同 IP)。

如果您已经mod_proxy加载了 Apache,您可以更改端口 3000 <VirtualHost>(我假设它正在使用*而不是虚拟主机声明中的 127.0.0.1):

<VirtualHost *:3000>
    .
    .
    .

    RewriteEngine On
    ProxyPass / http://127.0.0.1:3280/some/long/url 
    ProxyPassReverse / http://127.0.0.1:3280/some/long/url 
</VirtualHost>

编辑:更正规则应该在 3000 上,proxypass 到 3280,澄清与 slm 建议的差异,并删除有关在 ProxyPass 中更改 127.0.0.1 的点(因为它是虚拟主机片段正是原始问题中所要求的)。

参考:

虚拟主机指令的 Apache 文档ProxyPass 指令的 Apache 文档。

答案2

重定向端口

您可以使用以下 2 条规则来执行您想要的操作:

$ sudo iptables -t nat -A PREROUTING -p tcp --dport 3000 -j REDIRECT \
      --to-port 3280

$ sudo iptables -t nat -A OUTPUT -p tcp -d 127.0.0.0/8 --dport 3000 -j REDIRECT \
      --to-port 3280

如果您想在本地主机之外访问此规则,则需要使用主机的 IP 地址(假设 192.168.1.10)添加此规则:

$ sudo iptables -t nat -A OUTPUT -p tcp -d 192.168.1.10 --dport 3000 \
      -j REDIRECT --to-port 3280

重定向/ -> /some/long/url

这可以使用 Apache 中的重写规则来完成。这可以添加到 Apache 的httpd.conf文件中,例如:

RewriteEngine on
RewriteRule ^$ /some/long/url [R=301,L]

为什么有 2 个工具?

那么为什么需要iptablesApache?这与开放系统互连模型。 OSI 模型包含 7 层。

#7.应用程序(网络进程到应用程序)

#6。表示(数据表示、加密和解密、将机器相关数据转换为机器无关数据)

#5。会话(主机间通信,管理应用程序之间的会话)

#4。传输 -(端到端连接、可靠性和流量控制)

#3.网络 -(路径确定和逻辑寻址)

#2.数据链路 - (物理寻址)

#1.物理 -(媒体、信号和二进制传输)

iptablesApache 处理#4 层的数据,而 Apache 则处理#7 层的数据。将数据视为类似于信封。信封外面包含要投递的地址(这是端口号)。这将是 OSI 模型中的第 4 层。

信封的内容(HTTP + URL)需要由 Apache 在第 7 层进行操作。

参考

相关内容