通过 htaccess/apache 将子域名的所有请求代理到 IP

通过 htaccess/apache 将子域名的所有请求代理到 IP

假设我有以下子域名,它有自己的文档根目录等:

monad2.mysite.com

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

我有以下(htaccess)配置,它可以在子域上运行,但无法代理任何其他请求......

Options +FollowSymLinks
RewriteEngine on
RewriteRule (.*) http://193.159.3.129/$1 [P]

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

另外,我推测这个系统肯定不适用于 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

答案1

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

ProxyPass并且ProxyPassReverse不能位于.htaccess文件中 - 因此用以下规则替换您当前的重写规则,该规则应位于<VirtualHost>子域的块内:

ProxyPass / http://193.159.3.129/
ProxyPassReverse / http://193.159.3.129/

另外:.htaccess能避免就不要用。查看Apache 关于此事的文档

一般来说,仅当您无权访问主服务器配置文件时才应使用 .htaccess 文件。

相关内容