Apache VirtualHost Front 和 API 相同的域名

Apache VirtualHost Front 和 API 相同的域名

我有一个多租户应用程序,使用 *.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 中找到匹配。

相关内容