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

Они говорят, что mod_rewrite Apache - это швейцарский армейский нож для манипулирования 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?


person Alex Leach    schedule 23.09.2011    source источник
comment
Вам нужен mod-proxy-html, потому что внутренние ссылки на веб-страницах могут указывать за пределы application/, если они начинаются с / (они не могут быть исправлены прокси, потому что, например, запрос /img/abc неоднозначен без контекста: application/img/abc или действительно /img/abc). Не можете ли вы исправить приложение, чтобы оно использовало только относительные ссылки?   -  person eudoxos    schedule 24.09.2011
comment
Думал, что я ответил на это ...: S Рассматриваемые приложения не основаны на каталогах (приложения-демоны, которые прослушивают свой собственный порт) и не ссылаются ни на что за пределами своих соответствующих корневых каталогов. Я попытался исправить все абсолютные URI в одном приложении (инструменты пути), но это просто убило приложение. Это также потребовало много работы, и ее нужно было бы повторить, если обновление заменит что-либо важное (некоторые из которых могут быть распространены как двоичные и, следовательно, будут недоступны для редактирования; без сомнения, почему это приложение сломалось). Да то :)   -  person Alex Leach    schedule 26.09.2011


Ответы (1)


Использование 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, обращайте внимание на эти завершающие косые черты при обращении к каталогам.

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

person Alexander Janssen    schedule 24.09.2011
comment
Похоже, это могло сработать. Та! На самом деле, сегодня утром смотрел на mod_proxy, чтобы узнать об автоматическом проксировании моей домашней сети через uni ... Это полностью отличается от этой функциональности. Дам вам знать, как я поживаю. Ваше здоровье! Алекс - person Alex Leach; 26.09.2011
comment
Кажется, это отбрасывает запросы параметров предварительной проверки - person Natus Drew; 27.02.2015
comment
@nathan Для этого вам может понадобиться mod_rewrite соус; Я никогда не сталкивался с этой ошибкой, но быстрый поиск показал эту ссылку: songbard.wordpress.com/2011/05/27/ - не уверен, поможет ли это, но обратная связь приветствуется. YMMV. - person Alexander Janssen; 27.02.2015
comment
ProxyRequests on кажется опасной ошибкой: http://httpd.apache.org/docs/current/mod/mod_proxy.html#proxyrequests - person BrunoJCM; 25.10.2016