我们基于 Zend Framework 运行一个站点,使用 apache httpd (2.2) 以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)
其中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
因为只有 vhost 存在问题,所以external
我们假设是mod_proxy
和mod_rewrite
组合存在问题。有什么想法吗?
问候
答案1
我绝不是专家,但我必须将 [OR] 添加到我的文件中。如所述这里
RewriteEngine on
RewriteCond %{REQUEST_URI} !^.*robots.txt [OR]
RewriteCond %{REQUEST_URI} !^.*/static/.*
RewriteRule .* index.php [L]
答案2
我不知道这是否适用于您的应用程序,但您不能使用它的内容$_SERVER["REQUEST_URI"]
吗?
答案3
您是否尝试过类似这样的事情:
RewriteRule .* index.php [L,E=REQUEST_URL:$ENV{'REQUEST_URL'}]
基本上,这个想法就是从一个环境中拾起它,然后将其推到下一个环境中。不确定这是否可行,但尝试一下也无妨。
答案4
我相信我们通过升级 Zend Framework 解决了这个问题,更高版本不依赖于 REQUEST_URL。看来 REQUEST_URL 的行为会根据安装的模块而有所不同。请参阅此邮件列表主题