通过 htaccess/apache 将所有对子域的请求代理到一个 ip

Chr*_*ian 5 proxy ip .htaccess subdomain apache-2.2

假设我有以下子域及其自己的文档根等:

monad2.mysite.com
Run Code Online (Sandbox Code Playgroud)

我希望所有请求都代理到一个 IP(例如193.159.3.129),但它们必须通过服务器mysite.com(假设monad2在同一台服务器上)。

我有以下(htaccess)配置,它适用于子域,但无法代理任何其他请求......

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://193.159.3.129/$1 [P]
Run Code Online (Sandbox Code Playgroud)

我的问题是,虽然它确实适用于http://monad2.mysite.com/a.php(url 保持不变),但它不适用于(urlhttp://monad2.mysite.com/a/b转换为http://193.159.3.129/a/b)之类的请求。请注意,后一个地址显示了代理服务器的目录列表,这是正确的,只是子域更改为 ip。

另外,我认为这个系统肯定不能用于 HTTPS 请求,对吗?

编辑:经过更多的故障排除后,我确切地找到了问题发生的时间。每当我尝试访问没有最后一个斜杠的目录时,代理就会失败,我最终会得到一个 IP。一些例子:

Original                        | Result
--------------------------------+--------------------------------
http://monad2.mysite.com        | http://monad2.mysite.com
http://monad2.mysite.com/a/     | http://monad2.mysite.com/a/
http://monad2.mysite.com/a      | http://193.159.3.129/a/           <- !
http://monad2.mysite.com/a.php  | http://monad2.mysite.com/a.php
Run Code Online (Sandbox Code Playgroud)

Sha*_*den 6

您需要ProxyPassReverse- 它捕获Location响应标头中的字段并更改它们,以便客户端将继续与代理通信,而不是后端服务器。

ProxyPass并且ProxyPassReverse不能在.htaccess文件中 - 所以用这个替换你当前的重写规则,它应该在你<VirtualHost>的子域块中:

ProxyPass / http://193.159.3.129/
ProxyPassReverse / http://193.159.3.129/
Run Code Online (Sandbox Code Playgroud)

顺便说一句:.htaccess在可以避免的情况下不要使用。查看有关此事Apache 文档

通常,当您无权访问主服务器配置文件时,您应该只使用 .htaccess 文件。

  • 将 `ProxyPreserveHost On` 添加到您的配置中以将主机标头发送到 PHP 服务器,或使用 `ProxyPassReverseCookieDomain` 更改响应标头中的 cookie 域。 (2认同)