订购 ProxyPass 指令

订购 ProxyPass 指令

我在端口 3000 上有一个 node-react 应用程序,在端口 3001 (localhost:3001/api) 上运行有一个 node/express API。我需要在 Apache 中设置一个反向代理,以便将 React 应用程序https://example.domain.com/和 API 放在 上https://example.domain.com/api

这能行吗?

<VirtualHost *:443>
    ServerName example.domain.com
    [SSL Configuration]

    ProxyPreserveHost On
    ProxyPass "/" "http://localhost:3000"

    ProxyPreserveHost On
    ProxyPass "/api" "http://localhost:3001/api"

</VirtualHost>

如果那不起作用,什么会起作用?还有其他<VirtualHost>列表吗?

答案1

风险管理即服务

文档https://httpd.apache.org/docs/2.4/mod/mod_proxy.html#proxypass提供两种选择:


方案一:

订购 ProxyPass 指令

按照配置的顺序检查配置ProxyPass和规则。ProxyPassMatch第一个匹配的规则获胜。因此,通常您应该首先从最长的 URL 开始对冲突的 ProxyPass 规则进行排序。否则,较长 URL 的后续规则将被任何使用 URL 前导子字符串的早期规则隐藏。请注意,这与工作者共享存在一些关系。

换句话说,顺序很重要,您的 ProxyPass 指令应按以下顺序排列:

<VirtualHost *:443>
    ServerName example.domain.com

    ProxyPass "/api" "http://localhost:3001/api"
    ProxyPassReverse "/api" "http://localhost:3001/api"

    ProxyPass "/" "http://localhost:3000"
    ...

</VirtualHost>

方案 2:

<Location>在s中对 ProxyPass 指令进行排序

一个 Location 块中只能放置一个 ProxyPass 指令,并且最具体的位置将优先。

换句话说,当使用Location块语法时,顺序并不重要,并且当您切换两个位置块时效果应该相同:

<VirtualHost *:443>
    ServerName example.domain.com

    <Location "/">
       ProxyPass  "http://localhost:3000"
       ProxyPassReverse  "http://localhost:3000"
    </Location>

    <Location "/api">
       ProxyPass  "http://localhost:3001/api"
       ProxyPassReverse  "http://localhost:3001/api"
    </Location>
</VirtualHost

相关内容