如何在Apache.htaccess中进行这种棘手的重写?

pn9klfpd  于 12个月前  发布在  Apache
关注(0)|答案(1)|浏览(111)

基本思路很简单:
我的服务器托管两个域-alice.combob.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.combob.com通过Cloudflare运行。我的服务器响应这些域,但DNS记录实际上将它们指向Cloudflare。因此,虽然我可以设置mod_proxy来简单地向其他域发出后台请求,但这将通过Cloudflare进行不必要的循环,并引入额外的故障点。这是一个选择,但我宁愿避免这种情况。事实上,任何形式的复制都是不必要的,因为这两个网站都运行在同一个Apache下。我只需要重写Host...

这能以某种方式实现吗?

wz3gfoph

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。举例来说:

# alice.com/.htaccess

# Proxy requests to alternative domain
RewriteRule ^webhook\.php$ http://bob.com/$0 [P]

(其中$0RewriteRule * 模式 * 对整个匹配的反向引用。只需重复保存webhook.php。)
但是,这是对目标页面(webhook.php)可能使用的任何外部资产的假设。显然,任何相对链接现在都是相对于alice.com的,而不是bob.com(因此可能也需要代理)。编辑:“这是贝宝的IPN回调”-啊,所以可能在这方面确定。

相关问题