Мне нужно создать файл conf для веб-сервера Apache (Linux), который будет действовать как прокси для нескольких backend-сервисов одного и того же сервера. Каждый backend-сервис работает как systemd-сервис на отдельных портах.
Файл конфигурации содержит следующее
<VirtualHost: *:80>
ProxyPass /api/policies/??? http://127.0.0.1:6001/
ProxyPassReverse /api/policies/??? http://127.0.0.1:6001/
ProxyPass /api/policies/???/coverages http://127.0.0.1:6002/
ProxyPassReverse /api/policies/???/coverages http://127.0.0.1:6002/
ProxyPass /api/policies/???/premiums http://127.0.0.1:6003/
ProxyPassReverse /api/policies/???/coverages http://127.0.0.1:6003/
</VirtualHost>
??? – относится к параметру запроса, который будет частью URL-адреса. Как это определить в конфигурации? Какое выражение нужно использовать
решение1
Возможны несколько подходов.
Заключите директивы ProxyPass в правильном порядке
LocationMatch
директивы; что-то вроде<LocationMatch "/api/policies/(.*)/coverages"> ProxyPass http://127.0.0.1:6002/ # ... </LocationMatch> <LocationMatch "/api/policies/(.*)/premiums"> ProxyPass http://127.0.0.1:6003/ # ... </LocationMatch> <Location "/api/policies/"> ProxyPass http://127.0.0.1:6001/ # ... </Location>
Используйте mod_rewriteобратный проксиtarget
[P]
вместо директив ProxyPass, чтобы разрешить сопоставление с образцом.RewriteRule "^/api/policies/(.*)/coverages/(.*)" "http://127.0.0.1:6002/" [P] RewriteRule "^/api/policies/(.*)/premiums/(.*)" "http://127.0.0.1:6003/" [P]