基本思路很简单:
我的服务器托管两个域-alice.com
和bob.com
。在大多数情况下,它们是不同的,不相关的网站,但有一个URL曾经是alice.com
,现在需要转到bob.com
下。换句话说,当一个请求到达http://alice.com/webhook.php
时,我希望请求到达http://bob.com/webhook.php
。
到目前为止很简单,直到你考虑到皱纹:
- 这是一个外部第三方服务器调用的webhook。我不能让第三方更改URL,我不知道他们是否能够遵循HTTP重定向,所以我假设最坏的情况。因此,我不想要HTTP重定向--我只想让Apache在内部处理这个问题。(对于好奇-这是贝宝的IPN回调)。
- 我不拥有或完全控制服务器-它是由托管公司管理。特别是,我没有root访问权限,无法编辑Apache的完整配置。我只能使用
.htaccess
文件来实现这一点(或者,在最坏的情况下,我也可以编写一些PHP代码来代理请求...) - 不过,我可以要求托管公司添加Apache模块,他们会这样做,如果这是一个合理的要求。
- 它的设置方式,每个网站都在不同的用户帐户下运行(通过PHP-FPM),所以我不能只使用PHP的
include()
。 - 域
alice.com
和bob.com
通过Cloudflare运行。我的服务器响应这些域,但DNS记录实际上将它们指向Cloudflare。因此,虽然我可以设置mod_proxy
来简单地向其他域发出后台请求,但这将通过Cloudflare进行不必要的循环,并引入额外的故障点。这是一个选择,但我宁愿避免这种情况。事实上,任何形式的复制都是不必要的,因为这两个网站都运行在同一个Apache下。我只需要重写Host
...
这能以某种方式实现吗?
1条答案
按热度按时间wz3gfoph1#
每个网站都在不同的用户帐户下运行(通过PHP-FPM),所以我不能只使用PHP的
include()
。虽然你可以使用PHP的fopen Package 器并发出HTTP请求(即。
include('http://bob.com/webhook.php')
)-但这显然会触发一个外部HTTP请求,这是您试图避免的。虽然这可能是最简单的解决方案,在这种情况下,我会认为。任何形式的复制似乎都是不必要的步骤,因为这两个网站都运行在同一个Apache下。
但是(这是一个很大的但是)你没有访问服务器配置。如果您这样做了,那么在虚拟主机容器中配置一个
Alias
(或AliasMatch
)来将请求“重写”到文件系统的不同区域应该是相对简单的。或者你可以使用mod_rewrite。不需要“反向代理”。但是,
.htaccess
(在用户态文件系统中)强加了额外的安全限制。您无法在此处配置Alias
。并且不能在内部重写到文档根目录以外的任意区域。从你的描述中,听起来“反向代理”是唯一的其他解决方案(接受这一点将触发外部HTTP请求)。但是,您不仅需要安装mod_proxy、mod_proxy_http(以及可能的其他相关模块),还“可能”需要配置
ProxyPassReverse
(取决于目标域是否发出任何(规范)重定向-重定向会“破坏”代理)-这只能在虚拟主机/服务器配置中配置。如果可以避免这种情况,那么只需要在.htaccess
中使用mod_rewrite来调用这个URL上的mod_proxy。举例来说:(其中
$0
是RewriteRule
* 模式 * 对整个匹配的反向引用。只需重复保存webhook.php
。)但是,这是对目标页面(
webhook.php
)可能使用的任何外部资产的假设。显然,任何相对链接现在都是相对于alice.com
的,而不是bob.com
(因此可能也需要代理)。编辑:“这是贝宝的IPN回调”-啊,所以可能在这方面确定。