2014-02-04 4 views
9

Я настраиваю сервер Apache 2.4.6 на внутренней машине для тестирования. Одна из вещей, которые должен делать сервер Apache, - действовать как обратный прокси для другого сервера, найденного на localhost: 3030.Как можно комбинировать LocationMatch и ProxyPassMatch?

Сервер на localhost: 3030 ожидает, что один из нескольких имен наборов данных на своем первом уровне пути (на данный момент набор содержит только набор данных experimental, но позже будет добавлен еще один), поэтому я пытаюсь передать это через запрошенный путь.

В моем виртуальном хосте, это работает:

<Location /experimental/> 
    ProxyPass http://localhost:3030/experimental/ 
    ProxyPassReverse/
</Location> 

Для дополнительных наборов данных, я мог бы скопировать, что и заменить experimental с другими именами наборов данных. Очевидно, что это приводит к большому дублированию кода/избыточности, что является одновременно источником ошибок и ужасом обслуживания.

Поэтому я хотел бы стать несколько более гибким и обработать несколько наборов данных в одном таком блоке. Это должно быть возможно с помощью LocationMatch directive.

Как указано this comment и this page, мне нужно заменить ProxyPassProxyPassMatch при использовании, что внутри LocationMatch блока. По существу, docs состояние такой же:

То же самое будет происходить внутри секции LocationMatch, однако ProxyPass не интерпретирует регулярное выражение как таковое, поэтому необходимо использовать ProxyPassMatch в этой ситуации вместо этого.

LocationMatch docs объяснить:

С 2.4.8 года, названные группы и обратные_связи захватываются и записываются в среде с соответствующим именем, начинающимся с «MATCH_» и в верхнем регистре. Это позволяет ссылаться на элементы URL-адресов из выражений и модулей, таких как mod_rewrite. Чтобы предотвратить путаницу, пронумерованные (неназванные) обратные ссылки игнорируются. Вместо этого используйте именованные группы.

Эта информация действительна только в Apache 2.4.8, которая presumeably почему следующее не работает на моем 2.4.6 установки:

<LocationMatch /(?<dataset>experimental)/> 
    ProxyPassMatch http://localhost:3030/%{env:MATCH_DATASET}/ 
    ProxyPassReverse/
</LocationMatch> 

С другой стороны, this page и that posting подразумевают который может быть использован индекс численной группы ($1) (как текст справки действует только по HTTPD 2.4.8, мой подозрения/надежда является то, что числовыми ссылками на работы, прежде чем 2.4.8 (?)

В любом случае, я попытался это:

<LocationMatch "/(experimental)/"> 
    ProxyPassMatch http://localhost:3030/$1/ 
    ProxyPassReverse/
</LocationMatch> 

еще согласно журналам, внутренний вызов вызывает http://localhost:3030/$1/ вместо http://localhost:3030/experimental/ при запросе experimental путь на ВХост URL.

ProxyPassMatch docs только сказать:

При использовании внутри секции LocationMatch, первый аргумент опущен, и регулярное выражение получается из LocationMatch.

Однако текст не удосужились привести пример того, как совместить LocationMatch и ProxyPassMatch. Что я делаю неправильно?

+0

Нумерованные обратные ссылки игнорируются с помощью '' 'LocationMatch''':' '' Во избежание путаницы нумерованные (неназванные) обратные ссылки игнорируются. Вместо этого используйте именованные группы. '' 'Http://httpd.apache.org/docs/current/mod/core.html#locationmatch –

+0

Фактически эта ошибка может быть более актуальной для вашего вопроса: https://issues.apache.org /bugzilla/show_bug.cgi?id=50048 –

ответ

0

Получил эту работу на Apache 2.4.29:

<LocationMatch "/fruit/(?:apple|banana|pear)"> 
    ProxyPass  http://localhost:8080 
    ProxyPassReverse http://localhost:8080 
</LocationMatch> 

URL-адрес называют Apache, например,

http://localhost:8080/fruit/apple 

The (?: имеет решающее значение при использовании скобок в этом примере.