Мы запускаем сайт на базе 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
Потому что проблема только в external
vhost мы предполагаем, что это проблема с mod_proxy
и mod_rewrite
сочетание. Любые идеи?
С уважением
Я считаю, что мы решили эту проблему, обновив Zend Framework, более поздние версии не зависят от REQUEST_URL. Похоже, REQUEST_URL имеет разное поведение в зависимости от установленных модулей. Видеть эта ветка списка рассылки
Вы пробовали что-то вроде:
RewriteRule .* index.php [L,E=REQUEST_URL:$ENV{'REQUEST_URL'}]
По сути, идея состоит в том, чтобы забрать его из одной среды и просто перелопатить в другую. Не уверен, что это сработает, но не помешает попробовать.
Я не знаю, применимо ли это к вашему приложению или нет, но вы не могли использовать содержимое $_SERVER["REQUEST_URI"]
вместо?
Я ни в коем случае не эксперт, но мне пришлось поставить [ИЛИ] в свой файл. Как указано Вот
RewriteEngine on
RewriteCond %{REQUEST_URI} !^.*robots.txt [OR]
RewriteCond %{REQUEST_URI} !^.*/static/.*
RewriteRule .* index.php [L]