我们使用 apache httpd (2.2) 运行一个基于 Zend 框架的站点,mod_rewrite
用于 SEO 和可用性友好的 URL:s。最近我们添加了mod_proxy
(和mod_proxy_balancer, mod_proxy_http, mod_rpaf
)来设置负载均衡器虚拟主机。
我们的设置现在看起来像:
external.site.com (vhost on server1.site.com with reverse proxy)
|-internal1.site.com (vhost on server1.site.com)
|-internal2.site.com (vhost on server2.site.com)
Where internal1
&internal2
提供大部分动态内容并external
提供静态内容以及一些管理类型页面。所有虚拟主机都有相同的代码和.htaccess
设置。
问题在于,external.site.com
没有RewriteRule
向请求环境添加正确的标头,特别REDIRECT_URL
是我们和 ZendFramework 所依赖的标头。对于转发到内部虚拟主机的请求,一切正常。
httpd.conf 的相关部分:
<VirtualHost *:80>
ServerName external.site.com
DocumentRoot /opt/www/htdocs/
CustomLog "/var/log/httpd-proxy-access.log" combined
<Proxy balancer://backend/>
Balancermember http://internal1.site.com
Balancermember http://internal2.site.com
ProxySet lbmethod=byrequests
</Proxy>
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPass /static/ !
ProxyPass /config/ !
ProxyPass / balancer://backend/
ProxyPassReverse / balancer://backend/
</VirtualHost>
<VirtualHost *:80>
ServerName internal1.site.com
RPAFenable On
RPAFproxy_ips 127.0.0.1
</VirtualHost>
从.htaccess
文件中:
RewriteEngine on
RewriteCond %{REQUEST_URI} !^.*robots.txt
RewriteCond %{REQUEST_URI} !^.*/static/.*
RewriteRule .* index.php [L]
php_flag magic_quotes_gpc off
php_flag register_globals off
因为只有external
虚拟主机上存在问题,所以我们假设它是mod_proxy
andmod_rewrite
组合的问题。有任何想法吗?
问候
我绝不是专家,但我必须将 [OR] 放入我的档案中。如此处所述
我不知道这是否适用于您的应用程序,但您不能使用的内容来
$_SERVER["REQUEST_URI"]
代替吗?您是否尝试过类似的方法:
基本上,这个想法是从一个环境中拾取它,然后将它铲到下一个环境中。不确定它会起作用,但尝试一下不会有什么坏处。
我相信我们通过升级 Zend 框架解决了这个问题,以后的版本不依赖于 REQUEST_URL。似乎 REQUEST_URL 具有不同的行为,具体取决于安装的模块。请参阅此邮件列表线程