如何为 apache ProxyPassMatch 编写正则表达式以反向代理 API 调用

Dre*_*ord 3 regex apache

我有一个 angular 4 Web 应用程序,它托管在 apache 2.4 上。该应用程序使用在 express 上运行的 nodejs javascript 中编写的 API。网站和 API 服务都在同一台机器上运行,但在不同的端口上。该网站在端口 80 上,API 服务在端口 9000 上侦听。

我想设置 apache 为所有 API 调用做反向代理。

例如,任何包含 /api/ 的 url 我希望它由 apache 重写以指向 API url:port。如果我像下面这样使用 ProxyPass,重定向工作正常:

ProxyPass        "/api/V1/systeminfo" "http://localhost:9000/api/V1/systeminfo"
ProxyPassReverse "/api/V1/systeminfo" "http://localhost:9000/api/V1/systeminfo"
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么做,是使用 ProxyPassMatch 指令并创建一个正则表达式,以便将包含 /api/ 的任何 url 重定向到http://localhost:9000/api/ .....

我尝试了以下但它不起作用:

ProxyPassMatch    "^/api.*$" "http://localhost:9000/$1"
ProxyPassReverse  "^/api.*$" "http://localhost:9000/$1"
Run Code Online (Sandbox Code Playgroud)

以下情况也没有:

ProxyPassMatch    "^/.*?/api.*?/v[0-9]+/(.*)$" "http://localhost:9000/$1"
ProxyPassReverse  "^/.*?/api.*?/v[0-9]+/(.*)$" "http://localhost:9000/$1"
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激。我的正则表达式技能缺乏!

注意:显然 'localhost' 可以是 IP 地址或域,为了简单起见,我在示例中使用它。

非常感谢!

编辑:根据亚历克斯的评论,我更正了第一个示例以使用 .* 而不是 * 。

Dre*_*ord 11

我解决了这个问题。在上述示例中使用 apache 进行反向代理的正确方法如下:

ProxyPassMatch    "/api(.*)" "http://localhost:9000/api$1"
ProxyPassReverse  "/api(.*)" "http://localhost:9000/api$1"
Run Code Online (Sandbox Code Playgroud)

我知道我尝试的多个正则表达式示例是正确的,因为我正在使用https://regex101.com/测试它们,但是我将第二部分硬编码到特定路线以消除第二部分的问题不正确,但由于某种原因它不喜欢那样。一旦我了解到正则表达式的 (.*) 部分是第一个捕获组,并将其用作第二部分中的 $1,一切都奏效了。

我希望我足够澄清答案,并且对其他人有用。