我有一个多租户应用程序,使用 *.localhost 模式的子域名进行解析。该应用程序的前端可通过 http://localhost:3000/ 访问。
为了实现所需的功能,我需要将所有不包含 /api 路径段的请求代理到前端 URL,而包含 /api 路径段的请求应路由到后端 API。
例如:
- tenant1.localhost 应该代理到前端。
- tenant1.localhost/api 应该代理到后端 API。
我尝试使用以下设置来配置 Apache 服务器:
<VirtualHost *:80>
ServerName localhost
ServerAlias *.localhost
RewriteEngine On
RewriteCond %{HTTP_HOST} ^([^.]+)\.localhost$
RewriteRule ^/api(/.*)?$ http://%1.localhost/api$1 [P]
# Exclude phpMyAdmin from being proxied
ProxyPass /phpmyadmin !
# Serve http://localhost:3000/ for all other requests
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot "C:/Users/api/public"
ServerName api.localhost
ServerAlias *.localhost/api
<Directory "C:/Users/api/public">
Options All
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
然而,这种配置并未按预期发挥作用。
答案1
在第一个虚拟主机中您有:
ServerName localhost
ServerAlias *.localhost
它基本上与 localhost 和任何直接子域匹配,因此第二个 Virtualhost 将不会接收任何请求,因为 httpd 已经在第一个 VirtualHost 中找到匹配。