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/

И все начало работать просто отлично.

Другие вопросы по тегам