我在端口 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