barbitoff programmer`s blog

Здесь я публикую заметки из программерской жизни: грабли, на которые мне случилось наступить, проблемы, для которых было найдено элегантное (или не очень) решение, а также все, с чем мне пришлось столкнуться и чем хотелось бы поделиться =)
PS Если хотите меня поблагодарить - на странице есть 3 места, чтобы это сделать =)

среда, 28 марта 2012 г.

Конфигурация Apache2 HTTP Server: относительные приоритеты директив Redirect, ProxyPass и RewriteRule

Не знаю, написано ли это где-то в документации по Apache2 (я по крайней мере не нашел), но директива ProxyPass имеет больший приоритет, чем директива Redirect, независимо от порядка их следования в файле конфигурации, т.е. если мы имеем следующую конфигурацию:
Redirect permanent /xxx http://ya.ru
ProxyPass / http://google.com/
, то при обращении по URL`у www.myserver.com/xxx вместо браузерного редиректа на Яндекс мы увидим результат проксирования запроса на URL http://google.com/xxx. Чтобы заставить Apache работать, как мы хотим, нужно исключить путь /xxx из проксирования. В таком случае директива Redirect отработает. Получится конфиг вида:
ProxyPass /xxx !
Redirect permanent /xxx http://ya.ru
ProxyPass / http://google.com/
А вот mod_rewrite отрабатывает раньше, чем ProxyPass, поэтому URL`ы, используемые ProxyPass`ом, нужно исключать из правил mod_rewrite. Т.е. конфигурация https`ного виртуального хоста:
ProxyPass /xxx/ balancer://mybalancer/
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}

при обращении в /xxx приведет к редиректу на этот же URL по http, а не к использованию балансировщика mybalancer, как хотелось бы. Чтобы всё заработало, необходимо:
ProxyPass /xxx/ balancer://mybalancer/
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond $0 !/xxx/
RewriteRule (.*) http://%{HTTP_HOST}%{REQUEST_URI}


Комментариев нет:

Отправить комментарий