![所有流量都流向虚拟主机](https://linux22.com/image/715532/%E6%89%80%E6%9C%89%E6%B5%81%E9%87%8F%E9%83%BD%E6%B5%81%E5%90%91%E8%99%9A%E6%8B%9F%E4%B8%BB%E6%9C%BA.png)
我有一个应用程序正在运行http://本地主机:6512虚拟主机定义如下:
<VirtualHost *:80>
ServerName ldpmarmotta.example.com
ProxyPassMatch ^/(.*)$ http://localhost:6512/marmotta/$1
</VirtualHost>
我对上述定义有两个问题:
- 该服务器的所有流量包括http://example.com正在被引导至 http://本地主机:6512
- 对 ldpmarmotta.example.com 的请求被定向到 http://本地主机:6512。我没想到 URL 会改变,但响应返回的是 ldpmarmotta.example.com
答案1
你说: ”我有一个应用程序正在运行http://本地主机:6512“但就你的问题(以及这个答案)而言,最好这样说:
- 我正在运行一个监听端口 6512 的 HTTP 守护进程;我们把它称为我的守护进程。请注意,不是Apache;它是另一个应用程序;
另外,您说:“[...] 虚拟主机定义如下...”而且,最好还是这样说:
- 我也运行 Apache,配置为监听端口 80(显然 不是监听端口 6512)并定义单个 VirtualHost。具体来说,VirtualHost 定义如下 [...]
话虽如此(顺便说一句:我是对的吗?如果不是,请添加评论),你说有两个问题。
对于第一个:
该服务器的所有流量包括http://example.com正在被引导至http://本地主机:6512
我会这样说如果主机名example.com
解析为运行 Apache 的主机的某个 IP 地址,那么这是一种预期的行为作为:
- 启动生成的 HTTP 请求“http://example.com” 被 Apache 接收(因为它正在监听相关 IP 地址的 80 端口);
- 因为有不是明确定义的 VirtualHost 与
ServerName example.com
.... - ...Apache 将通过定义的第一个 VirtualHost 来处理请求。并且...
- 因为第一个虚拟主机是“你的”,所以 HTTP 请求被“代理”到 my_daemon 并且......
- 这样,my_daemon 将接收 HTTP 请求。
因此,我再一次表示,我没有发现问题。
再次重申,如果我的某些假设有误,请告诉我。
至于你的第二个“问题”,我发现它涵盖了两个不同的点。第一个是:
对 ldpmarmotta.example.com 的请求被定向到 http://本地主机:6512
并且,再次,这在我看来是一种预期的行为,因为这正是您在虚拟主机中配置的。
第二点是:
我没想到 URL 会改变,但响应返回的是 ldpmarmotta.example.com
我不是 100% 确定你到底想描述什么,但是...如果我拿出我的(布满灰尘的)水晶球,我敢打赌你一定遇到了问题代理传递:您有自己的 HTTP 守护程序正在运行(我的守护进程),但您不想将其直接暴露给互联网。因此,您在其前面放置了一个标准 Apache,并且……请 Apache 在互联网和您的守护进程之间来回传递 HTTP 请求。在这种情况下……您只需依靠ProxyPass
和 ProxyPassReverse
。
就像是:
ProxyPass / http://localhost:6512/marmotta/
ProxyPassReverse / http://localhost:6512/marmotta/
(顺便说一句:您使用了ProxyPassMatch
但作为您定义的 REGEX,它匹配......一切,它的行为就像一个标准的 ProxyPass。因此,我建议使用后者,因为它稍微更高效且更易读)。
至于ProxyPass
/ProxyPassReverse
详细用法....网络它实际上是满的详细的教程/文章,这样……您就可以轻松深入了解细节:-)
嗨嗨。