Регулярное Выражение 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 3

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>