我有一个用于维护网站的生产、测试和开发服务器。这三台服务器都在 Debian 6 GNU/Linux 上运行 Apache 2.2.16。我在测试服务器上设置了我们公司网站的新版本,我的团队认为它足够稳定,可以转移到生产。但是,我希望使这一过渡尽可能无缝。我希望能够在生产服务器上转发请求,以便由测试服务器处理它们。这样,我就可以测试这个新实现,而无需在生产服务器上进行任何复杂的配置更改。
理想情况下,我可以使用 Apache 的mod_proxy
模块设置反向代理,这样我就可以直接从测试服务器向生产客户端提供页面。我阅读了以下文档:http://httpd.apache.org/docs/2.0/mod/mod_proxy.html,这对我非常有帮助。我启用了mod_proxy
和mod_proxy_http
,然后在我的开发服务器上设置了以下规则。
<VirtualHost *:80>
ServerName dev.example.com
# ... other <VirtualHost>-specific settings ...
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://test.example.com/
ProxyPassReverse / http://test.example.com
# ... various <Directory> directives ...
</VirtualHost>
效果非常好。当我访问开发服务器时,网站直接从测试服务器提供所有页面,看起来好像这些响应直接来自我连接的服务器。此外,这些请求非常灵敏,我可以发出 GET 和 POST 请求,就像直接与测试服务器对话一样。
不幸的是,这并不能满足我的所有需求。由于测试服务器只运行带有新版本网站的 Apache,因此我无法从测试服务器托管 Webmail 或用户目录。这些请求必须由生产服务器处理。
我希望我的生产服务器能够对所有页面使用反向代理除了 /webmail
和用户目录(以波浪号开头的任何目录)。理论上,使用<ProxyMatch>
指令可以实现这一点。但是,我没有足够的正则表达式来做到这一点。是否有一条规则能够排除这两种类型的请求发送到代理服务器?
奖励积分:我正在寻找一本好的 PCRE 入门指南,以便我可以编写自己的规则。有人能给正则表达式新手推荐一下吗?