我需要为 apache web 服务器 (Linux) 创建一个 conf 文件,它将充当同一服务器上多个后端服务的代理。每个后端服务都作为 systemd 服务在单独的端口上运行。
conf 文件包含以下内容
<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 的一部分。如何在 conf 中定义它?需要使用哪种表达式
答案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反向代理目标
[P]
而不是 ProxyPass 指令来允许模式匹配。RewriteRule "^/api/policies/(.*)/coverages/(.*)" "http://127.0.0.1:6002/" [P] RewriteRule "^/api/policies/(.*)/premiums/(.*)" "http://127.0.0.1:6003/" [P]