Я не знаю, как спросить или описать словами, что я пытаюсь сделать, и можно ли это сделать таким образом, поэтому я решил нарисовать диаграмму. Надеюсь, это довольно понятно:
Я знаю, что могу использовать все именованные виртуальные хосты на 80-м порту, но могу ли я разместить их на разных портах и заставить сервер определять, какой именованный хост какой и на каком порту они находятся?
<VirtualHost _default_:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/foo-1.com
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/foo-1.com/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
<VirtualHost _default_:80>
DocumentRoot /var/www/foo-2.com
ServerName foo-2.com
<Directory "/var/www/foo-2.com">
allow from all
Options -Indexes
</Directory>
</VirtualHost>
При первом чтении вашего сценария мой первый ответ был: зачем вам делать это так же, как и другие, но с Apache или PHP что-то подобное возможно. Было бы намного лучше, если бы виртуальные хосты работали должным образом на 80-м порту, поскольку именно этого ожидают посетители веб-сайта, но это мое мнение.
Чтобы сделать то, что вы хотите выполнить, есть два варианта, и вы должны быть уверены, что должно произойти перенаправление HTTP. Ни в коем случае.
Ваш первый вариант - использовать для этого PHP примерно так ...
Apache также поддерживает возможность перезаписи, и вы можете организовать это для каждого сайта следующим образом
# First host rewrite
RewriteCond %{HTTP_HOST} ^www.\foo-1\.com$ [NC]
RewriteRule ^(.*)$ http://www.foo-1.com:8080/$1 [L,R=301]
# Second host rewrite
RewriteCond %{HTTP_HOST} ^www.\foo-2\.com$ [NC]
RewriteRule ^(.*)$ http://www.foo-2.com:8081/$1 [L,R=301]
Однако, если вы собираетесь перейти на этот уровень с условиями перезаписи, может быть проще определить VHOSTS в Apache и заставить его правильно работать на вашем сервере.
Иметь два виртуальные хосты на основе имен работая с одним и тем же IP-адресом, попробуйте что-нибудь вроде этого
NameVirtualHost *:80
<VirtualHost _*:80>
ServerAdmin webmaster@localhost
ServerName foo-1.com
ServerAlias www.foo1.com
DocumentRoot /var/www/foo-1.com
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/foo-1.com/>
Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot /var/www/foo-2.com
ServerName foo-2.com
ServerAlias www.foo-2.com
<Directory "/var/www/foo-2.com">
allow from all
Options -Indexes
</Directory>
</VirtualHost>
Обратите внимание, что у каждого виртуального хоста есть Название сервера и ServerAlias