我正在尝试向我的 apache 配置中添加第二个虚拟主机,但似乎无法使用新的虚拟主机。
我的httpd.conf
只包含以下行:
ServerName radiofreebrighton.org.uk
我还有一个ports.conf
文件,其中包含以下内容:
NameVirtualHost *:80
Listen 80
<IfModule mod_ssl.c>
Listen 443
</IfModule>
我有两个文件,sites-available
其中被sites-enabled
符号链接到a2ensite
:
- radiofreebrighton.org.uk
- trafalgararches.co.uk
第一个内容是:
<VirtualHost _default_:80>
DocumentRoot /home/tom/www
ServerAdmin [email protected]
ServerName radiofreebrighton.org.uk
ServerAlias www.radiofreebrighton.org.uk
<Directory /home/tom/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
LogLevel error
CustomLog /var/log/apache2/access.log combined
Alias /wiki /home/tom/www/mediawiki/index.php
</VirtualHost>
后者的内容为:
<VirtualHost *:80>
DocumentRoot /home/tom/tata-www
ServerAdmin [email protected]
ServerName trafalgararches.co.uk
ServerAlias www.trafalgararches.co.uk
<Directory /home/tom/tata-www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
logLevel error
ErrorLog /var/log/apache2/error.log
</VirtualHost>
但每次我请求 trafalgararches.co.uk 的页面时,我都会得到来自 radiofreebrighton.org.uk 的页面。为什么会发生这种情况?我该如何修复它?
编辑:
apache 理解的虚拟主机配置:
tom@rfb:/usr/local$ apache2ctl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80 is a NameVirtualHost
default server radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
port 80 namevhost radiofreebrighton.org.uk (/etc/apache2/sites-enabled/radiofreebrighton.org.uk:1)
port 80 namevhost trafalgararches.co.uk (/etc/apache2/sites-enabled/trafalgararches.co.uk:1)
Syntax OK
(摘自apache2ctl -S
aka httpd -S
。)
答案1
这可能是显而易见的,但是不要忘记重新启动 apache 服务启用附加虚拟主机后。
在为第二个虚拟主机执行之后a2ensite
,输出apache2ctl -S
反映两个站点都已配置(其中一个是默认站点),但直到重新加载 apache 后它才会生效。
假设您有两个虚拟主机 - site1 和 site2。您运行a2ensite site1
并重新加载 apache 服务。现在您可以访问http://site1
并且它是默认的。现在您运行a2ensite site2
,但忘记重新启动 apache。输出将apache2ctl -S
是:
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:80 is a NameVirtualHost
default server site1 (/etc/apache2/sites-enabled/site1:1)
port 80 namevhost site1 (/etc/apache2/sites-enabled/site1:1)
port 80 namevhost site2 (/etc/apache2/sites-enabled/site2:1)
Syntax OK
但是当您尝试加载时http://site2
,它实际上会加载默认站点(site1),因为配置未加载。
答案2
我遇到了类似的问题,端口 443 (SSL/HTTPS) 上的附加虚拟主机都被定向到列出的第一个虚拟主机的目录。Apache 本质上忽略了服务器名称属性,只匹配 ip:port。
事实证明,我缺少命令“NameVirtualHost *:443”来为端口 443 启用命名虚拟主机。
'NameVirtualHost *:443' 只需调用一次,并且必须在端口 443 的虚拟主机上方定义。我将我的定义放在 ports.config 文件中,因此它看起来像:
NameVirtualHost *:80
Listen 80
<IfModule mod_ssl.c>
NameVirtualHost *:443
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
NameVirtualHost *:443
Listen 443
</IfModule>
不要忘记在进行任何更改后重新启动 apache。
答案3
我的意见:因为我必须坚持使用一个 IP(我不希望网站在所有安装的网络上提供服务),所以在服务器的本地私有 IP 发生变化后,我忘记在这里更改它了:
NameVirtualHost 192.168.100.20:80 <VirtualHost 192.168.100.20:80>
当然,让你知道IP在本地不存在并不是Apache的问题。
答案4
我发现该问题的根源是我的服务器上的 /etc/hosts 条目,其中的 URL 指向服务器的外部 IP。
有一次我必须在 DNS 准备好之前进行设置,所以我在服务器上输入了一个指向其自己的外部 IP 的 /etc/hosts 条目:
1.2.3.4 vhost.example.com
然后我为现有网站“vhost.example.com”设置了一个 ServerAlias
但无论我做什么,都无法阻止 Apache 为 vhost.example.com 的 SSL 请求提供 default-ssl.conf 站点。端口 80 HTTP 工作正常,但 SSL 总是显示默认站点。最后,这个 SO 线程让我尝试“apachectl -S”,它显示了站点,最后我终于搞清楚了。
因此,如果您访问的是默认 SSL 站点,而不是您期望的站点,请确保您没有在 /etc/hosts 条目中添加服务器的外部 IP 地址!事后看来,这是一件很奇怪的事情,但希望这能帮助别人!