Как переписать / прокси-сервер Apache URI для приложения, прослушивающего определенный порт / сервер? - PullRequest
10 голосов
/ 23 сентября 2011

Говорят, что Apache mod_rewrite - это швейцарский армейский нож для манипулирования URL, но может ли он это сделать?

Допустим, я хочу добавить новое приложение на мой веб-сервер Apache, где единственным настраиваемым параметром приложения является номер порта.

Я хочу использовать и выдавать URL-адреса в форме "http://hostname.example.com/app", а не" http://hostname.example.com:8080".. Это будет гарантировать, что клиенты будут проходить через брандмауэр учреждения, и, как правило, он более аккуратный.

Мое приложение содержит абсолютные URI в php, javascript и css, поэтому я хочу добавить свое собственное корневое местоположение к URI во внутренних ссылках приложений. У меня нет доступа к записям DNS, поэтому я не могу создать еще один виртуальный сервер на основе имен.

Используя модули Apache mod_rewrite и mod_proxy, я могу прозрачно перенаправить клиента на правильную домашнюю страницу приложения. Но ссылки на этой домашней странице не указывают клиенту на ссылки относительно нового базового URL.

Итак, как лучше всего передать запрос приложению, которое прослушивает определенный порт?

Например, если бы у меня было приложение, прослушивающее порт 8080, я мог бы добавить это в мою конфигурацию Apache: -

<VirtualHost *:80>
    SSLProxyEngine On
    ServerName myhost.example.com
    RewriteEngine On
    UseCanonicalName On
    ProxyVia On
    <Location "/application">
        RewriteRule ^/application/?(.*) http://localhost:8080/$1 [P,L]
    </Location>
</VirtualHost>

Это бы хорошо работало, если бы приложение не использовало абсолютные URL, но это так. Что мне нужно сделать, это переписать URL-адреса, которые возвращаются css, javascript и php приложения.

Я посмотрел документацию по ProxyPass и ReverseProxyPass, но не думаю, что это сработает ..?

Я также сталкивался с mod_proxy_html Ника Кью, но это не входит в стандартный дистрибутив Apache, и веб-сервер моего учреждения, как представляется, в течение многих лет работал без него. За исключением траления вручную (или используя выражение типа grep -r | sed) через исходный код приложения, или используя это стороннее дополнение, есть ли другие способы сделать это?

Могу ли я использовать некоторые внутренние переменные сервера в правиле mod_rewrite? Например, правило перезаписи на основе «HTTP_REFERER»?

1 Ответ

14 голосов
/ 24 сентября 2011

Использование mod_proxy будет работать просто отлично.Например, я сопоставил https://localhost/yalla/, чтобы он указывал на подкаталог моего веб-сервера:

LoadModule proxy_module modules/mod_proxy.so
ProxyRequests On
<Proxy *>
      Order deny,allow
      Allow from localhost
</Proxy>
ProxyPass /yalla/ http://yalla.ynfonatic.de/tmp/

Если вы реализуете это, вы заметите, что изображения из списка каталогов не отображаются;это потому, что они ниже каталога / tmp / на удаленном сервере, поэтому не видны.

Итак, в вашем случае вы должны сделать:

LoadModule proxy_module modules/mod_proxy.so
ProxyRequests On
<Proxy *>
      Order deny,allow
      Allow from localhost # Or whatever your network is if you need an ACL
</Proxy>
ProxyPass /app/ http://hostname.example.com:8080/

Как и все в конфигурации Apache, смотрите эти косые черты при обращении к каталогам.

Удачи!Алекс.

...