仅代理本地主机的子域名

仅代理本地主机的子域名

我正在尝试弄清楚如何将对 localhost 子域的请求代理到 Apache 上的另一个端口,而不是仅将请求代理到 localhost(没有子域)。我无法让它工作。以下是我目前想到的办法。

<VirtualHost *:80>
  ServerName subdomain1.localhost
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
  ServerName subdomain2.localhost
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
  NoProxy "localhost"
</VirtualHost>

子域 1 和子域 2 到 localhost:3000 的代理可以正常工作,但 localhost 也代理到 localhost:3000。我该如何防止这种情况发生?

编辑

在@Esa 和 @HBruijn 的帮助下,我仍然无法让它工作。我已将虚拟主机 http.conf 编辑为以下内容。别名可以工作,但现在子域不起作用。

<VirtualHost *:80>
    ServerName localhost
    Alias /alias1 "/alias1"
    Alias /alias2 "/alias2"
    Alias /alias3 "/alias3"
</VirtualHost>

<VirtualHost *:80>
  ServerName subdomain1.localhost
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
</VirtualHost>

<VirtualHost *:80>
  ServerName subdomain2.localhost
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
</VirtualHost>

答案1

最简单的方法是简单地创建单独的 VirtualHost 条目,每个条目都具有该(子)域的正确设置:

<VirtualHost *:80>
  ServerName localhost
  DocumentRoot /var/www/html
  ...
</VirtualHost>
<VirtualHost *:80>
  ServerName subdomain1.localhost
#   Possibly a single VirtualHost for all subdomains with a catch-all ServerAlias:
#   ServerAlias *.localhost
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
</VirtualHost>
<VirtualHost *:80>
  ServerName subdomain2.localhost
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
</VirtualHost>

答案2

这不是ServerName指示作品。请参阅:

ServerName指令可以出现在服务器定义中的任何位置。但是,每次出现都会覆盖前一次出现(在该服务器内)。

如果没有ServerName指定,服务器将尝试通过首先向操作系统询问系统主机名来推断客户端可见的主机名,如果失败,则对系统上存在的 IP 地址执行反向查找。

如果未在 中指定端口ServerName,则服务器将使用传入请求的端口。为了获得最佳可靠性和可预测性,您应该使用 ServerName 指令指定明确的主机名和端口。

你不能ServerName在同一个VirtualHost,因此首先需要分离:

<VirtualHost *:80>
  ServerName subdomain1.localhost
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
</VirtualHost>

<VirtualHost *:80>
  ServerName subdomain2.localhost
  ProxyPass / http://localhost:3000/
  ProxyPassReverse / http://localhost:3000/
</VirtualHost>

然后,为了让它localhost:80执行除回退到默认配置(VirtualHost当前是同一端口中的第一个subdomain1.localhost)以外的其他操作,您需要拥有自己的<VirtualHost> 部分容器可以添加这个。多于以前的:

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /var/www/html
</VirtualHost>

此外,你的Aliases 具有相同[URL-path]file-path|directory-path没有任何意义,但我认为右侧有一些真实的文件系统位置。

相关内容