基本思想很简单:
我的服务器托管两个域 -
alice.com
和 bob.com
。大多数情况下,它们是不同的、不相关的网站,但有一个 URL 曾经位于 alice.com
,现在需要位于 bob.com
下。换句话说,当请求到达 http://alice.com/webhook.php
时,我希望请求到达 http://bob.com/webhook.php
。
到目前为止很简单,直到你考虑到皱纹:
.htaccess
文件来实现此目的(或者,在最坏的情况下,我也可以编写一些代理请求的 PHP 代码...)
include()
。alice.com
和 bob.com
通过 Cloudflare 运行。我的服务器响应这些域,但 DNS 记录实际上将它们指向 Cloudflare。因此,虽然我可以设置 mod_proxy
来简单地向其他域发出后台请求,但这将在 Cloudflare 中产生不必要的循环,并引入额外的故障点。这是一种选择,但我宁愿避免这种情况。事实上,任何类型的代理似乎都是不必要的步骤,因为两个网站都在同一个 Apache 下运行。我只需要重写Host
...这可以通过某种方式实现吗?
每个网站都在不同的用户帐户下运行(通过 PHP-FPM),所以我不能只使用 PHP 的
。include()
虽然您可能可以使用 PHP 的 fopen 包装器并发出 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 即可。例如:
# alice.com/.htaccess
# Proxy requests to alternative domain
RewriteRule ^webhook\.php$ http://bob.com/$0 [P]
(其中
$0
是通过 RewriteRule
模式对整个匹配的反向引用。只需保存重复 webhook.php
。)
但是,这是对目标页面 (
webhook.php
) 可能使用的任何外部资产做出的假设。显然,任何相对链接现在都是相对于 alice.com
,而不是 bob.com
(因此可能还需要代理)。编辑:“这是 PayPal 的 IPN 回调” - 啊,所以在这方面可能没问题。