我不确定如何询问或用文字描述我想做的事情,或者是否可以这样做,所以我决定画一张图。希望它相当清晰易懂:
我知道我可以在端口 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>
答案1
拥有两个基于名称的虚拟主机在同一个 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>
答案2
第一次阅读您的方案时,我的第一反应是,为什么您要像其他人一样这样做,但使用 Apache 或 PHP 可以实现这样的效果。您最好让虚拟主机在端口 80 上正常工作,因为这是网站访问者所期望的,但这只是我的观点。
要完成您想要完成的任务,有两个选项,并且您必须确信 HTTP 重定向会发生。没有其他办法。
您的第一个选择是使用 PHP 来实现这一点,如下所示...
- 您的主 Apache 站点将使用 PHP 覆盖所有默认站点请求
- PHP 将读取标头,查看 URL,并将重定向传回浏览器
- 然后浏览器会重定向到正确的 URL
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]
但是,如果您要使用重写条件进入此级别,则可能更容易找出 Apache 中的 VHOSTS 并使其在您的服务器上正常运行。