Назад | Перейти на главную страницу

Проксирование только поддоменов localhost

Я пытаюсь выяснить, как прокси-запросы к поддоменам 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>

Проксирование subdomain1 и subdomain2 на 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>

Это не так 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>

Кроме того, ваш Aliasимеют идентичные [URL-path] и file-path|directory-path не имело никакого смысла, но я полагаю, что с правой стороны было несколько реальных местоположений файловой системы.

Самый простой - просто создать отдельные записи 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>