Регулярное Выражение LocationMatch Apache
Моя Проблема
Мне нужен Apache HTTP Server (v2.4.10) прокси-запросы к Tomcat для динамических приложений, которые не только не соответствуют пути в Tomcat, но и имеют аналогичные пути друг к другу. Например:
/products/<category>/<sub-category>/<sub-sub-category>/<product-id>.html
доверенное лицо: http://mycluster/pf/<product-id>.html
...а также...
/products/<category>/<sub-category>/<sub-sub-category>/<anything-not-ending-in-html>
доверенное лицо: http://mycluster/search/<anything-not-ending-in-html>
Мои Попытки
Я пытаюсь использовать регулярное выражение LocationMatch, чтобы справиться с этим, но не совсем успешно. То следующее регулярное выражение LocationMatch работает само по себе (прокси-запрос *.html
к <tomcat>/pf/*.html
):
<LocationMatch ^/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)/(?<partnum>.+).html>
ProxyPass balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
ProxyPassReverse balancer://mycluster/pf/%{env:MATCH_PARTNUM}.html
</LocationMatch>
Это передает URL-адреса, используя следующий пример пути: /products/aaa/bbb/ccc/ddd3456.html
(который является правильным)
Однако, когда я также включаю регулярное выражение ниже:
<LocationMatch ^(?!.*.html$)/products/(?<cat>.+)/(?<subcat>.+)/(?<subsubcat>.+)((/?)|(./*))$>
ProxyPass balancer://mycluster/search/
ProxyPassReverse balancer://mycluster/search/
</LocationMatch>
Попытка доступа к /products/aaa/bbb/ccc/
приводит к 404 странице.
Здесь я ожидаю любых запросов к " / products/aaa / bbb/ccc/", которые не заканчиваются.html, который будет передан в /search/ (включая любую последующую информацию о Пути, которая будет включена: например .../ поиск / сравнение )
Мой Вопрос
Я никак не могу понять, в чем дело. Согласно Rubular поставляемое регулярное выражение верно:Чего мне здесь не хватает?
Я был бы признателен за любые советы по решению этой проблемы!1 ответ:
Похоже, что регулярное выражение немного слишком допускает - область
.+
в cat/subcat/subsubcat должна быть немного ограничена. Также есть небольшая ошибка в конечном выражении("./*")
, это должно быть("/.*")
:Рабочий LocationMatch:
<LocationMatch ^(?!.*\.html$)/products/(?<cat>([A-Za-z0-9\-\_])+)/(?<subcat>([A-Za-z0-9\-\_])+)/(?<subsubcat>([A-Za-z0-9\-\_])+)((/?)|(/.*))$> ProxyPass balancer://mycluster/search/ ProxyPassReverse balancer://mycluster/search/ </LocationMatch>