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

问题描述 投票:0回答:1

基本思想很简单:

我的服务器托管两个域 -

alice.com
bob.com
。大多数情况下,它们是不同的、不相关的网站,但有一个 URL 曾经位于
alice.com
,现在需要位于
bob.com
下。换句话说,当请求到达
http://alice.com/webhook.php
时,我希望请求到达
http://bob.com/webhook.php

到目前为止很简单,直到你考虑到皱纹:

  • 这是外部第 3 方服务器调用的 Webhook。我无法让第 3 方更改 URL,而且我不知道他们是否能够遵循 HTTP 重定向,所以我假设最坏的情况。因此,我不需要 HTTP 重定向 - 我只是希望 Apache 在内部处理这个问题。 (出于好奇——这是 PayPal 的 IPN 回调)。
  • 我不拥有或完全控制服务器 - 它由托管公司管理。特别是,我没有 root 访问权限,无法编辑 Apache 的完整配置。我只能使用
    .htaccess
    文件来实现此目的(或者,在最坏的情况下,我也可以编写一些代理请求的 PHP 代码...)
    • 但是,我可以要求托管公司添加 Apache 模块,如果请求合理,他们会这样做。
  • 它的设置方式是,每个网站都在不同的用户帐户下运行(通过 PHP-FPM),所以我不能只使用 PHP 的
    include()
  • alice.com
    bob.com
    通过 Cloudflare 运行。我的服务器响应这些域,但 DNS 记录实际上将它们指向 Cloudflare。因此,虽然我可以设置
    mod_proxy
    来简单地向其他域发出后台请求,但这将在 Cloudflare 中产生不必要的循环,并引入额外的故障点。这是一种选择,但我宁愿避免这种情况。事实上,任何类型的代理似乎都是不必要的步骤,因为两个网站都在同一个 Apache 下运行。我只需要重写
    Host
    ...

这可以通过某种方式实现吗?

apache .htaccess
1个回答
0
投票

每个网站都在不同的用户帐户下运行(通过 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 回调” - 啊,所以在这方面可能没问题。

© www.soinside.com 2019 - 2024. All rights reserved.