假设我有以下子域名,它有自己的文档根目录等:
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/b
http://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 文件。