Apache ProxyPass для URL не работает
Это сводит меня с ума. У меня есть активный и используемый прокси-сервер Apache, обслуживающий контент на EC2. Он отлично работает и имеет множество vhosts, которые настроены так:
<VirtualHost *:80>
ServerName m.FOO.com
ServerAlias customer.FOO.com
ProxyPreserveHost On
ProxyPass / ajp://10.211.42.48:8009/
ProxyPassReverse / ajp://10.211.42.48:8009/
<Proxy ajp://10.211.42.48:8009/*>
Order allow,deny
Allow from all
</Proxy>
</VirtualHost>
Все это прекрасно работает, и у меня нет проблем. Теперь я хотел бы переместить его так, чтобы вместо одного vhost для каждого приложения я хотел иметь под-URL на главном сайте, который проксирует обратно к серверу приложений. Таким образом, вместо клиента, имеющего "customer.FOO.com", у него будет "FOO.com/customer/"
Отлично, звучит просто, правда? Да, не так много. Я редактирую запись vhost для "root" сервера (в данный момент показывающую целевую страницу) и добавляю записи прокси-серверов в каталоги внутри этого. Это должно сделать это, верно? Да, это не так
<VirtualHost *:80>
ServerName web01.aws.FOO.com
DocumentRoot /var/www/html
ErrorLog logs/www.FOO.com-error_log
CustomLog logs/www.FOO.com-access_log common
<Location /a>
ProxyPass ajp://10.211.42.48:8009
ProxyPassReverse ajp://10.211.42.48:8009
</Location>
<Location /t>
ProxyPass http://adm01
ProxyPassReverse http://adm01
</Location>
<Proxy ajp://10.211.42.48:8009/*>
Order allow,deny
Allow from all
</Proxy>
</VirtualHost>
Если я нажму http://www.foo.com/t/ - я получу внутренний веб-сервер - он правильно проксирует, и все хорошо. Если я нажимаю http://www.foo.com/a/, я получаю ошибку 404. Журнал доступа даже показывает ошибку 404.
Обратите внимание, что записи ProxyPass AJP идентичны записям в другой записи vhost. Так почему же он работает с корнем на другой записи vhost, а не как с поддиректорией здесь на главном vhost?
Halp!
1 ответ
В итоге я решил эту проблему с одним конкретным намеком, обнаруженным где-то в списке рассылки. Директива ProxyPassReverse очень обидчива и имеет одну основную функцию. Все, что соответствует второму аргументу (при условии использования формы ProxyPassReverse A B), будет применено к первому аргументу. Поэтому важно убедиться, что второй аргумент является именно перенаправлением, исходящим из вашего приложения, иначе директива ProxyPassReverse будет проигнорирована.
В моем случае то, что я закончил, изменило запись Location на:
ProxyPass /a/ ajp://10.211.42.48:8009
ProxyPassReverse /a/ http://my.apphost.com/
И все начало работать просто отлично.